我刚刚开始使用 PDFBox,提取文本等。我感兴趣的一件事是我正在提取的文本本身的颜色。但是,我似乎找不到任何获取该信息的方法。
是否有可能使用 PDFBox 来获取文档的颜色信息,如果可以,我将如何去做?
非常感谢。
所有颜色信息都应该存储在类PDGraphicsState
中,使用的颜色(描边/非描边等)取决于使用的文本渲染模式(通过 pdfbox 邮件列表)。
这是我尝试的一个小样本:
在创建一个只有一行的 pdf 后(“Sample”写在 中RGB=[146,208,80]
),以下程序将输出:
设备RGB 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
您也可以在自己的文件中编写自己的映射。