Batch-OCR PDF จำนวนมาก


20

เรื่องนี้ถูกพูดถึงเมื่อปีที่แล้วที่นี่

Batch OCR สำหรับไฟล์ PDF จำนวนมาก (ยังไม่ได้ทำ OCR)

มีวิธีใดในการแบทช์ไฟล์ PDF OCR ที่ยังไม่ได้ทำ OCR อยู่แล้ว? ฉันคิดว่าสถานะปัจจุบันของสิ่งต่าง ๆ ที่เกี่ยวข้องกับสองประเด็น:

Batch OCR PDF

ของ windows

  • Acrobat - นี่คือเอ็นจิ้น Oocr ที่ตรงที่สุดที่จะทำการ OCR ปัญหาเดียวน่าจะเป็น 1) มันจะไม่ข้ามไฟล์ที่ OCRed 2 ไปแล้ว) ลองขว้าง PDF เป็นไฟล์ (มันเก่า) แล้วดูมันพัง มันเป็นรถเล็ก ๆ น้อย ๆ มันจะเตือนคุณเมื่อเกิดข้อผิดพลาดแต่ละครั้ง (แม้ว่าคุณจะสามารถบอกให้ซอฟต์แวร์ไม่แจ้งเตือนได้ แต่อีกครั้งมันเสียชีวิตอย่างน่ากลัวใน PDF บางประเภทดังนั้นระยะของคุณอาจแตกต่างกันไป

  • ABBYY FineReader (Batch / Scansnap), Omnipage - สิ่งเหล่านี้จะต้องเป็นบางส่วนของโปรแกรมที่แย่ที่สุดของซอฟต์แวร์ที่มนุษย์รู้จัก หากคุณสามารถค้นหาวิธีการทำให้ OCR แบทช์ของการบันทึกPDF แบบอัตโนมัติ (ไม่มีการแจ้งเตือน) ด้วยชื่อเดียวกันกรุณาโพสต์ที่นี่ ดูเหมือนว่าวิธีแก้ไขปัญหาเดียวที่ฉันพบว่าล้มเหลวบางแห่ง - การเปลี่ยนชื่อไม่ได้ทำโดยอัตโนมัติอย่างสมบูรณ์ ฯลฯ และอื่น ๆ ที่ดีที่สุดมีวิธีที่จะทำได้ แต่เอกสารและการเขียนโปรแกรมเป็นสิ่งที่น่ากลัวมาก

  • ABBYY FineReader Engine , เซิร์ฟเวอร์ตัวรู้จำ ABBYY - นี่คือโซลูชันระดับองค์กรที่มากขึ้นคุณอาจจะดีกว่าที่จะได้รับ acrobat เพื่อเรียกใช้ผ่านโฟลเดอร์และลองและกำจัดไฟล์ PDF ที่ให้ข้อผิดพลาด / ผิดพลาดของโปรแกรมมากกว่าจะยุ่งยาก เพื่อติดตั้งซอฟต์แวร์ประเมินผล (สมมติว่าคุณเป็นผู้ใช้ขั้นปลายง่าย ๆ ) ดูเหมือนจะไม่คุ้มค่ากับการแข่งขันสำหรับผู้ใช้รายย่อย

  • ** เวิร์คสเตชั่น Autobahn DX ** ราคาของผลิตภัณฑ์นี้เป็นสิ่งต้องห้ามดังนั้นคุณอาจซื้อ acrobat ได้ 6 ชุด ไม่ใช่ทางออกสำหรับผู้ใช้จริงๆ หากคุณเป็นการตั้งค่าระดับองค์กรนี่อาจจะคุ้มค่าสำหรับคุณ

ลินุกซ์

  • WatchOCR - ไม่ได้รับการพัฒนาอีกต่อไปและเป็นไปไม่ได้ที่จะทำงานบน distros Ubuntu รุ่นใหม่
  • pdfsandwich - ไม่ได้รับการพัฒนาอีกต่อไปโดยทั่วไปไม่สามารถทำงานบน distros Ubuntu รุ่นใหม่
  • ** ABBY LINUX OCR ** - ควรเป็นสคริปต์และดูเหมือนว่าจะได้ผลลัพธ์ที่ดี:

http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison

อย่างไรก็ตามเช่นเดียวกับผลิตภัณฑ์อื่น ๆ ของ ABBYY ที่พวกเขาเรียกเก็บจากหน้าเว็บอีกครั้งคุณอาจจะดีกว่าถ้าพยายามให้ Acrobat Batch OCR ทำงาน

  • ** Ocrad, GOCR, OCRopus, tesseract, ** - สิ่งเหล่านี้อาจใช้ได้ แต่มีปัญหาเล็กน้อย:

    1. ผลลัพธ์ของ OCR นั้นไม่ดีเท่ากับ acrobat สำหรับบางตัว (ดูลิงค์ด้านบน)
    2. ไม่มีโปรแกรมใดที่ใช้ไฟล์ PDF และส่งออกไฟล์ PDF คุณต้องสร้างสคริปต์และแยก PDF ก่อนแล้วจึงเรียกใช้โปรแกรมบนแต่ละไฟล์จากนั้นประกอบไฟล์เป็นไฟล์ pdf อีกครั้ง
    3. เมื่อคุณทำเช่นนั้นคุณอาจพบว่าฉันทำอย่างนั้น (tesseract) จะสร้างเลเยอร์ OCR ที่เปลี่ยนไป ดังนั้นหากคุณค้นหาคำว่า 'the' คุณจะได้รับไฮไลต์ของส่วนของคำถัดจากคำนั้น
  • Batch DjVu →แปลงเป็น PDF - ยังไม่ได้ตรวจสอบ แต่ดูเหมือนว่าเป็นทางออกแบบรอบต่อนาทีที่น่ากลัว

ออนไลน์

  • PDFcubed.com - มาแล้วไม่ใช่โซลูชันแบบกลุ่ม
  • ABBYY Cloud OCR - ไม่แน่ใจว่านี่เป็นโซลูชั่นแบบแบตช์ไม่ว่าจะด้วยวิธีใดคุณต้องชำระเงินตามหน้าเว็บและอาจมีราคาแพง

การระบุ PDF ที่ไม่ใช่ OCR

นี่เป็นปัญหาที่ง่ายขึ้นเล็กน้อยซึ่งสามารถแก้ไขได้อย่างง่ายดายใน Linux และใน Windows ฉันสามารถโค้ดสคริปต์ perl ที่ใช้pdffontเพื่อระบุว่ามีการฝังฟอนต์เพื่อระบุไฟล์ที่ไม่ได้เป็น OCR


"โซลูชั่น" ปัจจุบัน

  1. ใช้สคริปต์เพื่อระบุไฟล์ PDF ที่ไม่ใช่ OCRed (เพื่อให้คุณไม่ต้องรันซ้ำ OCRed PDF หลายพันรายการ) และคัดลอกไฟล์เหล่านี้ไปยังไดเรกทอรีชั่วคราว (เก็บแผนผังไดเรกทอรีที่ถูกต้อง) จากนั้นใช้ Acrobat บน Windows เพื่อเรียกใช้ไฟล์เหล่านี้ กระบวนการจะไม่ผิดพลาด

  2. ใช้สคริปต์เดียวกัน แต่รับหนึ่งในเครื่องมือ linux ocr เพื่อทำงานอย่างถูกต้องเสี่ยงต่อคุณภาพ ocr

ฉันคิดว่าฉันจะลอง # 1 ฉันแค่กังวลมากเกินไปเกี่ยวกับผลลัพธ์ของเครื่องมือ Linux OCR (ฉันไม่คิดว่าจะมีใครทำการเปรียบเทียบ) และแยกไฟล์ออกเป็นชิ้น ๆ เป็นการเข้ารหัสที่ไม่จำเป็นหาก Adobe สามารถแบตช์ OCR ไดเรกทอรีโดยไม่สำลัก

หากคุณต้องการโซลูชันที่ไม่ต้องเสียค่าใช้จ่ายคุณจะต้องใช้สคริปต์เพื่อระบุไฟล์ PDF ที่ไม่ใช่ OCRed (หรือเรียกใช้ซ้ำกับ OCRed) จากนั้นใช้เครื่องมือ linux เพื่อลองและ OCR ดูเหมือนว่า Teseract จะให้ผลลัพธ์ที่ดีที่สุด แต่เครื่องมือเหล่านี้บางอย่างไม่ได้รับการสนับสนุนใน Ubuntu รุ่นใหม่แม้ว่าคุณจะสามารถตั้งค่าและแก้ไขปัญหาที่ฉันมีเมื่อเลเยอร์รูปภาพไม่ตรงกับเลเยอร์การจับคู่ข้อความ ( ด้วย tesseract) จากนั้นคุณจะมีโซลูชันที่ใช้งานได้และ Linux> Windows อีกครั้ง


คุณมีวิธีแก้ปัญหาในการทำงานโดยอัตโนมัติแบตช์ OCR PDFข้ามไฟล์ OCRed ที่มีชื่อเดียวกันด้วยคุณภาพสูงไปหรือไม่? ถ้าเป็นเช่นนั้นฉันจะขอบคุณอินพุตจริงๆ


สคริปต์ Perl เพื่อย้ายไฟล์ที่ไม่ใช่ OCRed ไปยังไดเรกทอรีชั่วคราว ไม่สามารถรับประกันได้ว่างานนี้และอาจต้องเขียนใหม่ แต่ถ้ามีคนทำให้มันใช้งานได้ (สมมติว่ามันใช้งานไม่ได้) หรือทำงานได้ดีขึ้นแจ้งให้เราทราบและฉันจะโพสต์รุ่นที่ดีกว่าที่นี่


#!/usr/bin/perl

# move non-ocred files to a directory
# change variables below, you need a base dir (like /home/joe/), and a sourcedirectory and output
# direcotry (e.g books and tempdir)
# move all your pdfs to the sourcedirectory

use warnings;
use strict;

# need to install these modules with CPAN or your distros installer (e.g. apt-get)
use CAM::PDF;
use File::Find;
use File::Basename;
use File::Copy;

#use PDF::OCR2;
#$PDF::OCR2::CHECK_PDF   = 1;
#$PDF::OCR2::REPAIR_XREF = 1;

my $basedir = '/your/base/directory';
my $sourcedirectory  = $basedir.'/books/';
my @exts       = qw(.pdf);
my $count      = 0;
my $outputroot = $basedir.'/tempdir/';
open( WRITE, >>$basedir.'/errors.txt' );

#check file
#my $pdf = PDF::OCR2->new($basedir.'/tempfile.pdf');
#print $pdf->page(10)->text;



find(
    {
        wanted => \&process_file,

        #       no_chdir => 1
    },
    $sourcedirectory
);
close(WRITE);

sub process_file {
    #must be a file
    if ( -f $_ ) {
        my $file = $_;
        #must be a pdf
        my ( $dir, $name, $ext ) = fileparse( $_, @exts );
        if ( $ext eq '.pdf' ) {
            #check if pdf is ocred
            my $command = "pdffonts \'$file\'";
            my $output  = `$command`;
            if ( !( $output =~ /yes/ || $output =~ /no/ ) ) {
                #print "$file - Not OCRed\n";
                my $currentdir = $File::Find::dir;
                if ( $currentdir =~ /$sourcedirectory(.+)/ ) {
                    #if directory doesn't exist, create
                    unless(-d $outputroot.$1){
                    system("mkdir -p $outputroot$1");
                    }
                    #copy over file
                    my $fromfile = "$currentdir/$file";
                    my $tofile = "$outputroot$1/$file";
                    print "copy from: $fromfile\n";
                    print "copy to: $tofile\n";
                    copy($fromfile, $tofile) or die "Copy failed: $!";
#                       `touch $outputroot$1/\'$file\'`;
                }
            }

        }

    }
}

สวัสดีคุณกรุณาแบ่งปันสคริปต์ "Windows ของคุณเพื่อระบุไฟล์ PDF ที่ไม่ใช่ OCRed (... ) และคัดลอกไฟล์เหล่านี้ไปยังไดเรกทอรีชั่วคราว (เก็บแผนผังไดเรกทอรีที่ถูกต้อง) หรือไม่ขอบคุณล่วงหน้า;)
Erb

@ David ok มันขึ้นอยู่ ฉันเตือนคุณว่าอาจทำงานไม่ถูกต้องในครั้งแรก วิธีนี้จะไม่ทำให้ไฟล์ PDF ของคุณเสียหายเลย (เป็นเพียงแค่การคัดลอก แต่ไม่ได้สัมผัสต้นฉบับ) แต่สิ่งที่ฉันหมายถึงคือคุณอาจต้องแก้ไขสคริปต์ ถ้าคุณรู้ว่า Perl มันจะเป็นเรื่องง่ายถ้าไม่แจ้งให้เราทราบหรือคุณอาจสามารถแก้ไขข้อผิดพลาดได้ด้วยตัวเองและทำการแก้ไขเล็กน้อย
Joe

ขอบคุณมาก. ฉันจะพยายามทำให้มันใช้งานได้ (แม้ว่าฉันใหม่กับ Perl) ขอบคุณ
Erb

อาจเป็นความคิดอื่นใน Windows (ทำงานใน XP) ฉันเคยใช้สิ่งนี้ในอดีตเพื่อ "ลบออกจากโฟลเดอร์ (พร้อมโฟลเดอร์ย่อย) ไฟล์ pdf ทั้งหมดที่ไม่มีรหัสผ่าน" แนวคิดก็คือเก็บไฟล์ PDF ทั้งหมดที่มีการป้องกันด้วยรหัสผ่าน คัดลอกด้วย Syncback ฟรีแวร์ทั้งหมด pdf (พร้อมโฟลเดอร์ย่อยที่เกี่ยวข้อง) ในโฟลเดอร์ใหม่ (C: \ 5 \ ") เพิ่ม pdftotext.exe และไฟล์ข้อความนี้ถูกเปลี่ยนชื่อใน del_pdf_no_password.bat เนื้อหาของมัน:" FOR / RC: \ 5 \% % x IN (* .PDF) ทำ (pdftotext %% x NUL && DEL %% x) "โดยที่" C: \ 5 \ "เป็นโฟลเดอร์ที่จะเปลี่ยนจากนั้นเริ่ม pdftotext.exe แล้วตามด้วยไฟล์. bat
Erb

รายละเอียดเพิ่มเติม: คุณจะต้องลบช่องว่าง (+ caracters พิเศษเช่น "," ... ) ภายในชื่อโฟลเดอร์ใด ๆ ด้วยตัวเปลี่ยนชื่อฟรีแวร์ (เช่นตัวอย่าง: Alternto.net/software/renamer ) มิฉะนั้นจะไม่ทำงานกับโฟลเดอร์ย่อยทั้งหมด! Ps: ฉันไม่ได้เขียนสคริปต์นี้ (ฉันได้รับความช่วยเหลือจากใครบางคนใน ... 2004!)
Erb

คำตอบ:


3

ฉันก็มองหาวิธีที่จะ batch-OCR PDF จำนวนมากในลักษณะอัตโนมัติโดยไม่ต้องโชคดี ในที่สุดฉันก็คิดวิธีแก้ปัญหาที่ใช้การได้คล้ายกับของคุณโดยใช้ Acrobat กับสคริปต์ดังนี้

  1. คัดลอก PDF ที่เกี่ยวข้องทั้งหมดไปยังไดเรกทอรีเฉพาะ

  2. ลบ PDF ที่มีข้อความอยู่แล้ว (สมมติว่าพวกเขาเป็น OCRd หรือข้อความอยู่แล้ว - ไม่เหมาะอย่างยิ่งที่ฉันรู้ แต่ดีพอสำหรับตอนนี้)

  3. ใช้AutoHotKeyเพื่อเรียกใช้ Acrobat โดยอัตโนมัติเลือกไดเรกทอรีที่ต้องการและ OCR เอกสารทั้งหมดผนวก "-ocr" ต่อท้ายชื่อไฟล์

  4. ย้าย OCRd PDF กลับไปที่ตำแหน่งเดิมโดยใช้ไฟล์ "-ocr.pdf" เพื่อดูว่าสำเร็จหรือไม่

มันค่อนข้างHeath Heathแต่ใช้งานได้ดีจริง ๆ


ทำไมคุณต้องใช้ AutoHotKey ถ้า Acrobat จะแบทช์ไดเรกทอรี ocr แล้ว? หากคุณกังวลเกี่ยวกับการทำซ้ำกระบวนการหาก acrobat ขัดข้องการประทับเวลาที่แก้ไขไฟล์จะบอกให้คุณทราบว่าคุณค้างไว้ที่ไหน หากคุณต้องการเก็บต้นฉบับไว้คุณก็สามารถคัดลอกไดเรกทอรีได้ หากคุณต้องการ -ocr ในตอนท้ายคุณสามารถเปลี่ยนชื่อแบทช์ได้หลังจากเสร็จสิ้น
โจ

1
สวัสดีโชคดีที่คุณสามารถแบ่งปันวิธีที่คุณชี้ 2 และ 3 ใน Windows ได้หรือไม่ ขอบคุณล่วงหน้า;)
Erb

2

ฉันเชื่อว่าคุณต้องตระหนักว่า ABBYY FineReader เป็นโซลูชันสำหรับผู้ใช้ที่ได้รับการออกแบบมาเพื่อให้บริการ OCR ที่รวดเร็วและแม่นยำ

จากประสบการณ์ของฉันโครงการ OCR มีรายละเอียดที่แตกต่างกันอย่างมากในแต่ละครั้งและไม่มีทางสร้างกล่องวิญญาณสำหรับกรณีที่ไม่ซ้ำกัน แต่ฉันสามารถแนะนำเครื่องมือระดับมืออาชีพที่สามารถทำงานให้คุณได้มากขึ้น:

  • ลองดูที่ABBYY Recognition Serverนี้เป็นผลิตภัณฑ์ระดับมืออาชีพสำหรับการทำงานอัตโนมัติ OCR

  • เมื่อมาถึง linux ให้ดูที่http://ocr4linux.comมันเป็นอรรถประโยชน์บรรทัดคำสั่งที่อาจเหมาะกับคุณเช่นกัน

  • สำหรับงานที่ซับซ้อนมากขึ้น ABBYY มี SDK ที่ยืดหยุ่นมากเช่นABBYY FineReader Engine (โฮสต์ใน บริษัท ) หรือABBYY Cloud OCR SDK (อิงตาม Microsoft Azure cloud) ที่ให้คุณออกแบบ OCR ในแบบที่คุณต้องการ

ฉันเป็นส่วนหนึ่งของทีมพัฒนา Front-end สำหรับบริการคลาวด์ที่ระบุไว้ด้านบนและสามารถให้ข้อมูลเพิ่มเติมได้หากจำเป็น

เมื่อพิจารณาการค้นหาเลเยอร์ข้อความใน PDF ฉันไม่สามารถให้คำแนะนำใด ๆ ได้เพราะงานนี้ค่อนข้างนอกเหนือจาก OCR ซึ่งเป็นความสามารถพิเศษของฉันดังนั้นฉันจึงพบวิธีการใช้สคริปต์ภายนอกที่เหมาะสมมาก บางทีคุณอาจพบว่าการสนทนานี้มีประโยชน์: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contain-text


1
อย่างน้อยเราก็รู้ว่า ABBYY ขาดเอกสารหรือฟังก์ชั่นการทำงาน (ที่พบใน Acrobat) เพื่อแบทช์ไฟล์ OCR ได้อย่างง่ายดาย OCR Simple OCR แบบกลุ่มของโฟลเดอร์เอกสารที่ไม่ใช่ OCRed เป็นคุณสมบัติที่ต้องการอย่างมาก (มากกว่าคุณสมบัติอื่น ๆ ของ ABBYY) เพียง google เพื่อค้นหาว่าความปรารถนานี้เป็นเรื่องปกติมากหากฉันไม่สามารถให้การอ้างอิงได้ ขอบคุณสำหรับตัวเลือกอื่น ๆ ฉันจะตรวจสอบพวกเขา แต่ตอนนี้ให้ทุกคนที่มาที่นี่เพื่อค้นหาวิธีการทำงานทั่วไปนี้ (มีที่อ้างอิง) รู้ว่าเราได้ยินจากปากม้าที่ ABBYY ไม่สามารถทำได้
Joe

Batch OCR มีอยู่ใน ABBYY FineReader Professional ในคำถามของคุณคุณต้องระบุ OCR โดยอัตโนมัติ ตอนนี้คุณต้องการเพียงการประมวลผลแบบแบทช์ โปรดชัดเจนในสิ่งที่คุณต้องการ
Nikolay

อ่านข้างต้น ฉันพูดว่า 'OCR batch ง่าย', 'ชุดที่ง่าย ocr ของโฟลเดอร์' เพิ่มเติมขึ้น: "หากคุณสามารถค้นหาวิธีการแบทช์อัตโนมัติ OCR .. มันค่อนข้างชัดเจนว่าฉันต้องการอะไร ดังนั้นขอให้ชัดเจนสำหรับทุกคนที่เข้าชมหน้านี้: * หากคุณต้องการ 'กระบวนการแบตช์' โฟลเดอร์ของไฟล์ PDF ที่ใช้อินเทอร์เฟซที่ซับซ้อนและน่ากลัวพร้อมตัวเลือกการบันทึกที่น่ากลัวในกระบวนการที่ใช้งานหนักมาก ABBYY เป็น 'Easy OTC batch OCR', 'simple batch ocr' ที่มีการโต้ตอบผู้ใช้น้อยเช่นผู้อื่นนับพันอย่าง Acrobat ทำแล้ว ABBYY Finereader ไม่เหมาะสำหรับคุณ
Joe

2

บน linux

วิธีที่ดีที่สุดและง่ายที่สุดคือการใช้pypdfocrมันไม่ได้เปลี่ยนแปลง PDF

pypdfocr your_document.pdf

ในตอนท้ายคุณจะมีอีกyour_document_ocr.pdfวิธีที่คุณต้องการด้วยข้อความที่ค้นหาได้ แอพไม่เปลี่ยนคุณภาพของภาพ เพิ่มขนาดของไฟล์เล็กน้อยโดยการเพิ่มข้อความซ้อนทับ

ในการแบทช์ไฟล์ PDF

ls ./p*.pdf | xargs -L1 -I {}  pypdfocr {}

หากไฟล์ PDF อยู่ในโฟลเดอร์ย่อย:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  pypdfocr {}

อัปเดต 3 พฤศจิกายน 2018:

pypdfocrไม่ได้รับการสนับสนุนอีกต่อไปตั้งแต่ปี 2559 และฉันสังเกตเห็นปัญหาบางอย่างเนื่องจากไม่มีการพูดถึง ocrmypdf( โมดูล ) ทำงานที่คุ้นเคยและสามารถใช้ดังนี้:

ocrmypdf in.pdf out.pdf

ติดตั้ง:

pip install ocrmypdf

หรือ

apt install ocrmypdf

ดังนั้นคำสั่งจะกลายเป็น

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  ocrmypdf {} {}_ocr.pdf 

1

ฉันประสบความสำเร็จในต้นปี 2558 ที่ทำ OCR แบบครบวงจรโดยใช้ Nuance OmniPage Ultimate บน windows ไม่ฟรีรายการราคา $ 500 ใช้โปรแกรมแบตช์ "DocuDirect" ที่รวมอยู่ มันมีตัวเลือก "เรียกใช้งานโดยไม่ต้องแจ้งใด ๆ " ซึ่งดูเหมือนว่าคำตอบโดยตรงกับคำถามเดิมของคุณ

ฉันใช้ DocuDirect เพื่อส่งออกไฟล์ PDF ที่ค้นหาได้หนึ่งไฟล์สำหรับภาพอินพุตแต่ละไฟล์ (เช่นไม่สามารถค้นหาได้) ไฟล์ PDF; สามารถบอกให้ทำซ้ำแผนผังไดเร็กทอรีอินพุตในโฟลเดอร์เอาต์พุตรวมถึงชื่อไฟล์อินพุตดั้งเดิม (เกือบ - ดูด้านล่าง) ใช้หลายแกนเช่นกัน ความแม่นยำเป็นสิ่งที่ดีที่สุดของแพ็คเกจที่ฉันประเมิน เอกสารที่มีการป้องกันด้วยรหัสผ่านจะถูกข้ามไป (โดยไม่หยุดงานโดยไม่แสดงกล่องโต้ตอบ)

ข้อแม้ที่ 1: เกือบจะเป็นชื่อไฟล์ต้นฉบับ - คำต่อท้าย ".PDF" จะกลายเป็น ".pdf" (เช่นจากตัวพิมพ์ใหญ่ถึงตัวพิมพ์เล็ก) เพราะนี่มันเหมือนกันหมดใน windows (ฮึ.)

ข้อแม้ที่ 2: ไม่มีไฟล์บันทึกดังนั้นการวิเคราะห์ว่าไฟล์ใดล้มเหลวระหว่างการรู้จำ - ซึ่งพวกเขาทำอย่างแน่นอน - กลับมาที่คุณ DocuDirect จะสร้างผลลัพธ์ที่อ่านไม่ออกอย่างมีความสุขเหมือนว่าทั้งหน้าหายไป ฉันเขียนสคริปต์ไพ ธ อนโดยใช้โมดูล PyPDF2 เพื่อใช้การตรวจสอบความถูกต้อง: การทดสอบว่าจำนวนหน้าผลลัพธ์ตรงกับจำนวนหน้าเข้า ดูด้านล่าง

ข้อแม้ที่ 3: ไฟล์ภาพอินพุตที่คลุมเครือและคลุมเครือจะทำให้ OmniPage หยุดทำงานชั่วคราวไม่ใช้ CPU ใด ๆ มันไม่เคยกู้คืน นี่เป็นผลมาจากการประมวลผลแบบกลุ่มและฉันไม่พบวิธีการแก้ไขใด ๆ ฉันยังรายงานสิ่งนี้ต่อ Nuance แต่ไม่มีที่ไหนเลย

@ Joe ถูกต้องเกี่ยวกับซอฟต์แวร์ที่เขียนโปรแกรมและจัดทำเอกสารไม่ดี ฉันสังเกตว่าแกนกลางของ OmniPage นั้นมีเทคโนโลยีเวทย์มนตร์จำตัวละครที่น่าทึ่ง แต่เปลือกนอก (การประมวลผล GUI และแบทช์) เพียงพอที่จะทำให้คุณดึงผม

ฉันรับรอง @ Joe's และ @ Kiwi แนะนำให้คัดกรองไฟล์โดยใช้สคริปต์เพื่อนำเสนอแพ็คเกจ OCR ด้วยเอกสารภาพที่ไม่มีการป้องกันเท่านั้น

ความผูกพันเพียงอย่างเดียวของฉันกับ Nuance คือลูกค้าไม่พอใจอย่างแน่นอน - ฉันมีชุดตั๋วสนับสนุนที่ยังไม่ได้แก้ไขเพื่อพิสูจน์ :)

