我剛開始使用PDFBox,提取文本等。我感興趣的一件事是我正在提取的文本本身的顏色。但是,我似乎無法找到獲取該信息的任何方式。使用PDFBox獲取文本顏色
是否有可能使用PDFBox來獲取文檔的顏色信息,如果是的話,我該怎麼做呢?
非常感謝。
我剛開始使用PDFBox,提取文本等。我感興趣的一件事是我正在提取的文本本身的顏色。但是,我似乎無法找到獲取該信息的任何方式。使用PDFBox獲取文本顏色
是否有可能使用PDFBox來獲取文檔的顏色信息,如果是的話,我該怎麼做呢?
非常感謝。
所有顏色信息應保存在類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
文件中編寫自己的映射。
如果我沒有弄錯,他要求文字顏色,而不是顏色的撫摸 – Erik 2012-02-06 13:59:56
@Erik:請參閱PDF參考(partners.adobe.com/public/developer/en/pdf/PDFReference.pdf)到了解文檔在PDF文檔中的着色方式。 – ipavlic 2012-02-06 14:22:35
感謝POC – Erik 2012-02-09 06:30:03