7

pdfbox を使用して、pdf からすべての情報を含むテキストを抽出しようとしています。色を除いて、必要なすべての情報を取得しました。fontcolor を取得するさまざまな方法を試しました ( PDFBox でテキストの色を取得するなど)。しかし、機能していません。そして今、pdfBoxのPageDrawerクラスからコードをコピーしました。しかし、RGB 値も正しくありません。

protected void processTextPosition(TextPosition text) {

        Composite com;
        Color col;
        switch(this.getGraphicsState().getTextState().getRenderingMode()) {
        case PDTextState.RENDERING_MODE_FILL_TEXT:
            com = this.getGraphicsState().getNonStrokeJavaComposite();
            int r =       this.getGraphicsState().getNonStrokingColor().getJavaColor().getRed();
            int g = this.getGraphicsState().getNonStrokingColor().getJavaColor().getGreen();
            int b = this.getGraphicsState().getNonStrokingColor().getJavaColor().getBlue();
            int rgb = this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB();
            float []cosp = this.getGraphicsState().getNonStrokingColor().getColorSpaceValue();
            PDColorSpace pd = this.getGraphicsState().getNonStrokingColor().getColorSpace();
            break;
        case PDTextState.RENDERING_MODE_STROKE_TEXT:
            System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
            System.out.println(this.getGraphicsState().getStrokingColor().getJavaColor().getRGB());
           break;
        case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT:
            //basic support for text rendering mode "invisible"
            Color nsc = this.getGraphicsState().getStrokingColor().getJavaColor();
            float[] components = {Color.black.getRed(),Color.black.getGreen(),Color.black.getBlue()};
            Color  c1 = new Color(nsc.getColorSpace(),components,0f);
            System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
            break;
        default:
            System.out.println(this.getGraphicsState().getNonStrokeJavaComposite().toString());
            System.out.println(this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB());
    }

上記のコードを使用しています。取得する値は r = 0、g = 0、b = 0、cosp オブジェクト内の値は [0.0]、pd オブジェクト配列内 = null、colorSpace = null です。RGB 値は常に -16777216 です。私を助けてください。前もって感謝します。

4

5 に答える 5

5

あなたが投稿したリンクのコードを試してみましたが、うまくいきました。返される色は、148.92、179.01001、および 214.965 です。SOの外部に保存する場合は、PDFを使用できるようにしたいと思いますか?私のPDFは一種の淡い青色を使用していましたが、それは一致しているようです. それは、Word 2010 で作成され、エクスポートされた 1 ページのテキストであり、それほど激しいものではありませんでした。

いくつかの提案....

  1. 返される値は 0 と 1 の間の float であることを思い出してください。値が誤って int にキャストされた場合、もちろん値はほとんどすべて 0 を含むことになります。 .
  2. コメント者が言ったように、PDF ファイルの最も一般的な色は黒で、0 0 0 です。

それ以外の場合は、バージョン 1.7.1 の pdfbox と fontbox があり、先ほど言ったように、あなたが提供したリンクをほとんどたどりました。

編集

私のコメントに基づいて、これはおそらくcolor.pdf?

PDFStreamEngine.javaメソッドでは、processOperatortry ブロック内で実行できます

if (operation.equals("RG")) {
   // stroking color space
   System.out.println(operation);
   System.out.println(arguments);
} else if (operation.equals("rg")) {
   // non-stroking color space
   System.out.println(operation);
   System.out.println(arguments);
} else if (operation.equals("BT")) {
   System.out.println(operation);    
} else if (operation.equals("ET")) {
   System.out.println(operation);           
}

これにより情報が表示されます。その後、必要に応じて各セクションの色情報を処理する必要があります。上記のコードを実行したときの出力の先頭からのスニペットを次に示しますcolor.pdf...

BT rG [COSInt(1), COSInt(0), CosInt(0)] RG [COSInt(1), COSInt(0), CosInt(0)] ET BT ET BT rG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] RG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] ET ......

上記の出力では、空の BT ET セクションが表示されます。これは、DEVICEGRAY とマークされたセクションです。他のすべては、R、G、および B コンポーネントの [0,1] 値を提供します

于 2012-12-24T19:13:02.977 に答える
3

メンテナンスプログラムの1つにコードが見つかりました。
それがあなたのために働くかどうかはわかりません、それを試してみてください。このリンクもチェックしてくださいhttp://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

それはあなたを助けるかもしれません

PDDocument doc = null;
try {
    doc = PDDocument.load("C:/Path/To/Pdf/Sample.pdf");
    PDFStreamEngine engine = new PDFStreamEngine(ResourceLoader.loadProperties("org/apache/pdfbox/resources/PageDrawer.properties"));
    PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0);
    engine.processStream(page, page.findResources(), page.getContents().getStream());
    PDGraphicsState graphicState = engine.getGraphicsState();
    System.out.println(graphicState.getStrokingColor().getColorSpace().getName());
    float colorSpaceValues[] = graphicState.getStrokingColor().getColorSpaceValue();
    for (float c : colorSpaceValues) {
        System.out.println(c * 255);
    }
}
finally {
    if (doc != null) {
        doc.close();
    }
于 2012-12-28T04:43:19.083 に答える
1

pdfbox バージョン 2.0+ では、上書きされた PDFTextStripper のコンストラクターでこれらの演算子を選択する必要があります。

addOperator(new SetStrokingColorSpace());
addOperator(new SetNonStrokingColorSpace());
addOperator(new SetStrokingDeviceCMYKColor());
addOperator(new SetNonStrokingDeviceCMYKColor());
addOperator(new SetNonStrokingDeviceRGBColor());
addOperator(new SetStrokingDeviceRGBColor());
addOperator(new SetNonStrokingDeviceGrayColor());
addOperator(new SetStrokingDeviceGrayColor());
addOperator(new SetStrokingColor());
addOperator(new SetStrokingColorN());
addOperator(new SetNonStrokingColor());
addOperator(new SetNonStrokingColorN());

そうして初めて getGraphicsState() が適切な情報を返します。

https://pdfbox.apache.org/2.0/migration.htmlを参照してください

于 2017-02-07T11:04:40.370 に答える