2011-10-19 8 views
5

मैं कुछ पीडीएफ फाइलों की टेक्स्ट सामग्री निकालने के लिए एबीसीपीडीएफ का उपयोग कर रहा हूं, विशेष रूप से डॉक.गेटटेक्स्ट ("टेक्स्ट") को कॉल करके। (आप प्रति पृष्ठ एक बार एक लूप में इसे कॉल करते हैं।) यह आमतौर पर अच्छी तरह से काम करता है, लेकिन कुछ पीडीएफ फाइलों के लिए परिणामी पाठ में अंतरिक्ष वर्णों की कमी के साथ टेक्स्ट होता है, उदा।क्या मैं एबीसीपीडीएफ को शब्दों को मैशिंग करने से रोक सकता हूं (उदा। मैशिंगवर्ड एक साथ) पाठ को पीडीएफ कनवर्टर करते समय?

यह सुनिश्चित करें कि'thaveanyspacesbetweenwords।

दिलचस्प बात यह है है अगर मैं ठीक उसी पीडीएफ़ अपाचे टीका (PDFBox द्वारा हुड के नीचे संचालित) का उपयोग करने से पाठ निकालने के लिए प्रयास करते हैं, मैं सभी रिक्त स्थान मैं शब्दों के बीच उम्मीद थी प्राप्त करते हैं। यही है, उपरोक्त वाक्य Tika द्वारा

इस वाक्य में शब्दों के बीच कोई स्थान नहीं है।

कुल मिलाकर, दो उपकरण कार्य जैसे वे अलग गलतियों को करने से डर रहे हैं - दुनिया में सबसे बुरी बात की तरह ABCpdf कार्य करता है, एक जगह है जहाँ एक का नहीं है सम्मिलित करने के लिए, जबकि टीका की तरह काम करता होगा दुनिया में सबसे बुरी चीज एक ऐसी जगह डालने में असफल होगी जहां कोई संबंधित है।

क्या एबीसीपीडीएफ इस संबंध में टीका की तरह अधिक कार्य करने के लिए कोई सेटिंग है?

उत्तर

4

लघु उत्तर: अगर वहाँ लेआउट रिक्ति है कि वास्तविक रिक्त स्थान के रूप में व्यवहार किया जाना चाहिए है आप Doc.GetText("SVG") के माध्यम से पाठ के अलग-अलग टोकन प्राप्त कर सकते हैं, TEXT और TSPAN तत्वों के लिए XML पार्स करने, और निर्धारित करने। पीडीएफबॉक्स से जो व्यवहार आप देख रहे हैं वह संभवतः उस धारणा को बनाने का प्रयास है। इसके अलावा, एडोब एक्रोबैट भी क्लिपबोर्ड के माध्यम से स्पेस टेक्स्ट वापस कर सकता है क्योंकि पीडीएफबॉक्स करता है।

लंबे उत्तर: इससे अधिक समस्याएं हो सकती हैं, क्योंकि यह पीडीएफ में पाठ का मूल उद्देश्य नहीं हो सकता है।

एबीसीपीडीएफ सही चीज़ कर रहा है, क्योंकि पीडीएफ स्पेक केवल वर्णन करता है कि आउटपुट माध्यम में चीजें कहाँ रखी जानी चाहिए। कोई एक पीडीएफ फ़ाइल बना सकता है जो एबीसीपीडीएफ दोनों शैलियों में व्याख्या करता है, भले ही मूल वाक्य लगभग समान दिखता है।

यह प्रदर्शित करने के लिए, यहां एडोब इनडिज़ीन से दस्तावेज़ का एक स्नैपशॉट है जो आपके नमूना वाक्य के लिए दोनों मामलों से मेल खाने वाला टेक्स्ट लेआउट दिखाता है।

Snapshot From Adobe InDesign of a Specially Constructed PDF with Layout Spaces versus Text Spaces

ध्यान दें कि पहली पंक्ति वास्तविक रिक्तियों के साथ निर्माण नहीं किया गया था, बजाय, शब्द अलग-अलग पाठ क्षेत्रों में हाथ से रखा जाता है और एक ठीक से स्थान दिया गया है वाक्य की तरह लगभग देखने के लिए खड़े थे। दूसरी पंक्ति में एक वाक्य है जिसमें शब्दों के बीच एक पाठ क्षेत्र में वास्तविक टेक्स्ट रिक्त स्थान हैं। यदि आप लेआउट रिक्त स्थान का पता लगाने के लिए चाहते हैं इस प्रकार

ThisSentenceDoesn'tHaveAnySpacesBetweenWords. 
This Sentence Doesn't Have Any Spaces Between Words. 

, आप एसवीजी उत्पादन का उपयोग करें और मैन्युअल रूप से पाठ के टोकन के माध्यम से कदम चाहिए:

