31

多数の PDF ドキュメントからテキストを抽出する単純なコンソール アプリケーションまたは PowerShell スクリプトを作成しようとしています。これを行うためのライブラリと CLI ツールがいくつかありますが、ドキュメント構造を確実に識別できるものはありません。特に、テキスト列の認識に関心があります。非常に高価な PDFLib TET ツールでさえ、隣接する 2 つのテキスト列の内容を頻繁にごちゃ混ぜにします。

PDF 形式には列や単語の概念がないことがよく指摘されます。SOに関する同様の質問に対するいくつかの回答で、これについて言及されています。この問題は非常に大きいため、学術研究の必要性さえあります。このジャーナル記事は次のように述べています。

PDF ファイル内のすべてのデータ オブジェクトは、一連の演算子として、視覚的に表現されます。一般に、トークン、行、列などの高レベルのテキスト単位に関する情報 (そのような単位間の境界に関する情報) は伝達されません。空白を介して暗黙的にのみ利用可能

したがって、私が試したすべての抽出ツール (iTextSharp、PDFLib TET、および Python PDFMiner) は、テキスト列の境界を認識できませんでした。これらのツールのうち、PDFLib TET が最高のパフォーマンスを発揮します。

ただし、非常に軽量でオープンソースの PDF リーダーである SumatraPDF や、同様の他の多くの PDF リーダーは、列とテキスト領域を完全に識別できます。これらのアプリケーションのいずれかでドキュメントを開き、ページ上のすべてのテキスト (または CTRL + A でドキュメント全体) を選択してコピーし、テキスト ファイルに貼り付けると、テキストはほとんど問題なく正しい順序でレンダリングされます。フッターとヘッダーのテキストが列の 1 つに混在することがあります。

そこで私の質問は、これらのアプリケーションは、一見非常に難しいように見えること (PDFLib のような高価なツールであっても) をどのように行うことができるのでしょうか?

編集 2014 年 3 月 31 日: PDFBox は iTextSharp よりもテキスト抽出がはるかに優れており (特注の Strategy 実装にもかかわらず)、PDFLib TET は PDFBox よりわずかに優れていることがわかりましたが、かなり高価です。Python PDFMiner は絶望的です。私が見た最高の結果は、Google からのものです。PDF (一度に 2GB) を Google ドライブにアップロードし、テキストとしてダウンロードできます。これが私がやっていることです。PDF を 10 ページのファイルに分割し (Google は最初の 10 ページのみを変換します)、ダウンロード後にそれらをつなぎ合わせる小さなユーティリティを作成しました。

編集 2014 年 4 月 7 日。最後のキャンセル。最良の抽出は、MS Word によって達成されます。これは、Acrobat Pro で自動化できます ([ツール] > [アクション ウィザード] > [新しいアクションの作成])。テキストへの単語変換は、.NET OpenXml ライブラリを使用して自動化できます。これは、非常にきれいに抽出 (docx から txt へ) を行うクラスです。私の最初のテストでは、ドキュメント構造に関しては MS Word 変換の方がかなり正確であることがわかりましたが、プレーン テキストに変換すると、これはそれほど重要ではありません。

4

2 に答える 2

6

フォーマットされたテキストを適切に抽出するには、ライブラリ/ユーティリティは次のことを行う必要があります。

  1. PDF で使用されているフォントのプロパティに関する正しい情報 (グリフ サイズ、ヒント情報など) を取得します。
  2. グラフィックスの状態を維持します (つまり、テキストやページのスケーリングなどの非フォント パラメータ)。
  3. ページ上のどのシンボルを単語、行、列のように扱うかを決定するアルゴリズムを実装します。

私はあなたが質問で言及した製品の専門家ではないので、次の結論は大まかに判断する必要があります。

PDF を描画しないツールは、最初の 2 つの要件に関する専門知識が不足している傾向があります。より深いレベルでフォントの詳細を処理する必要はなく、グラフィックス状態の維持について十分にテストされていない可能性があります。

PDF を画像に変換する適切なツールは、遅かれ早かれ、テキストの配置の欠点に気付くでしょう。そして、それらを修正することは、テキスト抽出に優れているのに役立ちます.

于 2014-03-27T04:46:12.883 に答える