2011-05-17 14 views
14

इससे पहले पूछा गया है, लेकिन मुझे वास्तव में पता नहीं है कि उत्तर मेरी मदद करते हैं या नहीं। यहां मेरी समस्या है: मुझे (10,000 या तो) पीडीएफ फाइलों का एक गुच्छा मिला। कुछ टेक्स्ट फाइलें थीं जिन्हें एडोब की प्रिंट फीचर का उपयोग करके सहेजा गया था (इसलिए उनका टेक्स्ट सही है और मैं उन्हें खराब करने का जोखिम नहीं लेना चाहता हूं)। और कुछ स्कैन की गई छवियां थीं (इसलिए उनके पास कोई टेक्स्ट नहीं है और मुझे ओसीआर के लिए बसना होगा)। फाइलें एक ही निर्देशिका में हैं और मैं यह नहीं बता सकता कि कौन सा है। आखिरकार मैं उन्हें .txt फ़ाइलों में बदलना चाहता हूं और फिर उन पर स्ट्रिंग प्रोसेसिंग करना चाहता हूं। तो मैं सबसे सटीक ओसीआर संभव चाहता हूँ।पीडीएफ के लिए बैच ओसीआर कार्यक्रम

ऐसा लगता है जैसे लोगों की सिफारिश की है:

  1. एडोब पीडीएफ (मैं इस का एक लाइसेंस की नकल तो नहीं है ... प्लस अगर मैं जीता, तो ABBYY FineReader या कुछ बेहतर है, यही कारण है कि इसके लिए भुगतान इसका उपयोग नहीं करें)
  2. ओक्रोपस (मैं इस बात का उपयोग कैसे कर सकता हूं),
  3. टेस्सेरैक्ट (ऐसा लगता है कि यह 1995 में बहुत अच्छा था लेकिन मुझे यकीन नहीं है कि कुछ और सटीक प्लस है पीडीएफ को मूल रूप से नहीं करना है और मुझे टीआईएफएफ में कनवर्ट करना होगा। इससे मेरी समस्या बढ़ जाती है क्योंकि मेरे पास एक्रोबैट की लाइसेंस प्राप्त प्रति नहीं है इसलिए मुझे नहीं पता कि मैं 10,000 फाइलों को कैसे टफ कर दूंगा। plu मैं नहीं चाहता कि 10,000 30 पेज दस्तावेज 30,000 व्यक्तिगत टिफ छवियों में परिवर्तित हो जाएं)।
  4. wowocr
  5. pdftextstream (है कि 2009 से था)
  6. ABBYY FineReader (जाहिरा तौर पर अपनी '$$$, लेकिन मैं $ 600 अगर यह बात काफी बेहतर है, खर्च इस करवाने के लिए जाएंगे, यानी अधिक सटीक ओसीआर है)।

इसके अलावा मैं प्रोग्रामिंग के लिए एक n00b हूं, इसलिए अगर कुछ सीखने के लिए सप्ताहों की तरह लग रहा है, तो मैं $$$ का भुगतान करूंगा। इनपुट/अनुभव के लिए Thx।

बीटीडब्ल्यू, मैं लिनक्स मिंट 11 64 बिट और/या विंडोज 7 64 बिट चला रहा हूं।

यहाँ अन्य सूत्र हैं:

Batch OCRing PDFs that haven't already been OCR'd

Open source OCR

PDF Text Extraction Approach Using OCR

https://superuser.com/questions/107678/batch-ocr-for-many-pdf-files-not-already-ocred

उत्तर

6

बस सीधे अपने गलतफहमी में से कुछ डाल करने के लिए ...

"मेरे पास एक्रोबैट की लाइसेंस प्राप्त प्रति नहीं है इसलिए मुझे नहीं पता कि मैं 10,000 फाइलों को कैसे टफ कर दूंगा।"

आप मुफ्त में (स्वतंत्रता में) और मुफ्त (बीयर में) घोस्टस्क्रिप्ट की सहायता से पीडीएफ को टीआईएफएफ में परिवर्तित कर सकते हैं। आपकी पसंद आप लिनक्स टकसाल पर या Windows 7. लिनक्स के लिए कमांडलाइन पर यह करने के लिए चाहते हैं:

gs \ 
-o input.tif \ 
-sDEVICE=tiffg4 \ 
    input.pdf 

"मैं 10,000 30 पेज दस्तावेजों 30,000 व्यक्ति टिफ छवियों में बदल नहीं करना चाहती"

आप आसानी से "multipage" TIFFs प्राप्त कर सकते हैं। उपरोक्त आदेश जी 4 (फैक्स टिफ़) स्वाद के ऐसे टीआईएफएफ बनाता है।तुम भी एकल पृष्ठ झगड़े के बजाय चाहते हैं तो आप आदेश को संशोधित कर सकते हैं:

gs \ 
-o input_page_%03d.tif \ 
-sDEVICE=tiffg4 \ 
    input.pdf 

उत्पादन फ़ाइल नाम के %03d हिस्सा स्वचालित रूप से, 001 की एक श्रृंखला में अनुवाद करेगा 002, 003 आदि

चेतावनियां :

  1. tiffg4 आउटपुट डिवाइस के लिए डिफ़ॉल्ट संकल्प 204x196 डीपीआई है। आप शायद एक बेहतर मूल्य चाहते हैं। 720 डीपीआई प्राप्त करने के लिए आपको कमांडलाइन में -r720x720 जोड़ना चाहिए।
  2. इसके अलावा, यदि आपकी घोस्टस्क्रिप्ट स्थापना अक्षर का उपयोग अपने डिफ़ॉल्ट मीडिया आकार के रूप में करती है, तो आप इसे बदलना चाहेंगे। डिवाइस बिंदुओं में चौड़ाई xhe सेट करने के लिए आप -gXxY का उपयोग कर सकते हैं। तो प्राप्त करने के लिए आईएसओ ए 4 परिदृश्य में आउटपुट पेज आयाम आप -g8420x5950 पैरामीटर जोड़ सकते हैं।

तो पूर्ण आदेश जो इन दो मापदंडों को नियंत्रित करता है, पोर्ट्रेट ओरिएंटेशन में ए 4 पर 720 डीपीआई उत्पादन का उत्पादन करने के लिए, में लिखा होगा:

gs \ 
-o input.tif \ 
-sDEVICE=tiffg4 \ 
-r720x720 \ 
-g5950x8420 \ 
    input.pdf 
4

यह एक दिलचस्प समस्या है। यदि आप .NET में विंडोज पर काम करने के इच्छुक हैं, तो आप इसे dotImage के साथ कर सकते हैं (अस्वीकरण, मैं एटालासॉफ्ट के लिए काम करता हूं और अधिकांश ओसीआर इंजन कोड लिखा है)। के टुकड़ों में नीचे समस्या को तोड़ने करते हैं - पहले अपने सभी पीडीएफ़ से अधिक पुनरावृत्ति है:

string[] candidatePDFs = Directory.GetFiles(sourceDirectory, "*.pdf"); 
PdfDecoder decoder = new PdfDecoder(); 

foreach (string path in candidatePDFs) { 
    using (FileStream stm = new FileStream(path, FileMode.Open)) { 
     if (decoder.IsValidFormat(stm)) { 
      ProcessPdf(path, stm); 
     } 
    } 
} 

यह सभी फ़ाइलें .pdf में खत्म हो और की एक सूची हो जाता है, तो फ़ाइल एक वैध पीडीएफ है, इस प्रक्रिया के लिए एक नियमित कॉल यह:

public void ProcessPdf(string path, Stream stm) 
{ 
    using (Document doc = new Document(stm)) { 
     int i=0; 
     foreach (Page p in doc.Pages) { 
      if (p.SingleImageOnly) { 
       ProcessWithOcr(path, stm, i); 
      } 
      else { 
       ProcessWithTextExtract(path, stm, i); 
      } 
      i++; 
     } 
    } 
} 

यह एक दस्तावेज़ वस्तु के रूप में फ़ाइल को खोलता है और यदि प्रत्येक पृष्ठ छवि ही है पूछता है। इसलिए यह पेज ओसीआर होगा, वरना यह पाठ करेंगे, तो निकालने:

public void ProcessWithOcr(string path, Stream pdfStm, int page) 
{ 
    using (Stream textStream = GetTextStream(path, page)) { 
     PdfDecoder decoder = new PdfDecoder(); 
     using (AtalaImage image = decoder.Read(pdfStm, page)) { 
      ImageCollection coll = new ImageCollection(); 
      coll.Add(image); 
      ImageCollectionImageSource source = new ImageCollectionImageSource(coll); 
      OcrEngine engine = GetOcrEngine(); 
      engine.Initialize(); 
      engine.Translate(source, "text/plain", textStream); 
      engine.Shutdown(); 
     } 
    } 
} 

क्या करता है एक छवि में पीडीएफ पेज rasterizes और यह एक रूप है कि engine.Translate के लिए स्वादिष्ट होता है में डालता है। इसे इस तरह से करने की सख्ती से आवश्यकता नहीं है - किसी को पहचानने के लिए एक अटलाइमेज से इंजन से ओसीआरपीज ऑब्जेक्ट प्राप्त हो सकता है, लेकिन फिर यह क्लाइंट कोड पर निर्भर करेगा कि संरचना पर लूप करें और टेक्स्ट लिखें।

आप ध्यान दें कि मैंने GetOcrEngine() छोड़ दिया है - हम ग्राहक उपयोग के लिए 4 ओसीआर इंजन उपलब्ध कराते हैं: टेसेरैक्ट, ग्लाइफ्रेडर, रेकोस्टार और आईरिस। आप उस व्यक्ति का चयन करेंगे जो आपकी आवश्यकताओं के लिए सबसे अच्छा होगा।

अंत में, आप पृष्ठों को पहले से ही उन पर पूरी तरह से अच्छा पाठ है से पाठ निकालने के लिए कोड की आवश्यकता होगी:

public void ProcessWithTextExtract(string path, Stream pdfStream, int page) 
{ 
    using (Stream textStream = GetTextStream(path, page)) { 
     StreamWriter writer = new StreamWriter(textStream); 
     using (PdfTextDocument doc = new PdfTextDocument(pdfStream)) { 
      PdfTextPage page = doc.GetPage(i); 
      writer.Write(page.GetText(0, page.CharCount)); 
     } 
    } 
} 

यह देखते हुए पृष्ठ से पाठ निकालता है और यह उत्पादन धारा को लिखता है।

अंत में, आप की जरूरत है GetTextStream():

public Stream GetTextStream(string sourcePath, int pageNo) 
{ 
    string dir = Path.GetDirectoryName(sourcePath); 
    string fname = Path.GetFileNameWithoutExtension(sourcePath); 
    string finalPath = Path.Combine(dir, String.Format("{0}p{1}.txt", fname, pageNo)); 
    return new FileStream(finalPath, FileMode.Create); 
} 

इस एक 100% समाधान हो जाएगा? नहीं, निश्चित रूप से नहीं।आप पीडीएफ पेजों की कल्पना कर सकते हैं जिनमें एक बॉक्स शामिल है जिसमें एक बॉक्स है, यह स्पष्ट रूप से छवि को केवल असफल कर देगा लेकिन कोई उपयोगी टेक्स्ट नहीं लौटाएगा। शायद, एक बेहतर तरीका केवल निकाले गए पाठ का उपयोग करना है और यदि वह कुछ भी वापस नहीं करता है, तो एक ओसीआर इंजन आज़माएं। एक दृष्टिकोण से दूसरी ओर बदलना एक अलग भविष्यवाणी लिखने का विषय है।

3

सबसे आसान तरीका स्कैन किए गए छवियों को स्कैन किए गए स्कैन किए गए चित्रों में स्कैन करने के बिना एक बैच में छवियों को संसाधित करने के लिए एक बैच में छवियों को संसाधित करने के लिए एक उपकरण जैसे ABBYY FineReader, Omnipage इत्यादि का उपयोग करना सबसे आसान तरीका होगा। मेरा मानना ​​है कि फाइनराइडर ओसीआर प्रदर्शन करने से पहले पीडीएफ के चित्रों को परिवर्तित करता है।

एक ओसीआर इंजन का उपयोग करने से आपको स्वचालित डेस्क्यू, पेज ओरिएंटेशन डिटेक्शन, इमेज थ्रेसहोल्डिंग, डिस्प्लेलिंग इत्यादि जैसी सुविधाएं मिलेंगी। ये विशेषताएं हैं कि आपको एक छवि प्रोसेसिंग लाइब्रेरी खरीदने और प्रोग्राम स्वयं खरीदना होगा और यह खोजना मुश्किल साबित हो सकता है आपके 10,000 पीडीएफ के लिए पैरामीटर का इष्टतम सेट।

स्वत: ओसीआर दृष्टिकोण का उपयोग इनपुट छवियों के आधार पर अन्य दुष्प्रभाव होंगे और आपको लगता है कि यदि आप छवियों को सॉर्ट करते हैं और प्रत्येक प्रकार की छवियों के लिए इष्टतम पैरामीटर सेट करते हैं तो आपको बेहतर परिणाम मिलेंगे। शुद्धता के लिए पीडीएफ को निकालने के लिए एक उचित पीडीएफ पाठ निष्कर्षण दिनचर्या का उपयोग करना बेहतर होगा जिसमें सही टेक्स्ट है।

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

मैं वाणिज्यिक ओसीआर इंजन के कुछ डेमो/परीक्षण संस्करणों को खोजने का प्रयास करता हूं और देखता हूं कि वे बहुत अधिक समय और पैसा खर्च करने से पहले अपने विभिन्न दस्तावेज़ प्रकारों पर कैसे प्रदर्शन करते हैं।

5

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

बैश में बिल्ली कमांड में पाइथन में बाइनरी मोड में फ़ाइल पढ़ने के रूप में एक ही आउटपुट होता है ('आर' या 'आर' या 'ए' के ​​बजाय फ़ाइल खोलते समय 'आरबी' मोड का उपयोग करके)। तो मुझे लगता है कि सभी पीडीएफ फाइलों जिनमें टेक्स्ट है जिसमें बाइनरी आउटपुट में "फ़ॉन्ट" शब्द है और यह कि कोई छवि-केवल फाइलें ही नहीं होंगी। यदि यह हमेशा सत्य होता है, तो यह कोड एक ही निर्देशिका में सभी पीडीएफ फ़ाइलों की एक सूची बनायेगा जिसमें टेक्स्ट और अलग-अलग छवियां होंगी जिनमें केवल छवियां होंगी। यह प्रत्येक सूची को एक अलग .txt फ़ाइल में सहेजता है, फिर आप पीडीएफ फ़ाइलों को उचित फ़ोल्डर में स्थानांतरित करने के लिए बैश में एक कमांड का उपयोग कर सकते हैं।

एक बार जब आप उन्हें अपने फ़ोल्डर्स में रखते हैं, तो आप छवियों में केवल पीडीएफ फ़ाइलों पर अपने बैच ओसीआर समाधान को चला सकते हैं। मुझे अभी तक यह नहीं मिला है (जाहिर है)।

import os, re 

    #path is the directory with the files, other 2 are the names of the files you will store your lists in 

    path = 'C:/folder_with_pdfs' 
    files_with_text = open('files_with_text.txt', 'a') 
    image_only_files = open('image_only_files.txt', 'a') 


    #have os make a list of all files in that dir for a loop 
    filelist = os.listdir(path) 

    #compile regular expression that matches "Font" 
    mysearch = re.compile(r'.*Font.*', re.DOTALL) 

    #loop over all files in the directory, open them in binary ('rb'), search that binary for "Font" 
    #if they have "Font" they have text, if not they don't 
    #(pdf does something to understand the Font type and uses this word every time the pdf contains text) 
    for pdf in filelist: 
     openable_file = os.path.join(path, pdf) 
     cat_file = open(openable_file, 'rb') 
     usable_cat_file = cat_file.read() 
     #print usable_cat_file 
     if mysearch.match(usable_cat_file): 
      files_with_text.write(pdf + '\n') 
     else: 
      image_only_files.write(pdf + '\n') 

फ़ाइलों को स्थानांतरित करने के लिए, मैं bash खोल में इस आदेश को दर्ज किया गया:

cat files_with_text.txt | while read i; do mv $i Volumes/hard_drive_name/new_destination_directory_name; done 

इसके अलावा, मैं फिर से नहीं चला अजगर कोड से ऊपर, मैं सिर्फ बात हाथ से संपादित किए, इसलिए यह छोटी गाड़ी हो सकती है, इडक।

0

मैं ABBYY OCR4LINUX CLI इंजन के लिए एक छोटा सा आवरण लिखा है (IMHO, कि ज्यादा खर्च नहीं करता है) और Tesseract 3।

आवरण बैच की तरह फ़ाइलों को कनवर्ट कर सकते हैं:
$ pmocr.sh --batch --target=pdf --skip-txt-pdf /some/directory

स्क्रिप्ट pdffonts का उपयोग करता है निर्धारित करने के लिए एक पीडीएफ फाइल पहले से ही उन्हें छोड़ OCRed किया गया है। साथ ही, स्क्रिप्ट निर्देशिका की निगरानी करने के लिए सिस्टम सेवा के रूप में काम कर सकती है और जैसे ही फ़ाइल निर्देशिका में प्रवेश करती है, ओसीआर कार्रवाई शुरू करती है।

स्क्रिप्ट यहां पाया जा सकता:
https://github.com/deajan/pmOCR

उम्मीद है, यह किसी को मदद मिलती है।

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