多数の 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 変換の方がかなり正確であることがわかりましたが、プレーン テキストに変換すると、これはそれほど重要ではありません。