2008-09-26 14 views
8

मेरे पास पीडीएफ फाइलों का एक गुच्छा है और मेरे पर्ल प्रोग्राम को उन लोगों की एक पूर्ण-पाठ खोज करने की आवश्यकता है, जिनके पास एक विशिष्ट स्ट्रिंग है। तिथि करने के लिए मैं इस का उपयोग किया गया:मैं पर्ल से पीडीएफ फाइलों की पूर्ण-पाठ खोज कैसे कर सकता हूं?

my @search_results = `grep -i -l \"$string\" *.pdf`; 

जहां $ स्ट्रिंग पाठ देखने के लिए है। हालांकि यह अधिकांश पीडीएफ के लिए विफल रहता है क्योंकि फ़ाइल प्रारूप स्पष्ट रूप से ASCII नहीं है।

मैं यह सबसे आसान क्या कर सकता हूं?

स्पष्टीकरण: लगभग 300 पीडीएफ हैं जिनका नाम मैं पहले से नहीं जानता। पीडीएफ :: कोर शायद अधिक है। मैं एक दूसरे के साथ अच्छा खेलने के लिए pdftotext और grep प्राप्त करने की कोशिश कर रहा हूं, मुझे पीडीएफ के नाम नहीं पता हैं, मुझे अभी तक सही वाक्यविन्यास नहीं मिल रहा है।

अंतिम समाधान नीचे एडम Bellaire के सुझाव का उपयोग कर:

@search_results = `for i in \$(ls); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`; 
+0

हो सकता है कि आप "पर्ल से पीडीएफ पूर्ण-पाठ खोज" के लिए प्रश्न का नाम बदलना चाहें –

उत्तर

9

PerlMonks धागा इस समस्या के बारे here बात करती है।

ऐसा लगता है कि अपनी स्थिति के लिए, यह pdftotext (कमांड लाइन टूल) प्राप्त करने का सबसे सरल किया जा सकता है, तो आप की तरह कुछ कर सकते हैं:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`; 
2

मैं दूसरी एडम Bellaire समाधान। मैंने अपनी ईबुक लाइब्रेरी की पूर्ण-पाठ अनुक्रमणिका बनाने के लिए pdftotext उपयोगिता का उपयोग किया। यह कुछ हद तक धीमा है लेकिन यह काम करता है। पूर्ण पाठ के लिए, पूर्ण-पाठ अनुक्रमणिका को स्टोर करने के लिए प्लसिन या किनोशर्च आज़माएं।

1

मैंने उपयोग किया है सबसे आसान पूर्ण टेक्स्ट इंडेक्स/सीच mysql है। आप बस उस पर उपयुक्त इंडेक्स के साथ तालिका में डालें। आपको खेतों के लिए सापेक्ष भारोत्तोलन करने में कुछ समय बिताना होगा (शीर्षक में एक मैच शरीर में एक मैच से अधिक स्कोर कर सकता है), लेकिन यह कुछ संभव है, हालांकि कुछ बालों वाले एसक्यूएल के साथ।

किनोशर्च के पक्ष में प्लूसिन को पिछले दो वर्षों में इस पर कोई सक्रिय कार्य नहीं किया गया है)। प्लिनिन की वास्तुशिल्प सीमाओं को समझने के लिए, कुछ हद तक, कीनोशर्च बढ़ी।

यदि आपके पास ~ 300 पीडीएफ है, तो एक बार जब आपने पीडीएफ से टेक्स्ट निकाला है (मान लें कि पीडीएफ में टेक्स्ट है और न केवल टेक्स्ट की छवियां हैं;) और आपकी क्वेरी वॉल्यूम के आधार पर आप grep पर्याप्त पा सकते हैं।

हालांकि, मैं दृढ़ता से mysql/kinosearch मार्ग का सुझाव देता हूं क्योंकि उन्होंने बहुत सी जमीन (स्टेमिंग, स्टॉपवर्ड, टर्म वेटिंग, टोकन पार्सिंग) को कवर किया है, जिससे आपको परेशान होने से लाभ नहीं होता है।

किनोशर्च शायद MySQL मार्ग से तेज़ है, लेकिन MySQL मार्ग आपको अधिक व्यापक रूप से उपयोग किए जाने वाले मानक सॉफ़्टवेयर/टूल/डेवलपर-अनुभव प्रदान करता है। और आपको अपने freetext खोज क्वेरी को बढ़ाने के लिए एसक्यूएल की शक्ति का उपयोग करने की क्षमता मिलती है।

तो जब तक आप बड़ी डेटा-सेट और पागल क्वेरी वॉल्यूम नहीं बोल रहे हैं, तो मेरा पैसा mysql पर होगा।

2

मेरी लाइब्रेरी, CAM::PDF, टेक्स्ट निकालने के लिए समर्थन है, लेकिन यह पीडीएफ सिंटैक्स के ग्राफिकल अभिविन्यास को देखते हुए एक स्वाभाविक रूप से कठिन समस्या है। तो, उत्पादन कभी-कभी अस्पष्ट होता है।सीएएम :: पीडीएफ एक getpdftext.pl कार्यक्रम बंडल, या आप तो जैसे कार्यक्षमता आह्वान कर सकते हैं:

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n"; 
for my $pagenum (1 .. $doc->numPages()) { 
    my $text = $doc->getPageText($pagenum); 
    print $text; 
} 
0

आप Lucene की कोशिश कर सकते (पर्ल बंदरगाह Plucene कहा जाता है)। खोज अविश्वसनीय रूप से तेज़ हैं और मुझे पता है कि पीडीएफबॉक्स पहले ही जानता है कि ल्यूसीन के साथ पीडीएफ फाइलों को कैसे इंडेक्स करना है। पीडीएफबॉक्स जावा है, लेकिन संभावना है कि सीपीएएन में कहीं कुछ ऐसा ही है। यहां तक ​​कि अगर आपको कुछ ऐसा नहीं मिल रहा है जो पहले से ही लुसीन इंडेक्स में पीडीएफ फाइलों को जोड़ता है, तो इसे स्वयं करने के लिए कोड की कुछ पंक्तियों से अधिक नहीं होना चाहिए। लुसीन आपको फ़ाइल में एक स्ट्रिंग की तलाश करने के बजाय कुछ और खोज विकल्प देगा।

एक बहुत तेज़ और गंदा तरीका भी है। पीडीएफ फ़ाइल में पाठ वास्तव में सादे पाठ के रूप में संग्रहीत किया जाता है। यदि आप किसी टेक्स्ट एडिटर में पीडीएफ खोलते हैं या 'तार' का उपयोग करते हैं तो आप वहां टेक्स्ट देख सकते हैं। द्विआधारी जंक आमतौर पर एम्बेडेड फोंट, छवियों, आदि

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

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