Quiero extraer todas las filas de aquí ignorando los encabezados de columna, así como todos los encabezados de página, es decir,Supported Devices.

pdftotext -layout DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - \
 | sed '$d'                                                  \
 | sed -r 's/+/,/g; s///g'                                 \
 > output.csv

El archivo resultante debe ser en hoja de cálculo CSV (formato de valores separados por comas campos).

En otras palabras, quiero mejorar el comando de arriba, de modo que la salida no frena en absoluto. Alguna idea?

  • pdftotext -layout DAC06E7D1302B790429AF6E84696FCFAB20B.pdf -|grep -vE '(Supported Devices)|^$'|...
  • Si sólo fuera tan fácil, @dwarring ! — 🙂
  • esta herramienta trabajado para mí, en primer lugar el 20 de páginas: pdftables.com
InformationsquelleAutor user706838 | 2015-05-18

5 Comentarios

  1. 21

    Voy a ofrecer otra solución.

    Mientras que en este caso la pdftotext método funciona con un esfuerzo razonable, puede haber casos en que no todas las páginas tienen el mismo ancho de la columna (como su benignos PDF de muestra).

    Aquí el no tan conocido, pero bastante fresco Libres y de código Abierto de Software Tabula-Extractor es la mejor opción.

    Yo mismo estoy utilizando el directo de GitHub checkout:

    $ cd $HOME ; mkdir svn-stuff ; cd svn-stuff
    $ git clone https://github.com/tabulapdf/tabula-extractor.git git.tabula-extractor
    

    Que yo misma escribí un bonito contenedor simple script como este:

    $ cat ~/bin/tabulaextr
    
     #!/bin/bash
     cd ${HOME}/svn-stuff/git.tabula-extractor/bin
     ./tabula [email protected]
    

    Desde ~/bin/ es en mi $PATH, acabo de ejecutar

    $ tabulaextr --pages all                                 \
             $(pwd)/DAC06E7D1302B790429AF6E84696FCFAB20B.pdf \
            | tee my.csv
    

    para extraer todas las tablas de todas las páginas y convertirlos en un solo archivo CSV.

    De los primeros diez (de un total de 8727), las líneas de la CVS este aspecto:

    $ head DAC06E7D1302B790429AF6E84696FCFAB20B.csv 
    
     Retail Branding,Marketing Name,Device,Model
     "","",AD681H,Smartfren Andromax AD681H
     "","",FJL21,FJL21
     "","",Luno,Luno
     "","",T31,Panasonic T31
     "","",hws7721g,MediaPad 7 Youth 2
     3Q,OC1020A,OC1020A,OC1020A
     7Eleven,IN265,IN265,IN265
     A.O.I. ELECTRONICS FACTORY,A.O.I.,TR10CS1_11,TR10CS1
     AG Mobile,Status,Status,Status
    

    que en el PDF original este aspecto:

    Cómo extraer los datos de la tabla de PDF como archivo CSV desde la línea de comandos?

    Incluso llegó a estas líneas en la última página, 293, derecho:

     nabi,"nabi Big Tab HD\xe2\x84\xa2 20""",DMTAB-NV20A,DMTAB-NV20A
     nabi,"nabi Big Tab HD\xe2\x84\xa2 24""",DMTAB-NV24A,DMTAB-NV24A
    

    que mirar en la página del PDF como este:

    Cómo extraer los datos de la tabla de PDF como archivo CSV desde la línea de comandos?

    TabulaPDF y Tabula-Extractor son muy, muy fresco para trabajos como este!


    Actualización

    Aquí es un ASCiinema screencast (que también puede descargar y volver a jugar de forma local en tu Linux/MacOSX/Unix terminal con la ayuda de la asciinema herramienta de línea de comandos), protagonizada por tabula-extractor:

    Cómo extraer los datos de la tabla de PDF como archivo CSV desde la línea de comandos?

  2. 5

    Lo que desea es bastante fácil, pero usted está teniendo un problema (no estoy seguro de que eres consciente de ello…).

    Primer lugar, se debe agregar -nopgbrk para («No hay saltos de página, por favor!») a su comando. Debido a que estos molestos ^L personajes que de otro modo aparecen en la salida, no necesitan ser filtrados más tarde.

    La adición de un grep -vE '(Supported Devices|^$)' luego filtrar todas las líneas que usted no desea, incluyendo líneas vacías, o líneas con sólo espacios:

    pdftotext -layout -nopgbrk                           \
       DAC06E7D1302B790429AF6E84696FCFAB20B.pdf -        \
     | grep -vE '(Supported Devices|^$|Marketing Name)'  \
     | gsed '$d'                                         \
     | gsed -r 's# +#,#g'                                \
     | gsed '# ##g'                                      \
     > output2.csv
    

    Sin embargo, su otro problema es este:

    1. Algunos de los campos de la tabla está vacía.
    2. Campos vacíos aparecen con el -layout opción como una serie de caracteres de espacio, a veces incluso dos en la misma fila.
    3. Sin embargo, las columnas de texto no están espaciados de forma idéntica de página a página.
    4. Para ello usted no sabe de línea a línea cuántos espacios necesitan considerar como un «vacío campo CSV» (donde se iba a necesitar un extra de , separador).
    5. Como consecuencia, en el actual código mostrará sólo una, dos o tres (en lugar de cuatro) de los campos de algunas líneas, y estos campos terminan en el mal columnas!

    Hay una solución para esto:

    1. Agregar el -x ... -y ... -W ... -H ... parámetros para pdftotext para recortar los PDF de modo de columna.
    2. A continuación, agregue las columnas con una combinación de servicios como paste y column.

    El siguiente comando extrae la primera de las columnas:

    pdftotext -layout -x  38 -y 77 -W 176 -H 500  \
              DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - > 1st-columns.txt
    

    Estos son de segunda, tercera y cuarta columnas:

    pdftotext -layout -x 214 -y 77 -W 176 -H 500  \
              DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - > 2nd-columns.txt
    
    pdftotext -layout -x 390 -y 77 -W 176 -H 500  \
              DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - > 3rd-columns.txt
    
    pdftotext -layout -x 567 -y 77 -W 176 -H 500  \
              DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - > 4th-columns.txt
    

    Por CIERTO, he engañado un poco: con el fin de obtener una idea acerca de lo que valores a utilizar para -x, -y, -W y -H hice primero de ejecutar este comando con el fin de encontrar las coordenadas exactas de la cabecera de la columna palabras:

    pdftotext -f 1 -l 1 -layout -bbox \
              DAC06E7D1302B790429AF6E84696FCFAB20B.pdf - | head -n 10
    

    Siempre es bueno si se sabe leer y hacer uso de pdftotext -h. 🙂

    De todos modos, cómo anexar los cuatro archivos de texto como las columnas de al lado, con la adecuada CVS separador en el medio, usted debe encontrar fuera de ti mismo. O hacer una nueva pregunta 🙂

    • Kurt Pfeifle: ¿Cómo se miden las coordenadas x e y a partir de la bbox comando? Im medición dentro de un pdf viever y obtener el valor de X y Y, 50 y 100, respectivamente
    • El pdftotext comando necesidades PostScript puntos como unidades de distancia. ¿Su visor de PDF (que?!) mostrar PostScript puntos? No recuerdo exactamente cómo me determinaron los parámetros para los comandos anteriores. Fue hace más de 3 años. Si tuviera que hacerlo de nuevo hoy, yo uso la Ghostscript con 'gs -sDEVICE=bbox' para determinar el cuadro delimitador de la página completa, a continuación, estimar los respectivos parámetros para cada columna, a continuación, ajustar y/o modificar en función de los primeros resultados….
    • Estoy usando el Evince y Atril
    • Lamento molestar, sé que esta pregunta es de hace un tiempo. Acabo enfrentado varias veces este tema, y he conseguido solucionarlo de alguna manera, pero estoy buscando una mayor estabilidad de enfoque. Gracias por las buenas ideas que hicieron aquí.
  3. 1

    Esto se puede hacer fácilmente con un IntelliGet (http://akribiatech.com/intelliget) secuencia de comandos de la siguiente

    userVariables = brand, name, device, model;
    { start = Not(Or(Or(IsSubstring("Supported Devices",Line(0)),
                      IsSubstring("Retail Branding",Line(0))),
                    IsEqual(Length(Trim(Line(0))),0))); 
      brand = Trim(Substring(Line(0),10,44));
      name = Trim(Substring(Line(0),45,79));
      device = Trim(Substring(Line(0),80,114));
      model = Trim(Substring(Line(0),115,200));
      output = Concat(brand, ",", name, ",", device, ",", model);
    }
    
  4. 0

    Para el caso en el que desea extraer los datos tabulares de PDF que puede controlar en tiempo de creación (para los partes de horas de los contratos de sus empleados deben firmar), la siguiente solución será más limpio:

    1. Crear un formulario PDF con un campo de Id.

    2. Dejar que la gente se llene y guarde el archivo en PDF de los formularios.

    3. Utilizar un Apache PDFBox, una herramienta de código abierto que permite extraer datos de un formulario a partir de un PDF. Se incluye un ejemplo de línea de comando herramienta de PrintFields que se llamaría de la siguiente manera para imprimir el campo deseado de la información:

      org.apache.pdfbox.examples.interactive.form.PrintFields file.pdf
      

      Para otras opciones, consulte esta pregunta.

    Como una alternativa a la anterior de flujo de trabajo, tal vez usted podría también utilizar una firma digital servicio web que permite a PDF llenado de la solicitud y la exportación de los datos a las tablas. Como SignRequest, que permite a crear plantillas y más tarde exportar los datos de los documentos firmados. (No afiliados, acabo de encontrar esto por mí mismo.)

Dejar respuesta

Please enter your comment!
Please enter your name here