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.
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:
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:
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)
Cela dit, permettez-moi maintenant d'ajouter ceci:
Pour une étonnante famille d'outils open source qui s'améliore de semaine en semaine pour extraire des données tabulaires à partir de PDF (sauf s'il s'agit de pages numérisées) - contredisant ce que j'ai dit dans mes paragraphes d'introduction! - consultez TabulaPDF. Voir ces liens:
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.
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
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:
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:
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.)
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
: