2011-05-02 59 views
0

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

是否有可能使用PDFBox来获取文档的颜色信息,如果是的话,我该怎么做呢?

非常感谢。

回答

4

所有颜色信息应保存在类PDGraphicsState和使用的颜色(冲程/ nonstroking等)取决于所使用的文本渲染模式(通过PDFBOX邮件列表)

这里是一个小样本我想:

创建PDF只用一条线( “样品” 写在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,如.properties文件中的映射CS=org.apache.pdfbox.util.operator.SetStrokingColorSpace所定义。 RG映射到org.apache.pdfbox.util.operator.SetStrokingRGBColor等。

在这种情况下,PDGraphicsState并没有改变,因为文档只有文本,文本只有一种样式。对于更高级的内容,您需要扩展PDFStreamEngine(就像PageDrawer,PDFTextStripper和其他类所做的那样),以便在颜色更改时执行某些操作。您也可以在自己的.properties文件中编写自己的映射。

+0

如果我没有弄错,他要求文字颜色,而不是颜色的抚摸 – Erik 2012-02-06 13:59:56

+1

@Erik:请参阅PDF参考(partners.adobe.com/public/developer/en/pdf/PDFReference.pdf)到了解文档在PDF文档中的着色方式。 – ipavlic 2012-02-06 14:22:35

+0

感谢POC – Erik 2012-02-09 06:30:03