@ โจ: คำตอบที่ล่าช้า แต่อาจจะยังเกี่ยวข้อง @ ชุมชน SuperUser: ฉันหวังว่าคุณจะรู้สึกว่านี่เป็นหัวข้อ

แพ็กเกจตัวตายตัวแทนคือ Nuance PowerPDF ขั้นสูงราคาปลีกเพียง $ 150 ฉันประสบความสำเร็จมากขึ้นด้วยสิ่งนี้มันแม่นยำและมีเสถียรภาพมากกว่า

การตรวจสอบความถูกต้องของสคริปต์ python ของ Pre / post-OCR tree

'''
Script to validate OCR outputs against inputs.
Both input and output are PDF documents in a directory tree.
For each input document, checks for the corresponding output
document and its page count.

Requires PyPDF2 from https://pypi.python.org/pypi/PyPDF2
'''

from __future__ import print_function
from PyPDF2 import PdfFileReader
import getopt
import os
import stat
import sys

def get_pdf_page_count(filename):
    '''
    Gets number of pages in the named PDF file.
    Fails on an encrypted or invalid file, returns None.
    '''
    with open(filename, "rb") as pdf_file:
        page_count = None
        err = None
        try:
            # slurp the file
            pdf_obj = PdfFileReader(pdf_file)
            # extract properties
            page_count = pdf_obj.getNumPages()
            err = ""
        except Exception:
            # Invalid PDF.
            # Limit exception so we don't catch KeyboardInterrupt etc.
            err = str(sys.exc_info())
            # This should be rare
            print("Warning: failed on file %s: %s" % (filename, err), file=sys.stderr)
            return None

    return page_count

