2012-06-01 74 views
7

我想從PDF使用pdfbox從所有信息中提取文本。除了顏色,我得到了我想要的所有信息。我嘗試了不同的方式來獲取fontcolor(包括Getting Text Colour with PDFBox)。但不工作。現在我複製了pdfBox的PageDrawer類中的代碼。但是,RGB值也不正確。如何使用pdfbox獲取字體顏色

protected void processTextPosition(TextPosition text) { 

     Composite com; 
     Color col; 
     switch(this.getGraphicsState().getTextState().getRenderingMode()) { 
     case PDTextState.RENDERING_MODE_FILL_TEXT: 
      com = this.getGraphicsState().getNonStrokeJavaComposite(); 
      int r =  this.getGraphicsState().getNonStrokingColor().getJavaColor().getRed(); 
      int g = this.getGraphicsState().getNonStrokingColor().getJavaColor().getGreen(); 
      int b = this.getGraphicsState().getNonStrokingColor().getJavaColor().getBlue(); 
      int rgb = this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB(); 
      float []cosp = this.getGraphicsState().getNonStrokingColor().getColorSpaceValue(); 
      PDColorSpace pd = this.getGraphicsState().getNonStrokingColor().getColorSpace(); 
      break; 
     case PDTextState.RENDERING_MODE_STROKE_TEXT: 
      System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString()); 
      System.out.println(this.getGraphicsState().getStrokingColor().getJavaColor().getRGB()); 
      break; 
     case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT: 
      //basic support for text rendering mode "invisible" 
      Color nsc = this.getGraphicsState().getStrokingColor().getJavaColor(); 
      float[] components = {Color.black.getRed(),Color.black.getGreen(),Color.black.getBlue()}; 
      Color c1 = new Color(nsc.getColorSpace(),components,0f); 
      System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString()); 
      break; 
     default: 
      System.out.println(this.getGraphicsState().getNonStrokeJavaComposite().toString()); 
      System.out.println(this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB()); 
    } 

我正在使用上面的代碼。得到的值是 r = 0,g = 0,b = 0,在cosp對象內部值爲[0.0],在pd對象數組內= null和colorSpace = null。而RGB值始終爲-16777216。請幫幫我。提前致謝。

+1

我看到你變黑了,你期待着什麼顏色? –

回答

5

我試過你發佈的鏈接中的代碼,它對我有用。我回來的顏色是148.92,179.01001和214.965。我希望我可以給你我的PDF格式,或者如果我把它存儲在SO外部?我的PDF使用了一種棕櫚色的顏色,而且看起來很匹配。這只是在Word 2010中創建並導出的一頁文本,沒有太多激烈的內容。

一些建議....

  1. 回想一下,返回的值是0和1之間的浮動如果一個值被意外鑄造爲int,那麼當然該值會因包含近所有由0. 255掛碼倍數來獲得一定範圍的0到255
  2. 正如評論者說,對於PDF文件最常見的顏色是黑色,而黑色是0 0 0

也就是說現在我只能想到,否則我有pdfbox和fontbox和lik 1.7.1的版本我說我非常喜歡你給的鏈接。

編輯

基於我的意見,這裏也許是做它的PDF文件像color.pdf的minorly侵入性的方式?

PDFStreamEngine.javaprocessOperator方法可以try塊

if (operation.equals("RG")) { 
    // stroking color space 
    System.out.println(operation); 
    System.out.println(arguments); 
} else if (operation.equals("rg")) { 
    // non-stroking color space 
    System.out.println(operation); 
    System.out.println(arguments); 
} else if (operation.equals("BT")) { 
    System.out.println(operation);  
} else if (operation.equals("ET")) { 
    System.out.println(operation);   
} 

這將顯示你的信息裏面做,那麼它是由您根據您的需要處理各部分的顏色信息。下面是從當上color.pdf運行上面的代碼的輸出開始的一個片段:

BT rG [COSInt(1), COSInt(0), CosInt(0)] RG [COSInt(1), COSInt(0), CosInt(0)] ET BT ET BT rG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] RG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] ET ......

