私はpdfファイルに取り組んでいます。そのpdfにはいくつかのテーブルがあります。
PDFに記載されているテーブル名によると、Pythonを使用してそのテーブルからデータを取得したかったのです。
私はhtml、xlmの解析に取り組んできましたが、pdfを使ったことはありません。
Pythonを使用してpdfからテーブルを取得する方法を教えてもらえますか?
私はpdfファイルに取り組んでいます。そのpdfにはいくつかのテーブルがあります。
PDFに記載されているテーブル名によると、Pythonを使用してそのテーブルからデータを取得したかったのです。
私はhtml、xlmの解析に取り組んできましたが、pdfを使ったことはありません。
Pythonを使用してpdfからテーブルを取得する方法を教えてもらえますか?
これは非常に複雑な問題であり、一般には解決できません。
この理由は単純に、形式 PDF が柔軟性が高すぎるためです。一部の PDF はビットマップのみです (その場合は、独自の OCR を作成する必要があります。明らかに、ここでのトピックではありません)。一部の PDF は、文字通りページ上にこぼれた文字の束です。これは、PDF 内のテキスト情報を解析することで、特定の座標に配置された単一の文字を取得できることを意味します。場合によっては、これらは整然と (行ごとに、左から右に) 表示されますが、場合によってはかなりランダムな分布が得られます。最も一般的なのは と などですが、特殊文字、異なるフォントの文字なども含まれます。 . 常軌を逸している可能性があります。
唯一の適切なアプローチは、ページ モデル上の座標に従ってすべての文字を配置し、ヒューリスティックを使用して線が何であるかを調べることです。
開始する前に、解析する PDF とその中のテーブルを確認することをお勧めします。たぶん、それらは常に似ていて、よく解析可能です。
幸運を!
私は最近同様の問題を抱えており、それを解決するのに役立つライブラリを作成しました: pdfquery。
PDFQuery は、PDF から要素ツリーを作成し (pdfminer を使用して、余分な砂糖を加えて)、主にテキストの内容または要素の場所に基づいて、JQuery または XPath セレクターを使用してページから要素をフェッチできるようにします。したがって、テーブルを解析するには、まずラベルを検索してドキュメント内の場所を見つけます。
label = pdf.pq(':contains("Name of your table")')
left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))
次に、検索で結果が返されなくなるまで、テーブルの下の行を検索し続けます。
page = label.closest('LTPage')
while 1:
row = pdf.extract( [
('column_1', ':in_bbox("%s,%s,%s,%s")' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)),
('column_2', ':in_bbox("%s,%s,%s,%s")' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20))
], page)
if not row['column_1'] or row['column_2']:
break
print "Got row:", matches
bottom_corner -= 20
これは、行の高さが 20 ポイントで、最初の行がラベルの 20 ポイント下から始まり、最初の列がラベルの左端から 10 ~ 50 ポイントの範囲にあり、2 番目の列が左端から 50 ~ 80 ポイントの範囲にあることを前提としています。ラベルの端。
空白行や高さが異なる行がある場合、これはさらに厄介になります。テーブル内のエントリが十分に近く、パーサーが 1 行だけだと判断する場合は、merge_tags=None オプションを使用して、単語ではなく個々の文字を選択する必要がある場合もあります。しかし、うまくいけば、これであなたが近づくことができます...
Pythonパーサーライブラリが必要だと思います。最も有名なのはPDFMinerです。
ドキュメントによると:
PDFMiner は、PDF ドキュメントから情報を抽出するためのツールです。他の PDF 関連ツールとは異なり、テキスト データの取得と分析に完全に焦点を当てています。PDFMiner を使用すると、ページ内のテキストの正確な位置や、フォントや線などのその他の情報を取得できます。PDF ファイルを他のテキスト形式 (HTML など) に変換できる PDF コンバーターが含まれています。テキスト分析以外の目的にも使用できる拡張可能な PDF パーサーがあります。
Camelot を使用して、PDF から表形式のデータを抽出し、好みの形式にエクスポートできます。現在; CSV、Excel、JSON、および HTML がサポートされています。ドキュメントはhttp://camelot-py.readthedocs.ioで確認できます。PDFへのリンクを貼っていただけると助かります。一般的なコード例を次に示します。
>>> import camelot
>>> tables = camelot.read_pdf('file.pdf')
>>> type(tables[0].df)
<class 'pandas.core.frame.DataFrame'>
>>> tables[0].to_csv('file.csv')
免責事項: 私はライブラリの作成者です。