2

最近、PDFBoxを使用してPDFファイルからテキストを抽出しようとしました。ほとんどのPDFで問題なく動作しますが、1つのPDF(残念ながら共有は許可されていません)では、文のすべてのピリオドが抽出されません。代わりに、次のようなフレーズが表示されます。

...what it would be It’ll be important later on...

ピリオドスペースではなく単なるスペースのように見えますが、そうではありません(少なくともMac OS Xでは)。テキストをテキストエディタにコピーして、フレーズ内でテキストカーソルを移動し始めると、「フィート」の「t」の直後に「空の文字」が表示されます。再現するには:

  • 「フィート」の文字「t」の直前にカーソルを置き、右矢印キーを押します。カーソルが1ステップ右に移動します。
  • もう一度右矢印キーを押すと、現在の場所にとどまります。
  • もう一度右矢印キーを押すと、スペースの反対側に進みます。
  • 右矢印キーを押し続けると、期待どおりに動作します

PDFBoxは、ピリオドの代わりにある種の「空の文字」を抽出したようです。私はそれをいくつかの異なる方法で置き換えようとしましたが、運がありませんでした:

String oldText = text;
text = text.replace('\u0000', '.'); //Unicode null
text = text.replace('\0', '.'); //C null
System.out.println(oldText.equals(text)); //Returns true
//Also tried text.replace(null, '.'), but it doesn't compile

この「空の文字」とは何ですか。また、そこにあるはずのテキストに置き換えるにはどうすればよいですか。

編集:この回答は、文字がなどの文字である可能性があることを示唆していますが、提案されているよう\uFEFFに正規表現に置き換えようとしても機能しませんでした。

4

1 に答える 1

2

\uFEFFキャラクターが、他のStack Overflowユーザーが遭遇したUnicodeの2つの値ではないことに気付いた後\u0000、テストを実行して、コードが実際に何であるかを把握することにしました。この回答のコードを使用してUnicode値が何であるかを判断すると、謎の文字が\u0008バックスペース」であることがわかりました。なぜそれがPDFから引き出されたのか、私にはわかりませんが、text = text.replace('\u0008', '.')現在は欠落しているピリオドに置き換えられています。

于 2013-03-27T01:43:49.817 に答える