你在上面的輸出看空BT ET部分,這是它被標記DEVICEGRAY節。所有其他給你R,G和B組件的[0,1]值

+1

但它不適合我。我通過重新創建圖形對象來解決此問題。我重寫了所有的類像公共PDRectangle findCropBox(PDPage頁),公共PDRectangle findMediaBox(PDPage頁),公共PDRectangle getMediaBox(PDPage頁),私人PDRectangle findParentCropBox(PDPageNode節點),公共int findRotation(PDPage頁),公共整數getRotation PDPage pg),public PDRectangle getCropBox(PDPage pg),public PDPageNode getParent(PDPage pg),然後我在我的類中重新創建圖形對象。坦率地說,我不知道我做了什麼。但它爲我工作。我會再次檢查你的指導方針。 – Neeraj

+1

我再次嘗試了代碼。但仍然是:2012年12月25日下午2:20:01 org.apache.pdfbox.util.PDFStreamEngine processOperator 信息:不支持/禁用操作:BDC 25 Dec,2012 2:20:10 PM org。 apache.pdfbox.util.PDFStreamEngine processOperator 信息:不支持/禁用操作:EMC DeviceGray 0.0 – Neeraj

+1

https://www.dropbox.com/s/vh2mf3oxl9f8bkx/color.pdf這是我的pdf。 – Neeraj

3

我在我的一個維護程序中發現了一些代碼。
我不知道它是否適用於您,請嘗試它。 還檢查了這個鏈接http://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

它可以幫助你

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(); 
    } 
5

我也結束了做這樣的事情。粘貼下面的代碼,希望它可以幫助某人。

import java.io.IOException; 
import java.util.List; 
import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState; 
import org.apache.pdfbox.util.PDFTextStripper; 
import org.apache.pdfbox.util.ResourceLoader; 
import org.apache.pdfbox.util.TextPosition; 

public class Parser extends PDFTextStripper { 

public Parser() throws IOException { 
    super(ResourceLoader.loadProperties(
      "org/apache/pdfbox/resources/PageDrawer.properties", true)); 
    super.setSortByPosition(true); 
} 

public void parse(String path) throws IOException{ 
    PDDocument doc = PDDocument.load(path); 
    List<PDPage> pages = doc.getDocumentCatalog().getAllPages(); 
    for (PDPage page : pages) { 
     this.processStream(page, page.getResources(), page.getContents().getStream()); 
    } 
} 

@Override 
protected void processTextPosition(TextPosition text) { 
    try { 
     PDGraphicsState graphicsState = getGraphicsState(); 
     System.out.println("R = " + graphicsState.getNonStrokingColor().getJavaColor().getRed()); 
     System.out.println("G = " + graphicsState.getNonStrokingColor().getJavaColor().getGreen()); 
     System.out.println("B = " + graphicsState.getNonStrokingColor().getJavaColor().getBlue()); 
    } 
    catch (IOException ioe) {} 

} 

public static void main(String[] args) throws IOException, COSVisitorException { 
    Parser p = new Parser(); 
    p.parse("/Users/apple/Desktop/123.pdf"); 
} 

} 
1

隨着PDFBOX VERSON 2.0+有必要在你的覆蓋PDFTextStripper的構造函數來選擇這些運營商:

addOperator(new SetStrokingColorSpace()); 
addOperator(new SetNonStrokingColorSpace()); 
addOperator(new SetStrokingDeviceCMYKColor()); 
addOperator(new SetNonStrokingDeviceCMYKColor()); 
addOperator(new SetNonStrokingDeviceRGBColor()); 
addOperator(new SetStrokingDeviceRGBColor()); 
addOperator(new SetNonStrokingDeviceGrayColor()); 
addOperator(new SetStrokingDeviceGrayColor()); 
addOperator(new SetStrokingColor()); 
addOperator(new SetStrokingColorN()); 
addOperator(new SetNonStrokingColor()); 
addOperator(new SetNonStrokingColorN()); 

只有這樣getGraphicsState()將返回正確的信息。

請參閱https://pdfbox.apache.org/2.0/migration.html