2012-06-01 15 views
7

Próbuję wyodrębnić tekst ze wszystkimi informacjami z pdf za pomocą pdfbox. Mam wszystkie potrzebne informacje, z wyjątkiem koloru. Próbowałem różnych sposobów, aby uzyskać kolor czcionki (w tym Getting Text Colour with PDFBox). Ale nie działa. A teraz skopiowałem kod z klasy PageDrawer pdfBox. Ale także wartość RGB nie jest poprawna.Jak uzyskać kolor czcionki za pomocą 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()); 
    } 

Używam powyższego kodu. Otrzymywane wartości wynoszą r = 0, g = 0, b = 0, wewnątrz wartości obiektu cosp jest [0.0], wewnątrz obiektu pd = null i colorSpace = null. a wartość RGB zawsze wynosi -16777216. Proszę pomóż mi. Z góry dziękuję.

+1

widzę otrzymujesz czarne, jaki kolor się spodziewasz? –

Odpowiedz

5

Próbowałem kod w linku pisał i pracował dla mnie. Kolory, które otrzymuję, to 148,92, 179,01001 i 214,965. Żałuję, że nie mogę dać ci mojego pliku PDF do pracy, może jeśli przechowywam go na zewnątrz do SO? Mój plik PDF używał swego rodzaju niebieskawego koloru i wydaje się pasować. To była tylko jedna strona tekstu utworzonego w programie Word 2010 i wyeksportowana, nic zbyt intensywnego.

Kilka sugestii ....

  1. Przypomnijmy, że wartość zwracana jest pływak między 0 i 1. Jeżeli wartość nie jest przypadkowo oddanych do int, to oczywiście wartości skończy zawierający prawie wszystko 0. związana wielokrotności kodu przez 255, aby uzyskać zakres od 0 do 255.
  2. Jako komentator powiedział, najczęściej koloru dla pliku PDF jest czarny, który jest 0 0 0

to wszystko, co mogę teraz myśleć, w przeciwnym razie mam wersję 1.7.1 pdfbox i fontbox i lik Powiedziałem, że podążałem za łącznikiem, który podałeś.

EDIT

Na podstawie moich komentarzach, tutaj chyba jest minorly inwazyjny sposób to zrobić dla plików pdf jak color.pdf?

W PDFStreamEngine.java w metodzie processOperator można zrobić wewnątrz bloku 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);   
} 

To pokaże informację, to do ciebie, aby przetwarzać informacje kolorów dla każdej sekcji w zależności od potrzeb. Oto fragment z początku produkcji powyższym kodzie, gdy działają na 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 ......

zobaczyć na powyższym wyjściu pustą sekcję BT ET, to jest odcinek, który jest oznaczony DEVICEGRAY . Wszystkie inne daje [0,1] wartości dla R, G i B komponenty

+1

Ale to nie działa dla mnie. Rozwiązałem ten problem, odtwarzając obiekt graficzny. Nadpisałem wszystkie klasy, takie jak publiczny PDRectangle findCropBox (PDPage pg), publiczny PDRectangle findMediaBox (PDPage pg), publiczny PDRectangle getMediaBox (PDPage pg), prywatny PDRectangle findParentCropBox (węzeł PDPageNode), publiczny int findRotation (PDPage pg), publiczny getogot Integer (PDPage pg), publiczny PDRectangle getCropBox (PDPage pg), publiczny PDPageNode getParent (PDPage pg), a następnie odtworzyłem obiekt graficzny w mojej klasie. Szczerze mówiąc nie wiem, co zrobiłem. Ale zadziałało to dla mnie. Sprawdzę ponownie za pomocą twoich wytycznych. – Neeraj

+1

Próbowałem ponownie kodu. Ale nadal nie jest to :: 25 grudnia 2012 2:20:01 org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: operacja nieobsługiwana/wyłączona: BDC 25 grudnia 2012 2:20:10 PM org. apache.pdfbox.util.PDFStreamEngine processOperator INFO: operacja nieobsługiwane/wyłączone: EMC DeviceGray 0,0 – Neeraj

+1

https://www.dropbox.com/s/vh2mf3oxl9f8bkx/color.pdf to mój pdf. – Neeraj

3

znalazłem jakiś kod w jednym z moim programem obsługi technicznej.
Nie wiem, czy to działa, czy nie, spróbuj. Sprawdź również ten link http://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

To może pomóc

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

ja również zakończyła się robi coś takiego. Wklejając poniższy kod, mam nadzieję, że komuś pomaga.

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

Z PDFBox verson 2.0+ konieczne jest wybrać te operatory w konstruktorze swojej nadpisane 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()); 

Dopiero wtedy getGraphicsState() zwróci właściwą informację.

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

Powiązane problemy