def validate_pdf_pair(verbose, img_file, txt_file):
    '''
    Checks for existence and size of target PDF file;
    number of pages should match source PDF file.
    Returns True on match, else False.
    '''
    #if verbose: 
    #    print("Image PDF is %s" % img_file)
    #    print("Text PDF is %s" % txt_file)

    # Get source and target page counts
    img_pages = get_pdf_page_count(img_file)
    txt_pages = get_pdf_page_count(txt_file)
    if img_pages is None:
        # Bogus PDF, skip.
        print("Warning: failed to get page count for %s" % img_file, file=sys.stderr)
        return None
    if txt_pages is None:
        # Bogus PDF, skip.
        print("Warning: failed to get page count for %s" % txt_file, file=sys.stderr)
        return None

    retval = True
    if img_pages != txt_pages:
        retval = False
        print("Mismatch page count: %d in source %s, %d in target %s" % (img_pages, img_file, txt_pages, txt_file), file=sys.stderr)

    return retval


def validate_ocr_output(verbose, process_count, total_count, img_dir, txt_dir):
    '''
    Walks a tree of files to compare against output tree, calling self recursively.
    Returns a tuple with PDF file counts (matched, non-matched).
    '''
    # Iterate over the this directory
    match = 0
    nonmatch = 0
    for dirent in os.listdir(img_dir):
        src_path = os.path.join(img_dir, dirent)
        tgt_path = os.path.join(txt_dir, dirent)
        if os.path.isdir(src_path):
            if verbose: print("Found source dir %s" % src_path)
            # check target
            if os.path.isdir(tgt_path):
                # Ok to process
                (sub_match, sub_nonmatch) = validate_ocr_output(verbose, process_count + match + nonmatch, total_count, 
                                         src_path, tgt_path)
                match += sub_match
                nonmatch += sub_nonmatch
            else:
                # Target is missing!?
                print("Fatal: target dir not found: %s" % tgt_path, file=sys.stderr)

        elif os.path.isfile(src_path):
            # it's a plain file
            if src_path.lower().endswith(".pdf"):
                # check target
                # HACK: OmniPage changes upper-case PDF suffix to pdf;
                # of course not visible in Windohs with the case-insensitive 
                # file system, but it's a problem on linux.
                if not os.path.isfile(tgt_path):
                    # Flip lower to upper and VV
                    if tgt_path.endswith(".PDF"):
                        # use a slice
                        tgt_path = tgt_path[:-4] + ".pdf"
                    elif tgt_path.endswith(".pdf"):
                        tgt_path = tgt_path[:-4] + ".PDF"
                # hopefully it will be found now!
                if os.path.isfile(tgt_path):
                    # Ok to process
                    sub_match = validate_pdf_pair(verbose, src_path, tgt_path)
                    if sub_match:
                        match += 1
                    else:
                        nonmatch += 1
                    if verbose: print("File %d vs %d matches: %s" % (process_count + match + nonmatch, total_count, sub_match))

                else:
                    # Target is missing!?
                    print("Fatal: target file not found: %s" % tgt_path, file=sys.stderr)
                    nonmatch += 1

        else:
            # This should never happen
            print("Warning: not a directory nor file: %s" % src_path, file=sys.stderr)
    return (match, nonmatch)

