web-dev-qa-db-ja.com

PDFBoxテキスト抽出合字「fi」、「fl」Android Studioでの問題

私はこれを使用しています https://github.com/TomRoush/PdfBox-Android PDFBox on Android Studio library to a text from a PDFドキュメント。これが私がしていることです:

File pdf_file = new File(file_path);

ファイルを作成し、

PDDocument document = null;
document = PDDocument.load(pdf_file);

ファイルをPDDocumentオブジェクトにロードし、次に

PDFTextStripper pdfStripper = new PDFTextStripper();
pdfStripper.setStartPage(...);
pdfStripper.setEndPage(...);
String page_text = pdfStripper.getText(document);

ページのテキストコンテンツを取得します。問題は、たとえば「firm」という単語がある場合、「fi rm」のように表示されることです。それは基本的にfiの後にスペースを置きます(そして、私はflsと他の合字を推測します)。私はこれを読んでみました pdfBoxを使用したOpenTypeFontテキストの抽出の問題 が、それを修正する方法がわかりません。ソリューションの詳細はありません。

重要:結局のところ、私のPDFファイルでは、fiなどの合字はありませんが、通常のfiがありますが、その後にスペースがあります。解決策は不明です。

PDFファイル: https://wetransfer.com/downloads/09e9036dda4a7962ccad32b1cbcd8edc20200506050349/ab4752

3
Anovalium

コメントで述べたように、私は合字に関して同じような問題を一度抱えていました。私はPDFファイルに特定の文字列がないかを確認する必要があり、なぜそれが機能しないのか疑問に思っていました。分析後、それらのファイルに合字が含まれているため、「テキストフィールド」を見つけることができませんでした。私の解決策はtextfieldだけでなく_textfield_も検索することだったので、合字のある文字列と合字のない文字列の2つの文字列を検索しました。

PDFファイルからテキストを抽出したいとおっしゃっていました。したがって、後処理ステップを追加します。

  1. 今と同じようにテキストを抽出します
  2. すべての合字を検索します。 「?」と「?」を「fi」に置き換えます。

合字の後にスペースのないドキュメントがあったので、両方のケースを検討します。また、語尾の例(buffiなど)も考慮する必要があります(その場合、スペースが2つある可能性がありますか?)。

一般的な言葉:あなたがすでに研究したように、このトピックは簡単ではありません。このステップは NFKC正規化 と呼ばれます。 pdfbox 2.Xではこれは内部的に行われます(cp。PDFBOX-2384)が、pdfbox 1.XではTextNormalize.Javaは doing it でした。

更新:

あなたが試すことができるもう一つの可能​​性は、PDFTextStripper.Javaを変更することです。 normalizeWord(...)というメソッドがあります。単一の「fi」合字を「f」と「i」に変換します。追加できます

_//line 1971...
//for PDFs where ligatures are followed by a space (e.g. "fi ve") 
if(Word.substring(q+1,q+2).equals(" ")) {
  p = q + 2;
}
else {
  p = q + 1;
}
_

しかし、私はpdfbox 2.0.19でのみ試しました(そして、あなたは1.8.Xを使っているようです)。良いことに、合字が見つかったときにのみ適用されます。ただし、合字で終わる単語に問題があるため、一般的な解決策ではないようです。しかし、あなたの場合、各合字の後に常にスペースがあるように見えるので、あなたは大丈夫です。

2
Lonzak