जब पीडीएफ के लिए निर्यात और फिर ABCpdf द्वारा में पढ़ते हैं, Doc.GetText("TEXT") निम्नलिखित वापस आ जाएगी । Doc.GetText("SVG") एबीसीपीडीएफ के रूप में उन्हें टेक्स्ट पर देखता है और अन्य ड्राइंग इकाइयां देता है, और आप तय कर सकते हैं कि आप लेआउट आधारित स्पेसिंग के मामले को कैसे संभालना चाहते हैं।

आप इस के समान उत्पादन प्राप्त होगा:

<?xml version="1.0" standalone="no"?> 
<svg width="612" height="792" x="0" y="0" version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
<text xml:space="preserve" x="36" y="46.1924" font-size="14" font-family="ArialMT" textLength="26.446" transform="translate(36, 46.1924) translate(-36, -46.1924)">This</text> 
<text xml:space="preserve" x="66.002" y="46.1924" font-size="14" font-family="ArialMT" textLength="59.15" transform="translate(66.002, 46.1924) translate(-66.002, -46.1924)">Sentence</text> 
<text xml:space="preserve" x="129.604" y="46.1924" font-size="14" font-family="ArialMT" textLength="47.46" transform="translate(129.604, 46.1924) translate(-129.604, -46.1924)">Doesn&#8217;t</text> 
<text xml:space="preserve" x="181.208" y="46.1924" font-size="14" font-family="ArialMT" textLength="32.676" transform="translate(181.208, 46.1924) translate(-181.208, -46.1924)">Have</text> 
<text xml:space="preserve" x="219.61" y="46.1924" font-size="14" font-family="ArialMT" textLength="24.122" transform="translate(219.61, 46.1924) translate(-219.61, -46.1924)">Any</text> 
<text xml:space="preserve" x="249.612" y="46.1924" font-size="14" font-family="ArialMT" textLength="46.69" transform="translate(249.612, 46.1924) translate(-249.612, -46.1924)">Spaces</text> 
<text xml:space="preserve" x="301.216" y="46.1924" font-size="14" font-family="ArialMT" textLength="54.474" transform="translate(301.216, 46.1924) translate(-301.216, -46.1924)">Between</text> 
<text xml:space="preserve" x="360.016" y="46.1924" font-size="14" font-family="ArialMT" transform="translate(360.016, 46.1924) translate(-360.016, -46.1924)"><tspan textLength="13.216">W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text> 
<text xml:space="preserve" x="36.014" y="141.9944" font-size="14" font-family="ArialMT" transform="translate(36.014, 141.9944) translate(-36.014, -141.9944)"> 
<tspan textLength="181.3">This Sentence Doesn&#8217;t Have </tspan><tspan dx="-0.756" textLength="150.178">Any Spaces Between W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text> 
</svg> 

और ध्यान दें कि बुनियादी संरचना मूल उद्देश्य है कि आप समस्याओं दे दी है पता चलता है। (Xml: space और विशेषताओं को हटा दिया, खाली स्थान के उदाहरण के लिए संशोधन)

<?xml version="1.0" standalone="no"?> 
<svg> 
    <text>This</text> 
    <text>Sentence</text> 
    <text>Doesn&#8217;t</text> 
    <text>Have</text> 
    <text>Any</text> 
    <text>Spaces</text> 
    <text>Between</text> 
    <text><tspan>W</tspan><tspan>ords.</tspan></text> 
    <text> 
    <tspan>This Sentence Doesn&#8217;t Have </tspan> 
    <tspan>Any Spaces Between W</tspan> 
    <tspan>ords.</tspan> 
    </text> 
</svg> 
0

इस सवाल-जवाब ABCpdf की पुरानी विज्ञप्ति के आसपास आधारित हैं।

एबीसीपीडीएफ संस्करण 9 यह सब आपके लिए स्वचालित रूप से करेगा।

मैं एबीसीपीडीएफ .NET सॉफ़्टवेयर घटक पर काम करता हूं, इसलिए मेरे उत्तरों में एबीसीपीडीएफ के आधार पर अवधारणाएं हो सकती हैं। यह वही है जो मुझे पता है। :-)

+0

तो यह है कि पुराने संस्करण केवल टेक्स्ट तत्वों (यानी बीटी/ईटी, मुझे लगता है) चलते हैं, पृष्ठ पर स्थिति को अनदेखा करते हैं, और केवल एक स्थान जोड़ते हैं जब कोई बीटी/ईटी के भीतर पाया जाता है - जबकि अब आप एक "दृश्य" विश्लेषण का उपयोग करते हैं जो खाते में स्थिति लेता है? मुझे यकीन नहीं है कि पहले दृष्टिकोण में आप प्रत्येक पाठ तत्व के प्रत्येक छोर के बीच एक जगह नहीं जोड़ेंगे। क्या यह है कि कुछ पीडीएफ के प्रत्येक * शब्द * के बजाय प्रत्येक * चरित्र * के लिए एक अलग पाठ तत्व होता है - और आप "वाक्य" के बजाय "एस ई एन टी ई एन सी ई" आउटपुट से बचना चाहते हैं? अगर मुझे पता है कि पुराना तरीका कैसे काम करता है, तो शायद मैं नया रास्ता खरीदूंगा! :) – Chris

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