使用PDFBox获取文本颜色

时间:2011-05-02 19:22:24

标签: java pdfbox

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

是否可以使用PDFBox获取文档的颜色信息?如果可以,我将如何进行此操作?

非常感谢。

1 个答案:

答案 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(就像PageDrawerPDFTextStripper和其他类一样)以在颜色更改时执行某些操作。您也可以在自己的.properties文件中编写自己的映射。