如何使用pdfbox获取字体颜色

我正在尝试使用pdfbox从pdf中提取所有信息的文本。 我得到了我想要的所有信息,除了颜色。 我尝试了不同的方法来获取fontcolor(包括使用PDFBox获取文本颜色 )。 但不工作。 现在我从PageFrawer类的pdfBox中复制了代码。 但是那时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。 请帮帮我。 提前致谢。

我尝试了你发布的链接中的代码,它对我有用。 我得到的颜色是148.92,179.01001和214.965。 我希望我可以给你我的PDF工作,也许如果我把它存放在SO外面? 我的PDF使用了一种浅蓝色,似乎很匹配。 它只是在Word 2010中创建并导出的一页文本,没有太强烈。

一些建议….

  1. 回想一下,返回的值是一个介于0和1之间的浮点数。如果一个值意外地转换为int,那么值当然最终将包含所有0.链接到代码的倍数乘以255以获得0到255的范围。
  2. 正如评论者所说,PDF文件最常见的颜色是黑色,即0 0 0

这就是我现在能想到的全部,否则我有pdfbox和fontbox 1.7.1的版本,就像我说的那样,我几乎跟着你给的链接。

编辑

根据我的评论,这里可能是一种微创的方式来为pdf文件,如color.pdf

PDFStreamEngine.java方法的PDFStreamEngine.java中,可以在try块内部执行

 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]值

我也最终做了这样的事情。 粘贴下面的代码,希望它可以帮助某人。

 import java.io.IOException; import java.util.List; import org.apache.pdfbox.exceptions.COSVisitorException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState; import org.apache.pdfbox.util.PDFTextStripper; import org.apache.pdfbox.util.ResourceLoader; import org.apache.pdfbox.util.TextPosition; public class Parser extends PDFTextStripper { public Parser() throws IOException { super(ResourceLoader.loadProperties( "org/apache/pdfbox/resources/PageDrawer.properties", true)); super.setSortByPosition(true); } public void parse(String path) throws IOException{ PDDocument doc = PDDocument.load(path); List pages = doc.getDocumentCatalog().getAllPages(); for (PDPage page : pages) { this.processStream(page, page.getResources(), page.getContents().getStream()); } } @Override protected void processTextPosition(TextPosition text) { try { PDGraphicsState graphicsState = getGraphicsState(); System.out.println("R = " + graphicsState.getNonStrokingColor().getJavaColor().getRed()); System.out.println("G = " + graphicsState.getNonStrokingColor().getJavaColor().getGreen()); System.out.println("B = " + graphicsState.getNonStrokingColor().getJavaColor().getBlue()); } catch (IOException ioe) {} } public static void main(String[] args) throws IOException, COSVisitorException { Parser p = new Parser(); p.parse("/Users/apple/Desktop/123.pdf"); } } 

我在我的一个维护程序中找到了一些代码。
我不知道它对你有用,请试一试。 另请查看此链接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(); } 

使用pdfbox verson 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