2012-06-01 7 views
7

Sto cercando di estrarre il testo con tutte le informazioni dal pdf utilizzando pdfbox. Ho tutte le informazioni che voglio, tranne il colore. Ho provato diversi modi per ottenere il fontcolor (incluso Getting Text Colour with PDFBox). Ma non funziona. E ora ho copiato il codice dalla classe PageDrawer di pdfBox. Ma poi anche il valore RGB non è corretto.Come ottenere il colore del font utilizzando 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()); 
    } 

Sto usando il codice sopra. I valori ottenuti sono r = 0, g = 0, b = 0, il valore dell'oggetto di cosp interno è [0.0], all'interno di pd object array = null e colorSpace = null. e il valore RGB è sempre -16777216. Mi aiuti per favore. Grazie in anticipo.

+1

vedo che si stanno ottenendo il nero, di che colore si aspetta? –

risposta

5

Ho provato il codice nel collegamento che hai postato e ha funzionato per me. I colori che torno sono 148,92, 179.01001 e 214,965. Vorrei poterti dare il mio PDF con cui lavorare, forse se lo immagazzino esternamente in SO? Il mio PDF ha usato una sorta di colore blu pallido e sembra corrispondere. Era solo una pagina di testo creata in Word 2010 ed esportata, niente di troppo intenso.

Un paio di suggerimenti ....

  1. Ricordiamo che il valore restituito è un galleggiante tra 0 e 1. Se un valore viene accidentalmente cast int, allora naturalmente i valori finirà contenente quasi tutto 0. il legata a multipli di codici da 255 a ottenere una gamma da 0 a 255.
  2. Come ha detto il commentatore, il colore più comune per un file PDF è il nero che è 0 0 0

Questo è tutto ciò a cui riesco a pensare ora, altrimenti ho la versione 1.7.1 di pdfbox e fontbox e lik e ho detto che ho praticamente seguito il link che hai dato.

EDIT

Sulla base di mie osservazioni, qui forse è un modo minorly invasivo di farlo per i file PDF come color.pdf?

In PDFStreamEngine.java nel metodo processOperator si può fare all'interno del blocco 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);   
} 

Questo ti mostrerà le informazioni, quindi è a voi per elaborare le informazioni sul colore per ogni sezione in base alle proprie esigenze. Ecco un frammento dall'inizio del l'uscita del codice di cui sopra, quando eseguito su 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 ......

Si vede nell'output sopra una sezione vuota BT ET, essendo questa una sezione che è segnato DeviceGray . Tutti gli altri forniscono i valori [0,1] per i componenti R, G e B

+1

Ma non sta funzionando per me. Ho risolto questo problema ricreando l'oggetto grafico. Ho scavalcato tutte le classi come PDRectangle pubblico findCropBox (PDPage pg), PDRectangle pubblico findMediaBox (PDPage pg), pubblico PDRectangle getMediaBox (PDPage pg), privato PDRectangle findParentCropBox (nodo PDPageNode), pubblico int findRotation (PDPage pg), pubblico intero getRotation (PDPage pg), PDRectangle pubblico getCropBox (PDPage pg), pubblico PDPageNode getParent (PDPage pg), e quindi ho ricreato oggetto grafico nella mia classe. Francamente non so cosa ho fatto. Ma ha funzionato per me. Controllerò di nuovo con le tue linee guida. – Neeraj

+1

Ho provato nuovamente il codice. Ma ancora l'out put è :: 25 Dic, 2012 2:20:01 PM org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: operazione non supportata/disabilitata: BDC 25 dic, 2012 2:20:10 PM org. apache.pdfbox.util.PDFStreamEngine processOperator INFO: operazione non supportata/disattivata: EMC DeviceGray 0.0 – Neeraj

+1

https://www.dropbox.com/s/vh2mf3oxl9f8bkx/color.pdf Questo è il mio pdf. – Neeraj

3

Ho trovato del codice in uno dei miei programmi di manutenzione.
Non so che funzioni per voi o no, per favore provatelo. controllare anche questo link http://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

Essa può aiutare

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

ho anche finito per fare qualcosa di simile. Incollare il codice qui sotto, spero che aiuti qualcuno.

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

Con il PDFBox verson 2.0+ è necessario scegliere questi operatori nel costruttore della vostra PDFTextStripper sovrascritti:

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

Solo allora getGraphicsState() restituirà una corretta informazione.

Vedi https://pdfbox.apache.org/2.0/migration.html