我刚刚开始使用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
由映射 CS=org.apache.pdfbox.util.operator.SetStrokingColorSpace
定义在 .properties
文件。 RG
映射到org.apache.pdfbox.util.operator.SetStrokingRGBColor
等等。
在这种情况下,PDGraphicsState
没有改变,因为文档只有文本,并且文本只有一种样式。对于更高级的东西,您需要扩展 PDFStreamEngine
(就像 PageDrawer
、 PDFTextStripper
和其他类一样)在颜色变化时执行某些操作。您还可以在自己的.properties
中编写自己的映射。文件。
关于java - 使用 PDFBox 获取文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5861471/