2011-01-17 11 views
16

मैं एक पीडीएफ फ़ाइल से टेक्स्ट सामग्री प्राप्त करने के लिए vex.net पर itextsharp का उपयोग कर रहा हूं। समाधान कुछ फ़ाइलों के लिए ठीक काम करता है लेकिन अन्य लोगों के लिए भी नहीं। समस्या टोकन stringvalue (खाली वर्ग बक्से का एक सेट)Itextsharp टेक्स्ट निष्कर्षण

token = New iTextSharp.text.pdf.PRTokeniser(pageBytes) 
    While token.NextToken() 
     tknType = token.TokenType() 
     tknValue = token.StringValue 

मैं सामग्री की लंबाई meassure कर सकते हैं शून्य पर सेट किया गया है, लेकिन मैं वास्तविक स्ट्रिंग सामग्री नहीं मिल सकता है।

मुझे एहसास हुआ कि यह पीडीएफ के फ़ॉन्ट के आधार पर होता है। अगर मैं कूरियर के साथ एक्रोबैट या पीडीएफ क्रिएटर का उपयोग कर पीडीएफ बनाता हूं (जिस तरह से मेरे विजुअल स्टूडियो एडिटर में डिफ़ॉल्ट फ़ॉन्ट है) तो मैं सभी टेक्स्ट सामग्री प्राप्त कर सकता हूं। यदि एक ही पीडीएफ एक अलग फ़ॉन्ट का उपयोग करके बनाया गया है तो मुझे खाली वर्ग बॉक्स मिल गए हैं।

अब सवाल है, मैं कैसे पाठ फ़ॉन्ट सेटिंग कुछ भी हो निकाल सकते हैं है?

धन्यवाद

उत्तर

14

चेक बाहर PdfTextExtractor

String pageText = 
    PdfTextExtractor.getTextFromPage(myReader, pageNum); 

या

String pageText = 
    PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy()); 

दोनों iText [तीव्र] की काफी हाल के संस्करण की आवश्यकता है। असल में सामग्री स्ट्रीम को पार्स करना सिर्फ इस बिंदु पर पहिया को फिर से शुरू करना है। अपने आप को कुछ दर्द दूर करो और iText इसे आपके लिए करें।

पीडीएफटेक्स्ट एक्स्ट्रेक्टर आपके लिए सभी अलग-अलग फ़ॉन्ट/एन्कोडिंग मुद्दों को संभालेगा ... वे सभी जिन्हें किसी भी तरह से संभाला जा सकता है। यदि आप रीडर से सटीक रूप से कॉपी/पेस्ट नहीं कर सकते हैं, तो सामग्री स्ट्रीम से चरित्र जानकारी प्राप्त करने के लिए पीडीएफ में पर्याप्त जानकारी मौजूद नहीं है।

35

मार्क जवाब के लिए पूरक है कि मुझे मदद करता है एक बहुत .iTextSharp कार्यान्वयन नामस्थान और वर्गों जावा संस्करण

public static string GetTextFromAllPages(String pdfPath) 
    { 
     PdfReader reader = new PdfReader(pdfPath); 

     StringWriter output = new StringWriter(); 

     for (int i = 1; i <= reader.NumberOfPages; i++) 
      output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy())); 

     return output.ToString(); 
    } 
+0

+1 बल्कि सिर्फ एक पंक्ति –

+0

से, कोड की एक पूरी उदाहरण देने के लिए यह संभव है 'एफ़टीपी सर्वर' iTextSharp का उपयोग करने पर फ़ाइल निकालने के लिए? – Munavvar

+0

@ मणववार, दुर्भाग्य से मेरे पास ऐसा अनुभव नहीं था। लेकिन आमतौर पर आप फ़ाइल स्ट्रीम या बाइनरी के एफआरएस में एफ़टीपी से पढ़ सकते हैं और ItextSharp –

4

से थोड़ा अलग हैं यहाँ iTextSharp.text.pdf.PdfName.ANNOTS और iTextSharp के साथ एक संस्करण है। text.pdf.PdfName.CONTENT अगर किसी को इसकी आवश्यकता है।

 string strFile = @"C:\my\path\tothefile.pdf"; 
     iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile); 
     iTextSharp.text.pdf.PRTokeniser prtTokeneiser; 
     int pageFrom = 1; 
     int pageTo = pdfRida.NumberOfPages; 
     iTextSharp.text.pdf.PRTokeniser.TokType tkntype ; 
     string tknValue; 

     for (int i = pageFrom; i <= pageTo; i++) 
     { 
      iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i); 
      iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS); 

      if(cannots!=null) 
       foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList) 
       { 
        iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number); 

        iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS); 
        if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString)) 
        { 
         string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString(); 
         if (cStringVal.ToUpper().Contains("LOS 8")) 
         { // DO SOMETHING FUN 

         } 
        } 
       } 
     } 
     pdfRida.Close();