使用PDFBox获取文本颜色

我刚开始使用PDFBox,提取文本等等。 我感兴趣的一件事是我正在提取的文本本身的颜色。 但是,我似乎找不到任何获取该信息的方法。

是否有可能使用PDFBox获取文档的颜色信息,如果是这样,我将如何这样做?

非常感谢。

所有颜色信息都应存储在PDGraphicsState类中,使用的颜色(描边/非描边等)取决于使用的文本呈现模式(通过pdfbox邮件列表)

这是我尝试的一个小样本:

在创建只有一行的pdf(“Sample”以RGB=[146,208,80]编写)后,将输出以下程序:

DeviceRGB 146.115 208.08 80.07

这是代码:

 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(); } 

查看PageDrawer.properties以了解PDF运算符如何映射到Java类。

据我了解,当PDFStreamEngine处理页面流时,它会根据当前处理的运算符设置各种变量状态。 因此,当它命中绿色文本时,它将改变PDGraphicsState,因为它将遇到适当的运算符。 因此对于CS它调用org.apache.pdfbox.util.operator.SetStrokingColorSpace ,这是通过在.properties文件中映射CS=org.apache.pdfbox.util.operator.SetStrokingColorSpace来定义的。 RG映射到org.apache.pdfbox.util.operator.SetStrokingRGBColor等。

在这种情况下, PDGraphicsState没有改变,因为文档只有文本,文本只有一种样式。 对于更高级的东西,你需要扩展PDFStreamEngine (就像PageDrawerPDFTextStripper和其他类一样)在颜色变化时做一些事情。 您也可以在自己的.properties文件中编写自己的映射。