我刚开始使用PDFBox,提取文本等。我感兴趣的一件事是我正在提取的文本本身的颜色。但是,我似乎无法找到获取该信息的任何方式。使用PDFBox获取文本颜色
是否有可能使用PDFBox来获取文档的颜色信息,如果是的话,我该怎么做呢?
非常感谢。
我刚开始使用PDFBox,提取文本等。我感兴趣的一件事是我正在提取的文本本身的颜色。但是,我似乎无法找到获取该信息的任何方式。使用PDFBox获取文本颜色
是否有可能使用PDFBox来获取文档的颜色信息,如果是的话,我该怎么做呢?
非常感谢。
所有颜色信息应保存在类PDGraphicsState
和使用的颜色(冲程/ nonstroking等)取决于所使用的文本渲染模式(通过PDFBOX邮件列表)。
这里是一个小样本我想:
创建PDF只用一条线( “样品” 写在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
(就像PageDrawer
,PDFTextStripper
和其他类所做的那样),以便在颜色更改时执行某些操作。您也可以在自己的.properties
文件中编写自己的映射。
如果我没有弄错,他要求文字颜色,而不是颜色的抚摸 – Erik 2012-02-06 13:59:56
@Erik:请参阅PDF参考(partners.adobe.com/public/developer/en/pdf/PDFReference.pdf)到了解文档在PDF文档中的着色方式。 – ipavlic 2012-02-06 14:22:35
感谢POC – Erik 2012-02-09 06:30:03