web-dev-qa-db-ja.com

PDF Excelへのデータとテーブルのスクレイピング

データ入力ジョブの生産性を向上させる良い方法を見つけようとしています。

私がやろうとしているのは、PDFからデータをスクレイピングしてExcelに入力する方法です。

具体的には、私が扱っているデータは、食料品店のチラシからのものです。現状では、チラシのすべての取引を手動でデータベースに入力する必要があります。チラシのサンプルは http://weeklyspecials.safeway.com/customer_Frame.jsp?drpStoreID=1551 です。

私がやろうとしていることは、製品、価格、および事前定義されたオプション(ポイントカード、クーポン、バラエティの選択など)の列を用意することです。

何か助けていただければ幸いです。具体的にする必要がある場合はお知らせください。

12
Casey Saunders

特定のPDFOPにリンクされているを見た後、これは典型的な表形式を完全に表示しているわけではないこと。

「セル」内には多くの画像が含まれていますが、セルがすべて厳密に垂直または水平に配置されているわけではありません。

Page 6 from the PDF linked in the OP

したがって、これは「ナイス」なテーブルでもありませんが、非常に醜く扱いにくいテーブルです...


そうは言っても、追加する必要があります:

PDFから「素敵な」テーブルでさえ一般的にを抽出することは非常に困難です...

標準PDFは、ページに描画する semantics についてのヒントを提供していません。構文が提供する唯一の違いは、ベクトル要素(線、塗りつぶし、...)の違いです。 )、画像、テキスト。

文字が表の一部であったり、行の一部であったり、孤独であったりしても、PDFソースコードを解析することによって、他の点では空の領域内の単一の文字をプログラムで認識することは簡単ではありません。

PDFファイル形式が抽出可能な構造化データのホスティングに適しているとは考えられない理由についての背景情報、この記事を参照してください:

ドキュメントのドルの更新がなぜ難しいのか(ProPublica-Website)

...しかし、TabulaPDFでそうすることは非常にうまくいきます!

上記を述べたので、これを追加しましょう:

Tabula-ExtractorはRubyで書かれています。バックグラウンドでは、Javaで記述されたPDFBoxと他のいくつかのサードパーティのライブラリを利用します。実行するには、Tabula-ExtractorにJRuby-1.7がインストールされている必要があります。


Tabula-Extractorのインストール

私は、GitHubソースコードリポジトリから直接、「最先端」バージョンのTabula-Extractorを使用しています。私のシステムにはJRuby-1.7.4_0がすでに存在しているので、それを機能させるのは非常に簡単でした。

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

このGitクローンにはすでに必要なライブラリが含まれているため、PDFBoxをインストールする必要はありません。コマンドラインツールは/bin/サブディレクトリ。

コマンドラインオプションの確認:

~/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

OPが必要とするテーブルの抽出

OPのモンスターPDFからこの醜いテーブルを抽出する trying すらしません。冒険心を十分に感じているこれらの読者への練習問題として...

代わりに、「ニース」テーブルを抽出する方法をデモします。 公式PDF-1.7仕様から651〜653ページを取得します。ここではスクリーンショットで示しています。

Pages 651-653 of the official PDF-1.7 specification

私はこのコマンドを使用しました:

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

生成されたCSVをLibreOffice Calcにインポートすると、スプレッドシートは次のようになります。

Screenshot from LibreOffice after importing the CSV

私にとってこれは、3つの異なるPDFページに渡ったテーブルの完全な抽出のように見えます。(テーブルセル内で使用された改行でさえ、スプレッドシートに入れられました。)


更新

これはASCiinemaのスクリーンキャストです(これもダウンロードでき、Linux/MacOSX/Unixターミナルでローカルで再生できますasciinemaコマンドラインツールのヘルプ)、主なtabula-extractor

asciicast

21
Kurt Pfeifle