2012-08-10 16 views
8

को पार्स करते समय अजीब सफेद जगहें मुझे पीडीएफ दस्तावेज़ का विश्लेषण करने की आवश्यकता है। मैंने पहले से ही पार्सर लागू किया है और लाइब्रेरी iText का उपयोग किया है और अब तक यह किसी भी समस्या के बिना काम करता है।पीडीएफ

लेकिन कोई मुझे एक और दस्तावेज है जो शब्दों के बीच में बहुत ही अजीब व्हाइटस्पेस हो जाता है पार्स करने के लिए की जरूरत है। उदाहरण के रूप में मैं:

वो rber eitung auf मर Motorr adsaison। Viele Motorr एडीएफ Ahr एर

सभी बोल्ड शब्द जोड़ा जाना चाहिए, लेकिन किसी भी तरह पीडीएफ पार्सर शब्दों में व्हाइटस्पेस जोड़ रहा है। लेकिन जब मैं पीडीएफ से सामग्री को एक टेक्स्टफाइल में कॉपी और पेस्ट करता हूं तो मुझे इन रिक्त स्थान नहीं मिलते हैं।

सबसे पहले मैंने सोचा कि यह मेरे द्वारा उपयोग पीडीएफ पार्सिंग पुस्तकालय की वजह से है, लेकिन यह भी एक और पुस्तकालय के साथ मैं ठीक उसी मुद्दा मिलता है।

मैंने पार्स किए गए शब्दों से singleSpaceWidth पर एक नज़र डाली और मैंने देखा कि यह एक सफेद जगह जोड़ते समय हमेशा भिन्न होता है। मैंने उन्हें मैन्युअल रूप से एक साथ रखने की कोशिश की। लेकिन चूंकि शब्दों को पुन: संयोजित करने के लिए वास्तव में कोई पैटर्न नहीं है, यह लगभग असंभव है।

किसी और ने वही समस्या या कि समस्या के लिए भी एक समाधान किया है?

SemTextExtractionStrategy साथ पार्स:

PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src); 

SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy(); 

for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    // Set the page number on the strategy. Is used in the Parsing strategies. 
    semTextExtractionStrategy.pageNumber = i; 

    // Parse text from page 
    PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy); 
} 

के रूप में अनुरोध किया है, यहाँ कुछ और जानकारी है

यहां से SemTextExtractionStrategy विधि जो वास्तव में टी को पार करती है ext। वहाँ मैं मैन्युअल रूप से पता लगाने में हर पार्स शब्द एक खाली स्थान के बाद जोड़ने के लिए, लेकिन किसी भी तरह इसे विभाजित करता है शब्द:

@Override 
public void parseText(TextRenderInfo renderInfo, int pageNumber) {  

    this.pageNumber = pageNumber; 

    String text = renderInfo.getText(); 

    currTextBlock.getText().append(text + " "); 

    .... 
} 

यहाँ पूरे SemTextExtraction क्लास है, लेकिन में यह केवल ऊपर (parseText) से विधि कॉल करता है:

public class SemTextExtractionStrategy implements TextExtractionStrategy { 

    // Text Extraction Strategies 
    public ColumnDetecter columnDetecter = new ColumnDetecter(); 

    // Image Extraction Strategies 
    public ImageRetriever imageRetriever = new ImageRetriever(); 

    public int pageNumber = -1; 

    public ArrayList<TextParsingStrategy> textParsingStrategies = new ArrayList<TextParsingStrategy>(); 
    public ArrayList<ImageParsingStrategy> imageParsingStrategies = new ArrayList<ImageParsingStrategy>(); 

    public SemTextExtractionStrategy() { 

     // Add all text parsing strategies which are later on applied on the extracted text 
     // textParsingStrategies.add(fontSizeMatcher); 
     textParsingStrategies.add(columnDetecter); 

     // Add all image parsing strategies which are later on applied on the extracted text 
     imageParsingStrategies.add(imageRetriever); 
    } 

    @Override 
    public void beginTextBlock() { 

    } 

    @Override 
    public void renderText(TextRenderInfo renderInfo) { 
     // TEXT PARSING 
     for(TextParsingStrategy strategy : textParsingStrategies) { 
      strategy.parseText(renderInfo, pageNumber); 
     } 
    } 

    @Override 
    public void endTextBlock() { 

    } 

    @Override 
    public void renderImage(ImageRenderInfo renderInfo) { 
     for(ImageParsingStrategy strategy : imageParsingStrategies) { 
      strategy.parseImage(renderInfo); 
     } 
    } 
} 
+0

कृपया उपयोग किए जाने वाले आईटेक्स्ट के संस्करण को बताएं और किसी भी तरह आपको पीडीएफ भी प्रदान करना होगा, और जिस कोड को आप पार्सिंग करते हैं। – Eugene

+0

उपरोक्त पद में सभी जानकारी जोड़ा गया। – Prine

+0

आपके द्वारा उपयोग किए जाने वाले TextExtractionStrategy क्लास के बारे में क्या है? – Eugene

उत्तर

2

मैं निम्नलिखित Ghostscript कमांड के साथ दिए गए पीडीएफ फाइल कार्रवाई की है:

