我刚开始使用PDFBox,提取文本等等。我感兴趣的一件事是我正在提取的文本本身的颜色。但是我似乎找不到任何获取这些信息的方法。
是否可以使用PDFBox获取文档的颜色信息?如果可以,我将如何进行此操作?
非常感谢。
答案 0 :(得分:4)
所有颜色信息都应存储在类PDGraphicsState
中,使用的颜色(描边/非描边等)取决于使用的文本呈现模式(通过pdfbox邮件列表)。< / p>
这是我尝试的一个小样本:
用一行创建一个pdf(“RGB=[146,208,80]
中写的”Sample“)后,将输出以下程序:
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
,如CS=org.apache.pdfbox.util.operator.SetStrokingColorSpace
文件中映射.properties
所定义的那样。 RG
映射到org.apache.pdfbox.util.operator.SetStrokingRGBColor
,依此类推。
在这种情况下,PDGraphicsState
没有改变,因为文档只有文本,文本只有一种样式。对于更高级的内容,您需要扩展PDFStreamEngine
(就像PageDrawer
,PDFTextStripper
和其他类一样)以在颜色更改时执行某些操作。您也可以在自己的.properties
文件中编写自己的映射。