2012-06-01 23 views
7

Estoy tratando de extraer texto con toda la información del pdf usando pdfbox. Obtuve toda la información que quiero, excepto el color. Probé diferentes formas de obtener fontcolor (incluido Getting Text Colour with PDFBox). Pero no funciona Y ahora copié el código de la clase PageDrawer de pdfBox. Pero también el valor RGB no es correcto.Cómo obtener el color de fuente usando 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()); 
    } 

Estoy usando el código anterior. Los valores que obtienen son r = 0, g = 0, b = 0, el interior del valor del objeto cosp es [0.0], dentro del objeto pd array = null y colorSpace = null. y el valor RGB es siempre -16777216. Por favor, ayúdame. Gracias por adelantado.

+1

veo que está recibiendo negro, de qué color son sus expectativas? –

Respuesta

5

Probé el código en el enlace que publicó y funcionó para mí. Los colores que obtengo son 148.92, 179.01001 y 214.965. Me gustaría poder darle mi PDF para trabajar, tal vez si lo almaceno externamente a SO? Mi PDF usa una especie de color azul pálido y parece coincidir. Era solo una página de texto creada en Word 2010 y exportada, nada demasiado intensa.

Un par de sugerencias ....

  1. Recordemos que el valor devuelto es un flotador entre 0 y 1. Si un valor es arrojado accidentalmente a int, entonces, por supuesto, los valores terminará contiene casi todos 0. la vinculado a múltiplos de código por 255 para obtener un rango de 0 a 255.
  2. Como dijo el comentarista, el color más común para un archivo PDF es negro, que es 0 0 0

Eso es todo lo que puedo pensar ahora, de lo contrario tengo la versión de 1.7.1 de pdfbox y fontbox y lik Dije que prácticamente seguí el enlace que me diste.

EDITAR

Con base en mis comentarios, aquí quizás es una forma minorly invasivo de hacer que los archivos PDF como color.pdf?

En PDFStreamEngine.java en el método processOperator uno puede hacer dentro del bloque 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);   
} 

Esto le mostrará la información, entonces le corresponde a usted para procesar la información de color para cada sección de acuerdo a sus necesidades. Aquí hay un fragmento desde el comienzo de la salida del código anterior cuando se ejecuta en 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 ......

Se puede ver en la salida por encima de una sección de BT ET vacío, siendo esta una sección que aparece DeviceGray . Todos los demás le dan valores [0,1] para los componentes R, G y B

+1

Pero no funciona para mí. Resolví este problema recreando objetos gráficos. Anulé todas las clases como PDRectangle público findCropBox (PDPage pg), PDRectangle público findMediaBox (PDPage pg), PDRectangle público getMediaBox (PDPage pg), PDRectangle privado findParentCropBox (nodo PDPageNode), public int findRotation (PDPage pg), entero público getRotation (PDPágina pg), PDRectangle público getCropBox (PDPage pg), público PDPageNode getParent (PDPage pg), y luego recreé el objeto gráfico en mi clase. Francamente, no sé lo que hice. Pero funcionó para mí. Verificare nuevamente con sus lineamientos. – Neeraj

+1

Probé el código nuevamente. Pero aún así, la salida es :: 25 Dic, 2012 2:20:01 PM org.apache.pdfbox.util.PDFStreamEngine processOperator INFORMACIÓN: operación no admitida/deshabilitada: BDC 25 de diciembre, 2012 2:20:10 PM org. apache.pdfbox.util.PDFStreamEngine processOperator INFORMACIÓN: operación no admitida/deshabilitada: EMC DeviceGray 0.0 – Neeraj

+1

https://www.dropbox.com/s/vh2mf3oxl9f8bkx/color.pdf Este es mi pdf. – Neeraj

3

Encontré algunos códigos en uno de mis programas de mantenimiento.
No sé si funciona para ti o no, por favor pruébalo. También puedes ver este enlace http://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

Puede ayudarle a

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

también terminé haciendo algo como esto. Pegando el código a continuación, espero que ayude a alguien.

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 la PDFBox Verson 2.0+ es necesario elegir estos operadores en el constructor de su PDFTextStripper sobrescrito:

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

Sólo entonces getGraphicsState() devolverá la información adecuada.

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

Cuestiones relacionadas