私はこれを使用しています 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
コメントで述べたように、私は合字に関して同じような問題を一度抱えていました。私はPDFファイルに特定の文字列がないかを確認する必要があり、なぜそれが機能しないのか疑問に思っていました。分析後、それらのファイルに合字が含まれているため、「テキストフィールド」を見つけることができませんでした。私の解決策はtextfield
だけでなく_textfield
_も検索することだったので、合字のある文字列と合字のない文字列の2つの文字列を検索しました。
PDFファイルからテキストを抽出したいとおっしゃっていました。したがって、後処理ステップを追加します。
合字の後にスペースのないドキュメントがあったので、両方のケースを検討します。また、語尾の例(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を使っているようです)。良いことに、合字が見つかったときにのみ適用されます。ただし、合字で終わる単語に問題があるため、一般的な解決策ではないようです。しかし、あなたの場合、各合字の後に常にスペースがあるように見えるので、あなたは大丈夫です。