0

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

是否有可能使用 PDFBox 来获取文档的颜色信息,如果可以,我将如何去做?

非常感谢。

4

1 回答 1

4

所有颜色信息都应该存储在类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.SetStrokingColorSpaceCS=org.apache.pdfbox.util.operator.SetStrokingColorSpace.propertiesRGorg.apache.pdfbox.util.operator.SetStrokingRGBColor

在这种情况下,PDGraphicsState没有改变,因为文档只有文本,而它的文本只有一种样式。对于更高级的东西,你需要扩展PDFStreamEngine(就像PageDrawerPDFTextStripper其他类一样)在颜色变化时做一些事情。.properties您也可以在自己的文件中编写自己的映射。

于 2012-02-06T09:03:23.057 回答