2

PDFBoxを使用してPDFからテキストを抽出しています。PDFには表形式の構造があり、これは非常に単純で、列も互いに非常に広い間隔で配置されています

これは非常にうまく機能しますが、すべての種類の水平スペースが単一のスペース文字に変換されるため、列を区別できなくなります (列内の単語内のスペースは、列間のスペースのように見えます)。

一般的な解決策は非常に難しいことを理解していますが、この場合、列が非常に離れているため、「長いスペース」と「単語間のスペース」を簡単に区別するだけで十分です。

PDFBox に、x インチを超える水平方向の空白を単一のスペース以外のものに変えるように指示する方法はありますか? 比例アプローチ (x インチが y スペースになる) も機能します。

pdftotext C ライブラリ/ツールには、レイアウトを保持しようとする「-layout」スイッチがあります。基本的に、PDFBoxでそれをエミュレートできれば完璧です。

4

2 に答える 2

2

この設定はないようですが、「長い」スペースが検出されたときに列区切り文字(|)を出力するようにPDFTextStripperツールのソースを変更することができました。出力行を作成していたコードでは、現在および前の文字のx位置を確認できます。十分に大きい場合は、何か特別なことを行います。PDFTextStripperには多くの保護されたメソッドがありますが、実際にはそれほど拡張可能ではないことが判明しました。プライベートメソッドを変更するには、クラス全体をコピーする必要がありました。

そこにあるコードを見ると、特定のPDFで、この単純なアプローチが成功したことを幸運だと思います。より一般的な解決策は非常に難しいようです。

于 2011-01-12T06:39:20.453 に答える
1

PDF テキストの抽出は困難です。

テキストが次のようにスペースで区切られた 1 つの大きな文字列として出力された場合:-

PDFTextOut("     Column 1                    Column 2           Column 3");

Courier などの固定幅フォントを使用している場合、各文字は同じ幅であるため、理論的にはテキスト項目間のスペース数を計算できます。フォントが Arial のようにプロポーショナルな場合、計算は難しくなります。

実際には、ほとんどの PDF は、テキストの各部分を個別にその位置に直接配置することによって生成されます。したがって、技術的には、列間にスペース文字やその他の文字はありません。テキストは、ページ上の絶対位置に配置されるだけです。

PDFMoveTo(100,100);
PDFTextOut("Column 1");
PDFMoveTo(250,100);
PDFTextOut("Column 2");

PDFドキュメントでデータ抽出を実行するには、前述のようにピクセル位置を使用し、いくつかの仮定を立てて少し運をかけて、列データを見つけて一致させるためにもう少し作業を行う必要があります.

于 2011-01-12T07:10:05.200 に答える