web-dev-qa-db-fra.com

PDF Scraping de données et de tableaux vers Excel

J'essaie de trouver un bon moyen d'augmenter la productivité de mon travail de saisie de données.

Ce que je cherche à faire est de trouver un moyen de gratter les données d'un PDF et de les saisir dans Excel.

Plus précisément, les données avec lesquelles je travaille proviennent de circulaires d'épicerie. Dans l'état actuel des choses, nous devons saisir manuellement chaque transaction dans le dépliant dans une base de données. Un exemple de flyer est http://weeklyspecials.safeway.com/customer_Frame.jsp?drpStoreID=1551

Ce que j'espère faire, c'est avoir des colonnes pour les produits, le prix et les options prédéfinies (cartes de fidélité, coupons, sélection de variétés ... ce genre de choses).

Toute aide serait appréciée, et si j'ai besoin d'être plus précis, faites-le moi savoir.

12
Casey Saunders

Après avoir regardé le PDF lié par l'OP, je dois dire que ce n'est pas tout à fait afficher un format de tableau typique.

Il contient de nombreuses images à l'intérieur des "cellules", mais les cellules ne sont pas toutes strictement alignées verticalement ou horizontalement:

Page 6 from the PDF linked in the OP

Donc ce n'est même pas une table 'Nice', mais une table extrêmement laide et maladroite avec laquelle travailler ...


Cela dit, je dois ajouter:

Extraire même des tableaux 'Nice' à partir de PDF en général est extrêmement difficile ...

Les PDF standard ne fournissent aucune indication sur la sémantique de ce qu'ils dessinent sur une page: la seule distinction que la syntaxe fournit est la distinction entre les éléments vectoriels (lignes, remplissages, ...), images et texte.

Qu'un caractère fasse partie d'une table ou d'une ligne ou simplement un caractère isolé dans une zone autrement vide n'est pas facile à reconnaître par programme en analysant le code source PDF PDF.

Pour savoir pourquoi le le format de fichier PDF ne doit jamais, jamais être considéré comme adapté à l'hébergement de données structurées extractibles, consultez cet article:

Pourquoi la mise à jour de Dollars for Docs a été si difficile (ProPublica-Website)

... mais le faire avec TabulaPDF fonctionne très bien!

Cela dit, permettez-moi maintenant d'ajouter ceci:

Tabula-Extractor est écrit en Ruby. En arrière-plan, il utilise PDFBox (qui est écrit en Java) et quelques autres bibliothèques tierces. Pour fonctionner, Tabula-Extractor nécessite l'installation de JRuby-1.7.


Installation de Tabula-Extractor

J'utilise la version 'bleeding-Edge' de Tabula-Extractor directement depuis son référentiel de code source GitHub. Le faire fonctionner était extrêmement facile, car sur mon système JRuby-1.7.4_0 est déjà présent:

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

Inclus dans ce clone Git seront déjà les bibliothèques requises, donc pas besoin d'installer PDFBox. L'outil de ligne de commande se trouve dans le /bin/ sous-répertoire.

Explorer les options de ligne de commande:

~/svn-stuff/git.tabula-extractor/bin/tabula -h

Tabula helps you extract tables from PDFs

Usage:
       tabula [options] <pdf_file>
where [options] are:
         --pages, -p <s>:   Comma separated list of ranges, or all. Examples:
                            --pages 1-3,5-7, --pages 3 or --pages all. Default
                            is --pages 1 (default: 1)
          --area, -a <s>:   Portion of the page to analyze
                            (top,left,bottom,right). Example: --area
                            269.875,12.75,790.5,561. Default is entire page
       --columns, -c <s>:   X coordinates of column boundaries. Example
                            --columns 10.1,20.2,30.3
      --password, -s <s>:   Password to decrypt document. Default is empty
                            (default: )
             --guess, -g:   Guess the portion of the page to analyze per page.
             --debug, -d:   Print detected table areas instead of processing.
        --format, -f <s>:   Output format (CSV,TSV,HTML,JSON) (default: CSV)
       --outfile, -o <s>:   Write output to <file> instead of STDOUT (default:
                            -)
       --spreadsheet, -r:   Force PDF to be extracted using spreadsheet-style
                            extraction (if there are ruling lines separating
                            each cell, as in a PDF of an Excel spreadsheet)
    --no-spreadsheet, -n:   Force PDF not to be extracted using
                            spreadsheet-style extraction (if there are ruling
                            lines separating each cell, as in a PDF of an Excel
                            spreadsheet)
            --silent, -i:   Suppress all stderr output.
  --use-line-returns, -u:   Use embedded line returns in cells. (Only in
                            spreadsheet mode.)
           --version, -v:   Print version and exit
              --help, -h:   Show this message

Extraire la table souhaitée par l'OP

Je ne suis même pas j'essaye pour extraire ce tableau laid du PDF monstre de l'OP. Je vais le laisser comme un exercice pour ces lecteurs qui se sentent assez aventureux ...

Au lieu de cela, je vais montrer comment extraire une table 'Nice'. Je vais prendre les pages 651-653 de la spécification PDF-1.7 officielle, ici représentée avec des captures d'écran:

Pages 651-653 of the official PDF-1.7 specification

J'ai utilisé cette commande:

 ~/svn-stuff/git.tabula-extractor/bin/tabula \
   -p 651,652,653 -g -n -u -f CSV            \
    ~/Downloads/pdfs/PDF32000_2008.pdf

Après avoir importé le CSV généré dans LibreOffice Calc, la feuille de calcul ressemble à ceci:

Screenshot from LibreOffice after importing the CSV

Pour moi, cela ressemble à l'extraction parfaite d'un tableau qui s'est réparti sur 3 PDF. (même les sauts de ligne utilisés dans les cellules du tableau en ont fait la feuille de calcul.)


Mettre à jour

Voici une capture d'écran ASCiinema (que vous pouvez également télécharger et rejouer localement dans votre terminal Linux/MacOSX/Unix avec l'aide de l'outil de ligne de commande asciinema), avec tabula-extractor:

asciicast

21
Kurt Pfeifle