def count_pdfs_listdir(verbose, src_dir):
    '''
    Counts PDF files in a tree using os.listdir, os.stat and recursion.
    Not nearly as elegant as os.walk, but hopefully very fast on
    large trees; I don't need the whole list in memory.
    '''
    count = 0
    for dirent in os.listdir(src_dir):
        src_path = os.path.join(src_dir, dirent)
        # stat the entry just once
        mode = os.stat(src_path)[stat.ST_MODE]
        if stat.S_ISDIR(mode):
            # It's a directory, recurse into it
            count += count_pdfs_listdir(verbose, src_path)
        elif stat.S_ISREG(mode):
            # It's a file, count it
            if src_path.lower().endswith('.pdf'):
                count += 1
        else:
            # Unknown entry, print an error
            print("Warning: not a directory nor file: %s" % src_path, file=sys.stderr)
    return count

def main(args):
    '''
    Parses command-line arguments and processes the named dirs.
    '''
    try:
        opts, args = getopt.getopt(args, "vi:o:")
    except getopt.GetoptError:
        usage()
    # default values
    verbose = False
    in_dir = None
    out_dir = None
    for opt, optarg in opts:
        if opt in ("-i"):
            in_dir = optarg
        elif opt in ("-o"):
            out_dir = optarg
        elif opt in ("-v"):
            verbose = True
        else:
            usage()
    # validate args
    if in_dir is None or out_dir is None: usage()
    if not os.path.isdir(in_dir):
        print("Not found or not a directory: %s" % input, file=sys.stderr)
        usage()
    if not os.path.isdir(out_dir):
        print("Not found or not a directory: %s" % out_dir, file=sys.stderr)
        usage()
    if verbose: 
        print("Validating input %s -> output %s" % (in_dir, out_dir))
    # get to work
    print("Counting files in %s" % in_dir)
    count = count_pdfs_listdir(verbose, in_dir)
    print("PDF input file count is %d" % count)
    (match,nomatch) = validate_ocr_output(verbose=verbose, process_count=0, total_count=count, img_dir=in_dir, txt_dir=out_dir) 
    print("Results are: %d matches, %d mismatches" % (match, nomatch))

