2011-05-02 99 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