web-dev-qa-db-ja.com

PDFファイルから構造を追跡しながらデータを抽出する方法は?

私の目的は、PDFファイルから構造を解析しながらテキストと画像を抽出することです。構造を解析するためのスコープは完全ではありません。見出しと段落を特定できる必要があるだけです。

私はいくつかの異なることを試しましたが、どれもそれほど遠くまで行きませんでした。

  • PDFをテキストに変換します。画像とドキュメントの構造が失われるため、私にとってはうまくいきません。
  • PDFをHTMLに変換します。これに役立つツールがいくつか見つかりました。現在のところ最高のツールはpdftohtmlです。このツールは非常に優れたプレゼンテーションですが、 HTMLを正常に解析します。
  • PDFをXMLに変換します。上記と同じです。

誰もがこの問題に取り組む方法について何か提案がありますか?

21
Marcel

PDFは構造にあまり興味がないため、基本的に簡単なカットアンドペーストのソリューションはありません。このサイトには、詳細を説明する他の多くの回答があります。しかし、これはあなたに主要なポイントを与えるはずです:

PDFドキュメントでテキスト構造を特定することが非常に難しい場合、どのようにPDF読者はそれをうまく行うのですか?

PDF自体(プロセスの大部分を制御できる場所)でこれを行う場合は、ページ上のすべてのテキストをループし、それらを見てヘッダーを特定する必要があります。テキストのプロパティ(使用されるフォント、ページ上の他のテキストとの相対的なサイズなど)。

さらに、テキストの断片の配置、ページ上の空白、特定の文字、単語、行の近さなどを見て、段落を特定する必要があります... PDF単独で「単語」の概念さえありません。「行」や「段落」は言うまでもありません。

さらに複雑にするために、テキストがページに描画される方法(およびPDFファイル自体に表示される順序)は、適切な読み取り順序である必要はありません(または私たち人間が適切な読み順であると考えるもの)。

11

ITextSharpまたは他のオープンソースライブラリでは、次のような方法を使用できます。

  • PDF iTextSharp または同様のオープンソースツールでファイルを読み取り、すべてのテキストオブジェクトを配列に収集します(またはPDFをHTMLに変換します) pdftohtml のようなツールを使用して、HTMLを解析します)
  • すべてのテキストオブジェクトを座標でソートして、それらをすべてまとめます
  • 次に、オブジェクトを反復処理し、オブジェクト間の距離をチェックして、2つ以上のオブジェクトを1つの段落にマージできるかどうかを確認します

または、これを正確に実行できる ByteScout PDF Extractor SDK のような商用ツールを使用することもできます。

  • テキストのレイアウトを分析しながらテキストと画像を抽出する
  • テキストオブジェクトが仮想レイアウトグリッド内の段落にマージまたは分割されるXMLまたはCSV
  • 元のPDF内での格納方法に関係なく、「仮想」行および列インデックスを介して各オブジェクトをアドレス指定できるようにする特別なAPIを介してオブジェクトにアクセスします。

免責事項:私はByteScoutと提携しています

3
Eugene

PDFにはさまざまな形式が用意されているため、ヘッダーとそのサブコンテンツのPDF解析は非常に困難です(不可能ではありません)。しかし、最近[〜#〜] grobid [〜#〜]これはこのシナリオに役立ちます。完璧ではないことはわかっていますが、適切なトレーニングを提供すれば、目標を達成できます。

Grobidはgithubのオープンソースとして利用可能です。

https://github.com/kermitt2/grobid

2
Vaibhav Panmand

PDFファイルは、tabula-pyまたはtabula-Javaで解析できます。

この記事 でtabula-pyを使用する方法についての完全なチュートリアルを作成しました。 Javaがインストールされていれば、Webブラウザでも表を作成できます。

1
Eric Kim

マークされたコンテンツでない限り、PDFには構造がありません。..さまざまなツールが実行していることを「推測」する必要があります。問題を説明する優れたブログ投稿があります http://blog.idrsolutions.com/2010/09/the-easy-way-to-discover-if-a-pdf-file-contains-structured-content/

0
markee174