gs -o out.pdf -q -sDEVICE=pdfwrite -dOptimize=false -dUseFlageCompression=false -dCompressPages=false -dCompressFonts=false whitespacesProblem.pdf 

यह आदेश एक फ़ाइल out.pdf, जो धारा एन्कोडिंग नहीं है बनाया है, तो यह बेहतर पठनीय है।

[ 
    (&;&)-287.988 
    (672744)29.9906 
    (+\(%)30.01 
    (+!4)29.9876 
    (&4)-287.989 
    (%4)30.0039 
    (&1&8)-287.975 
    (3=\)!)-288.021 
    (*&4)30.0212 
    (&=23)-287.996 
    (+1%)-287.99 
    (\(=&)-288.011 
    (8&1&)-287.974 
    (672744)29.9906 
    (+\(3+=378$)-250.977 
    (#7\)!) 
]TJ 

कोष्ठकों के बीच पाठ वर्णों हैं: दिलचस्प हिस्सा लाइन 52 है, जो मैं पठनीयता के लिए कई पंक्तियों में विभाजित है। मैंने उनमें से कुछ को बदल दिया और प्रस्तुत पीडीएफ फ़ाइल को देखने के लिए देखा कि कौन सा चरित्र किस ग्लिफ का प्रतिनिधित्व करता है। फिर मैंने पाठ को डीकोड किया:

[ 
    (ele)-287.988 
    (Motorr)29.9906 *** 
    (adf)30.01 *** 
    (ahr)29.9876 *** 
    (er)-287.989 
    (fr)30.0039 
    (euen)-287.975 
    (sich)-288.021 
    ... 
] 

तो वास्तव में वर्णों के बीच सफेद जगह है। आपके मामले में यह शायद फ़ॉन्ट का कर्नाई है। सवाल यह है कि अब आपकी पीडीएफ लाइब्रेरी इस व्हाइटस्पेस को कैसे समझती है, और ऐसा लगता है कि परिणामी स्ट्रिंग में भी एक जगह में "ऋणात्मक सफेद जगह" प्रदान की जाती है।

+0

क्या इस या कार्यान्वयन से छुटकारा पाने का कोई तरीका है? – NinjaOnSafari

+0

और आपने पीडीएफ उत्पन्न करने के लिए किस टूल का उपयोग किया है? – NinjaOnSafari

+0

यह घोस्टस्क्रिप्ट है; मैंने इसे स्पष्ट करने के लिए उत्तर संपादित किया है। संकेत के लिए धन्यवाद। –

0

क्योंकि दस्तावेज़ आप हैं, वे कॉलम में विभाजित है, स्पष्ट त्रुटि

SemTextExtractionStrategy

के अंदर है

कक्षा। मुझे लगता है कि कक्षा कॉलमडेटेटर संभवतः दोषी ठहराया जाना चाहिए और iText नहीं। मैं केवल यह मान सकता हूं कि इसे कॉलम के आकार के आधार पर लागू किया गया है, फिर उस पर आधारित टेक्स्ट पुनर्प्राप्त करता है।

यदि आप केवल टेक्स्ट चाहते हैं, तो कॉलम के आकार के आधार पर कार्यान्वयन सरल हो सकता है।

+0

आपके उत्तर के लिए धन्यवाद। मैं निश्चित रूप से ColumnDetecter में एक नज़र रखना होगा। लेकिन parseText विधि इस वर्ग से है और वहां मुझे आउटपुट सीधे iText लाइब्रेरी से मिलता है जहां शब्द पहले ही विभाजित होते हैं .. – Prine

1

पीडीएफ में व्हाइटस्पेस के रूप में रोलाण्ड द्वारा यहां पर जवाब द्वारा वर्णित है और यह भी https://issues.apache.org/jira/browse/TIKA-724

जवाब यह है कि यह भी मेरे लिए काम किया की पहली टिप्पणी में देखा एक ज्ञात समस्या है https://github.com/smalot/pdfparser/issues/72 पर huuhungus द्वारा देखा एक हैं

जो PDFParser लिए विशिष्ट है और यह अगर आप जानते हैं कि आप इस समस्या को होगा कोड है कि वास्तव में PDFParser को यह अतिरिक्त जगह कहते हैं बदलने के लिए है:

sr c/Smalot/PdfParser/इस लाइन

$text .= ' '; 
बाहर टिप्पणी Object.php

नहीं पूरी तरह से इसे ठीक है, लेकिन यह स्वीकार्य

अन्य पुस्तकालयों में है भी समान अस्थायी फिक्स हो सकता है ताकि वे इस मुद्दे के साथ मदद कर सकता है कुछ मामलों में।

+0

iText 5.2.1 अब एक प्राचीन संस्करण है। मौजूदा संस्करणों में गुणों को ट्यून करने के लिए प्रॉपर्टी/अतिरंजित विधियां हैं जिनके परिस्थितियों में iText एक स्पेस जोड़ता है और जिसमें नहीं। अंतरिक्ष को कभी भी जोड़ना सामान्य रूप से खराब विकल्प नहीं है, कई पीडीएफ तब उनके पाठ को शायद ही कभी किसी भी रिक्त स्थान से निकाले जाएंगे। – mkl