2012-06-01 13 views
7

का उपयोग कर फ़ॉन्ट रंग कैसे प्राप्त करें मैं पीडीएफबॉक्स का उपयोग कर पीडीएफ से सभी जानकारी के साथ पाठ निकालने का प्रयास कर रहा हूं। रंग को छोड़कर, मुझे जो जानकारी चाहिए वह मुझे मिल गई। मैंने फ़ॉन्ट रंग प्राप्त करने के विभिन्न तरीकों की कोशिश की (Getting Text Colour with 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], पीडी ऑब्जेक्ट सरणी = null और colorSpace = null के अंदर। और आरजीबी मूल्य हमेशा -16777216 है। क्रिप्या मेरि सहायता करे। अग्रिम में धन्यवाद।

+1

देखें मैं देख रहा हूँ आप काला हो रही है, क्या रंग आप उम्मीद कर रहे हैं? –

उत्तर

5

मैंने आपके द्वारा पोस्ट किए गए लिंक में कोड की कोशिश की और यह मेरे लिए काम किया। जिन रंगों को मैं वापस प्राप्त करता हूं वे 148.9 2, 17 9 .01001 और 214.9 65 हैं। काश मैं आपको काम करने के लिए अपना पीडीएफ दे सकता हूं, शायद अगर मैं इसे बाहरी रूप से एसओ में स्टोर करता हूं? मेरे पीडीएफ ने एक प्रकार का खूबसूरत नीला रंग इस्तेमाल किया और ऐसा लगता है कि यह मेल खाता है। यह शब्द 2010 में बनाए गए पाठ का केवल एक पृष्ठ था और निर्यात किया गया था, कुछ भी गहन नहीं था।

सुझावों में से एक जोड़े को ....

  1. याद रखें कि दिए गए मान 0 और 1. के बीच एक नाव एक मूल्य गलती से int करने के लिए डाली जाती है, तो है, तो निश्चित रूप से मूल्यों लगभग युक्त खत्म हो जाएगा सभी 0. 255 से कोड गुणकों से जुड़ा हुआ है 255
  2. को 0 की एक सीमा प्राप्त करने के लिए के रूप में टिप्पणीकार ने कहा, एक PDF फ़ाइल के लिए सबसे आम रंग काला है जो है 0 0 0

है मैं अब के बारे में सोच सकता हूं, अन्यथा मेरे पास पीडीएफबॉक्स और फ़ॉन्टबॉक्स और पसंद के 1.7.1 का संस्करण है ई मैंने कहा कि मैंने आपके द्वारा दिए गए लिंक का बहुत पालन किया है।

संपादित

मेरी टिप्पणी के आधार पर, यहाँ शायद color.pdf तरह पीडीएफ फाइलों के लिए यह करने का एक minorly आक्रामक तरीका है?

processOperator विधि एक कोशिश ब्लॉक

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

यह आपको जानकारी दिखाएगा अंदर क्या कर सकते हैं में PDFStreamEngine.java में, तो यह आपकी आवश्यकताओं के अनुसार प्रत्येक अनुभाग के लिए रंग जानकारी प्रक्रिया आप पर निर्भर है। यहाँ ऊपर कोड जब 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 ......

आप उपरोक्त उत्पादन में देखते हैं एक खाली बीटी एट अनुभाग, इस किया जा रहा है एक वर्ग जो DEVICEGRAY चिह्नित है है । अन्य सभी आपको आर, जी और बी घटकों के लिए [0,1] मान देते हैं

+1

लेकिन यह मेरे लिए काम नहीं कर रहा है। मैंने ग्राफ़िक ऑब्जेक्ट को पुनर्निर्मित करके इस समस्या को हल किया। मैंने सार्वजनिक पीडीआरक्टेंगल खोजक्रॉपबॉक्स (पीडीपीएजी पीजी), सार्वजनिक पीडीआरक्टेंगल खोज मीडियाबॉक्स (पीडीपीज पीजी), सार्वजनिक पीडीआरक्टेंगल मिलमेडियाबॉक्स (पीडीपीज पीजी), निजी पीडीआरक्टेंगल खोजपेंटक्रॉपबॉक्स (पीडीपीज नोड नोड), सार्वजनिक int findRotation (PDPage pg), सार्वजनिक इंटीजर getRotation (पीडीपीज पीजी), सार्वजनिक पीडीआरक्टेंगल मिल क्रॉपबॉक्स (पीडीपीज पीजी), सार्वजनिक पीडीपीज नोड getParent (PDPage pg), और फिर मैंने अपनी कक्षा में ग्राफिक ऑब्जेक्ट को फिर से बनाया। स्पष्ट रूप से मुझे नहीं पता कि मैंने क्या किया। लेकिन यह मेरे लिए काम किया। मैं आपके दिशानिर्देशों के साथ फिर से जांच करूंगा। – Neeraj

+1

मैंने कोड को दोबारा कोशिश की। लेकिन अभी भी बाहर रखा गया है :: 25 दिसंबर, 2012 2:20:01 अपराह्न org.apache.pdfbox.util.PDFStreamEngine प्रक्रियाऑपरेटर जानकारी: असमर्थित/अक्षम ऑपरेशन: बीडीसी 25 दिसंबर, 2012 2:20:10 अपराह्न संगठन। apache.pdfbox.util.PDFStreamEngine प्रक्रियाऑपरेटर जानकारी: असमर्थित/अक्षम ऑपरेशन: ईएमसी डिवाइसग्रे 0.0 – Neeraj

+1

https://www.dropbox.com/s/vh2mf3oxl9f8bkx/color.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 2.0+ verson यह आवश्यक है अपने ओवरराइट 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

संबंधित मुद्दे