8

テキストの抽出に Apache pdfbox を使用しています。PDFからテキストを抽出できますが、単語が太字かどうかを知る方法がわかりませんか??? (コードの提案は良いでしょう!!!)正常に機能しているpdfからプレーンテキストを抽出するためのコードを次に示します。

PDDocument document = PDDocument
    .load("/home/lipu/workspace/MRCPTester/test.pdf");
document.getClass();
if (document.isEncrypted()) {
    try {
        document.decrypt("");
    } catch (InvalidPasswordException e) {
        System.err.println("Error: Document is encrypted with a password.");
        System.exit(1);
    }
}

// PDFTextStripperByArea stripper = new PDFTextStripperByArea();
// stripper.setSortByPosition(true);
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(2);
stripper.setSortByPosition(true);
String st = stripper.getText(document);
4

1 に答える 1

20

の結果PDFTextStripperはプレーンテキストです。したがって、抽出してからでは手遅れです。ただし、特定のメソッドをオーバーライドして、希望どおりにフォーマットされたテキストのみを通過させることができます。

PDFTextStripperオーバーライドする必要がある場合

protected void processTextPosition( TextPosition text )

オーバーライドでは、問題のテキストが要件を満たしているかどうか (TextPositionテキスト自体だけでなく、問題のテキストに関する多くの情報が含まれているかどうか) を確認し、満たす場合TextPosition textは実装に転送しsuperます。

ただし、主な問題は、どのテキストが太字であるかを認識することです。

太字の基準は、フォント名に太字という単語があります。たとえば、 Courier-BoldObliquetext.getFont()を使用してテキストのフォントにアクセスし、フォントのメソッドを使用してフォントのポストスクリプト名にアクセスします。getBaseFont()

String postscriptName = text.getFont().getBaseFont();

基準はフォント記述子から取得することもできます。メソッドを使用してフォントのフォント記述子を取得し、フォント記述getFontDescriptor子にはオプションのフォント ウェイト値があります。

float fontWeight = text.getFont().getFontDescriptor().getFontWeight();

値は次のように定義されます。

(オプション。PDF 1.5。タグ付き PDF ドキュメントのタイプ 3 フォントに使用する必要があります) 完全修飾フォント名またはフォント指定子の太さ (太さ) コンポーネント。可能な値は、100、200、300、400、500、600、700、800、または 900 です。各数値は、少なくとも前の値と同じくらい暗い重みを示します。値 400 は通常の体重を示します。700 は太字を示すものとします。

これらの値の具体的な解釈は、フォントによって異なります。

例 あるフォントの 300 は、別のフォントの 500 に最も似ている場合があります。

(表 122、セクション 9.8.1、ISO 32000-1)

太字主義をチェックするための追加のヒントがあるかもしれません。たとえば、大きな線幅です。

double lineWidth = getGraphicsState().getLineWidth();

レンダリング モードでもアウトラインを描画する場合:

int renderingMode = getGraphicsState().getTextState().getRenderingMode();

手元にあるドキュメントで、どの基準が十分かを試す必要がある場合があります。

于 2013-11-04T21:55:41.753 に答える