42

私は PdfBox と PDFTextStripperByArea メソッドで遊んでいます。

テキストが太字または斜体の場合は情報を抽出できましたが、下線の情報を取得できません。

PDFで分かる限り、下線は線を引いて付けています。したがって、理論的には、テキストのどこかにある行に関する何らかの情報を取得できるはずです。この情報を提供することで、テキストに下線が引かれているのか、それとも表になっているのかを知ることができました。

これまでの私のコードは次のとおりです。

List<TextPosition> textPos = charactersByArticle.get(index);

for (TextPosition t : textPos)
{               
    if (t.getFont().getFontDescriptor() != null)
    {                           
        if (t.getFont().getFontDescriptor().getFontWeight() > BOLD_WEIGHT ||
            t.getFont().getFontDescriptor().isForceBold())
        {
            isBold = true;
        }

        if (t.getFont().getFontDescriptor().isItalic())
        {
            isItalic = true;
        }
    }
}

PDFStreamEngineクラスのprocessEncodedTextメソッドで処理される PDGraphicsState オブジェクトをいじってみましたが、行の情報は見つかりませんでした。

この情報をどこから取得できるかについての提案はありますか?

4

5 に答える 5

5

これが私がこれまでに見つけたものです:

PDFBox は、リソース ファイルを使用して、PDF オペレータ/命令を特定のクラスにバインドし、それらのクラスが情報を処理します。

以下のPDFTextStripper.propertiesリソース ファイルを見てみましょう。

pdfbox\src\main\resources\org\apache\pdfbox\resources\

たとえば、BT オペレーターが org.apache.pdfbox.util.operator.BeginTextクラスなどにバインドされていることがわかります。

下のPDFTextStripper

pdfbox\src\main\java\org\apache\pdfbox\util\

これを考慮して、このクラスで PDF の処理を​​利用します。

ただし、すべてのグラフィック オブジェクトは無視されるため、下線やテーブル構造の情報はありません。

ここでPageDrawer.propertiesリソース ファイルを見ると、これが使用可能なほぼすべての演算子にバインドされていることがわかります。以下のPageDrawerクラスによって利用されるもの

pdfbox\src\main\java\org\apache\pdfbox\pdfviewer\

「トリック」は、下線と表を表すグラフィカル演算子を見つけて、それらをPDFTextStripperと組み合わせて使用​​することです。

現在、これは PDF ファイルの仕様を読むことを意味し、現在は多くの作業を行っています。

下線と表の線を引く操作を担当するオペレーターを知っている人がいたら、教えてください。

于 2012-12-28T08:38:11.607 に答える
2

あなたが言及したように-PDFBoxはリソースファイルを使用して、情報を処理する訪問者にPDFオペレーター/指示をバインドします。

おそらく、PDFBox の既存のビジターを独自のソース フォルダーにコピーし、そこから実装を追加/拡張することから始めることをお勧めします。

私の昔の PostScript の経験では、'moveto' および 'lineto' 演算子を思い出します。PDF は大まかに PS ベースであるため、似たようなものを探すことになります。

http://learnpostscript.wordpress.com/category/lineto/

PDF 形式は ab*tch です。これは HTML であり、間違っています。セマンティクスではなく、グラフィカルな実装を表します。文を再構築することさえ困難です。単語や個々の文字を配置し、「スペース」または「改行」をアルゴリズムで再構築する必要があります。要するに、アドビはア*ホールです。そして、Reader は非人間工学的で、バグだらけで、不安定で、肥大化した豚です。

ただし、たとえば、12時間以上の作業を喜んで行う場合は、要件を達成できます。位置による検出と同様に、通常、下線はPDFのテキストの直後に出力されます..ラッチできるページ位置だけでなく、PDF ドキュメントの順序で検出します。

また、下線付きのテキストを含む簡単な 2 行の PDF を作成してみてください。次に、それを解析して戻すことができるかを確認してください! 下線は犬のバナナのように突き出ている必要があり、それを検出できれば、順調に進んでいます。

PDFBox は拡張性にあまり優れていません。主にアルゴリズムの山がたくさんあるだけです。このため、PDFTextStripper のソースをコピーし (参照用に PageDrawer を用意することもできます)、そこからプロトタイプを作成してください。

お役に立てれば!

于 2013-03-02T02:01:41.210 に答える
1

Itext を使用して PDF レポートを生成できます。

itext を使用すると、行を簡単に配置できます。

以下を試してください。

document.add(new LineSeparator(0.5f, 50, null, 0, 198));

上記のコードは、pdf レポートで行を生成するために使用されます。選択に従って寸法を設定します。

これがあなたを助けることを願っています。

于 2013-02-28T07:59:39.827 に答える
1

私がpdfboxを理解している限り、下線を読むことができるオプションはありません。たぶん、この目的のために itextpdf を試すことができます。

于 2013-03-01T07:57:20.373 に答える
-3

APIによると、getfont()はフォントサイズを返します。

getStyle()メソッドを使用するとSTYLE_UNDERLINE、下線付きのフォントが返されます。したがって、アンダースコアスタイルを取得できます。

于 2012-12-26T21:25:43.370 に答える