2011-01-11 21 views
2

PDFBoxを使用してPDFからテキストを抽出しています。 PDFは非常にシンプルで、列は非常に幅広く離れています。PDFBoxのテキスト抽出で「長い」スペースを残す

これはすべての種類の水平スペースが1つのスペース文字に変換されることを除いて、本当にうまく動作します。もはや列を分けることはできません(列内の単語内のスペースは、列間のスペースのように見えます)。

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

xインチ以上の水平空白を1つのスペース以外に変えるようにPDFBoxに指示する方法はありますか?比例的なアプローチ(xインチはyスペースになります)でも動作します。

pdftotext C library/toolにはレイアウトを保存しようとする '-layout'スイッチがあります。基本的に、私がPDFBoxでそれをエミュレートすることができれば、それは完璧です。

+0

[この回答](https://stackoverflow.com/a/45842515/1729265)をご覧ください。 – mkl

答えて

2

これは設定されていないようですが、「長い」スペースが見つかったときに、PDFTextStripperツールのソースを変更して列セパレータ(|)を出力することができました。出力行を構築していたコードでは、現在の文字と前の文字のx位置を見ることができます。十分大きければ、何か特別なことをしてください。 PDFTextStripperは多くの保護されたメソッドを持っていますが、拡張可能なものではありません。私はプライベートメソッドを変更するためにクラス全体をコピーしなければならなくなりました。

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

+1

どのプライベートメソッドを変更しなければならなかったのですか?どのように変更しましたか? –

1

PDFのテキスト抽出が難しいです。テキストのようなスペースで区切られた1つの大きな文字列として出力されている場合

は: -

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

、あなたがCourierなどの固定幅フォントを使用している、あなたは理論的の項目間のスペースの数を計算することができテキストはそれぞれの文字が同じ幅であるためです。フォントがそのようなArialに比例する場合、計算はより困難になります。

実際には、ほとんどのPDFは個々のテキストを個別にその位置に配置することによって生成されます。したがって、技術的には空白文字やその他の文字は列間にありません。テキストはページ上の絶対位置に置かれます。あなたが言及したようにピクセル位置を使用して列データを検索し、一致させるためには、もう少し仕事をしなければならないPDFドキュメント上のデータの抽出を行うためには、いくつかの仮定を作り、少しを有することにより

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

運。

+1

さて、PDFのテキスト抽出は難しいですが、xpdfのpdftotextのレイアウト保存オプションはうまくいきます。読み込み順序の維持、同じ行のテキストを同じ出力行に入れたり、文字を単語にグループ化したりするのに、すでに成功しているPDFBoxに似たものを用意していいですか?そのプレーンテキスト出力が次の構文解析ロジック(テーブルを再構成する必要がある)に対して十分に明確であるかどうかは、別の質問です。幸いにも、私の場合、それは働いた。 – Thilo

関連する問題