def usage():
    print('Usage: validate_ocr_output.py [options] -i input-dir -o output-dir')
    print('    Compares pre-OCR and post-OCR directory trees')
    print('    Options: -v = be verbose')
    sys.exit()

# Pass all params after program name to our main
if __name__ == "__main__":
    main(sys.argv[1:])

ฉันเพิ่งเห็นการอัปเดตของคุณ ฉันจะลองดู ฉันหวังว่า OCR จะเงียบและไม่ล้มเหลว! (Wow! 1GB ไฟล์ดาวน์โหลด!)
Erb

0

คุณสามารถพิจารณา Autobahn DX ของ Aquaforest ได้ที่http://www.aquaforest.com/en/autobahn.asp

มันถูกออกแบบมาเพื่อประมวลผลชุดของ PDF และมีตัวเลือกที่หลากหลาย (เช่นข้ามหรือผ่านไฟล์ OCRed) รวมถึงตัวเลือกสำหรับการรักษาไฟล์ PDF ที่ชาญฉลาดซึ่งอาจให้ผลลัพธ์ที่ดีกว่า (เช่นถ้า PDF มีหน้าภาพบางหน้าและบางส่วน หน้าข้อความก็สามารถ OCR หน้าภาพ)


หากคุณเข้าร่วมผลิตภัณฑ์ดังกล่าวโปรดพูดอย่างชัดเจนโดยแก้ไขคำถามของคุณ
slhck

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.