Batch-OCR banyak PDF

20

Ini telah dibahas setahun yang lalu di sini:

Batch OCR untuk banyak file PDF (belum OCR)

Apakah ada cara untuk batch OCR PDF yang belum OCRed? Ini, saya pikir, keadaan saat ini berurusan dengan dua masalah:

Batch OCR PDF

Windows

  • Acrobat - Ini adalah mesin OCR paling lurus yang akan batch OCR. Satu-satunya masalah tampaknya 1) ia tidak akan melewatkan file yang sudah OCRed 2) mencoba melemparkan banyak PDF ke dalamnya (beberapa yang lama) dan melihatnya macet. Agak buggy. Ini akan memperingatkan Anda pada setiap kesalahan yang dihadapinya (meskipun Anda dapat memberi tahu perangkat lunak untuk tidak memberi tahu. Tetapi sekali lagi, perangkat ini mati mengerikan pada jenis PDF tertentu sehingga jarak tempuh Anda mungkin bervariasi.

  • ABBYY FineReader (Batch / Scansnap), Omnipage - Ini harus menjadi beberapa bagian dari perangkat lunak terprogram terburuk yang diketahui manusia. Jika Anda dapat menemukan cara untuk mengotomatisasi sepenuhnya (tanpa diminta) batch OCR dari penyimpanan PDF dengan nama yang sama maka silakan posting di sini. Tampaknya satu-satunya solusi yang saya temukan gagal di suatu tempat - penggantian nama, tidak sepenuhnya otomatis, dll. Yang terbaik, ada cara untuk melakukannya, tetapi dokumentasi dan pemrogramannya begitu mengerikan sehingga Anda tidak akan pernah mengetahuinya.

  • ABBYY FineReader Engine , ABBYY Recognition Server - Ini benar-benar lebih banyak solusi perusahaan, Anda mungkin lebih baik mendapatkan acrobat untuk melindas folder dan mencoba dan menghapus pdf yang memberi Anda kesalahan / crash program daripada harus repot mencoba untuk menginstal perangkat lunak evaluasi (dengan asumsi Anda adalah pengguna akhir yang sederhana). Tampaknya tidak kompetitif untuk pengguna kecil.

  • ** Autobahn DX workstation ** biaya produk ini sangat mahal, Anda mungkin bisa membeli 6 salinan acrobat. Bukan solusi pengguna akhir. Jika Anda pengaturan perusahaan, ini mungkin layak untuk Anda.

Linux

  • WatchOCR - tidak lagi dikembangkan, dan pada dasarnya tidak mungkin dijalankan pada distro Ubuntu modern
  • pdfsandwich - tidak lagi dikembangkan, pada dasarnya tidak mungkin dijalankan pada distro Ubuntu modern
  • ** ABBY LINUX OCR ** - ini harus dapat skrip, dan tampaknya memiliki beberapa hasil yang baik:

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

Namun, seperti banyak produk ABBYY lain yang mereka tetapkan oleh halaman, sekali lagi, Anda mungkin lebih baik mencoba membuat Acrobat Batch OCR untuk bekerja.

  • ** Ocrad, GOCR, OCRopus, tesseract, ** - ini dapat bekerja tetapi ada beberapa masalah:

    1. Hasil OCR tidak sebesar, katakanlah, acrobat untuk beberapa di antaranya (lihat tautan di atas).
    2. Tidak ada program yang mengambil file PDF dan menghasilkan file PDF. Anda harus membuat skrip dan memisahkan PDF terlebih dahulu dan menjalankan program di atas masing-masing dan kemudian memasang kembali file sebagai pdf
    3. Setelah melakukannya, Anda mungkin menemukan, seperti yang saya lakukan, bahwa (tesseract) menciptakan lapisan OCR yang bergeser. Jadi, jika Anda mencari kata 'the', Anda akan mendapatkan sorotan dari bagian kata di sebelahnya.
  • Batch DjVu → Konversi ke PDF - belum melihat ke dalamnya, tetapi sepertinya solusi putaran-a-pertarungan yang mengerikan.

On line

  • PDFcubed.com - ayolah, bukan solusi batch.
  • ABBYY Cloud OCR - tidak yakin apakah ini benar-benar solusi batch, bagaimanapun, Anda harus membayar berdasarkan halaman dan ini bisa menjadi sangat mahal.

Mengidentifikasi PDF non-OCRed

Ini adalah masalah yang sedikit lebih mudah, yang dapat diselesaikan dengan mudah di Linux dan apalagi di Windows. Saya dapat mengkodekan skrip perl menggunakan pdffontuntuk mengidentifikasi apakah font tertanam untuk menentukan file mana yang tidak-OCR.


"Solusi" saat ini

  1. Gunakan skrip untuk mengidentifikasi pdf non-OCR (sehingga Anda tidak menjalankan ulang lebih dari ribuan PDF OCR) dan menyalinnya ke direktori sementara (mempertahankan pohon direktori yang benar) dan kemudian menggunakan Acrobat pada Windows untuk menjalankan lebih dari ini berharap bahwa semakin kecil batch tidak akan crash.

  2. gunakan skrip yang sama tetapi dapatkan salah satu alat ocr linux agar berfungsi dengan baik, mempertaruhkan kualitas ocr.

Saya pikir saya akan mencoba # 1, saya hanya khawatir terlalu banyak tentang hasil dari alat-alat Linux OCR (saya kira tidak ada yang melakukan perbandingan) dan memecah file dan menjahit bersama lagi tampaknya menjadi pengkodean yang tidak perlu jika Adobe benar-benar dapat membuat batch direktori OCR tanpa tersedak.

Jika Anda menginginkan solusi yang benar-benar gratis, Anda harus menggunakan skrip untuk mengidentifikasi pdf non-OCRed (atau hanya menjalankan kembali yang OCRed), dan kemudian menggunakan salah satu alat linux untuk mencoba dan OCR mereka. Teseract tampaknya memiliki hasil terbaik, tetapi sekali lagi, beberapa alat ini tidak didukung dengan baik di versi modern Ubuntu, meskipun jika Anda dapat mengaturnya dan memperbaiki masalah yang saya miliki di mana lapisan gambar tidak cocok dengan lapisan pencocokan teks ( dengan tesseract) maka Anda akan memiliki solusi yang cukup bisa diterapkan dan sekali lagi Linux> Windows.


Apakah Anda memiliki solusi yang berfungsi untuk mengotomatisasi sepenuhnya, batch OCR PDF , melompati file yang sudah OCR dengan nama yang sama, dengan kualitas tinggi ? Jika demikian, saya akan sangat menghargai masukannya.


Script Perl untuk memindahkan file non-OCR ke direktori temp. Tidak dapat menjamin ini berfungsi dan mungkin perlu ditulis ulang, tetapi jika seseorang membuatnya bekerja (dengan asumsi itu tidak berfungsi) atau bekerja lebih baik, beri tahu saya dan saya akan memposting versi yang lebih baik di sini.


#!/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\'`;
                }
            }

        }

    }
}
Joe
sumber
Halo, Bisakah Anda berbagi skrip Windows "untuk mengidentifikasi pdf non-OCRed (...) dan menyalinnya ke direktori sementara (mempertahankan pohon direktori yang benar)? Terima kasih sebelumnya;)
Erb
@ David ok terserah. Saya memperingatkan Anda bahwa itu mungkin tidak berjalan dengan benar pertama kali. Ini tidak akan merusak pdf Anda sama sekali (itu hanya salinan, itu tidak menyentuh aslinya) tetapi yang saya maksud adalah bahwa Anda mungkin harus memodifikasi skrip. Jika Anda tahu perl itu akan mudah, jika tidak beri tahu saya, atau Anda mungkin dapat men-debug sendiri dan melakukan pengeditan kecil yang diperlukan.
Joe
Terimakasih banyak. Saya akan mencoba membuatnya bekerja (bahkan jika saya baru dengan perl). Terima kasih.
Erb
Mungkin ide lain di Windows (bekerja di XP)? Saya telah menggunakan ini di masa lalu untuk "menghapus dari folder (dengan subfolder) semua file pdf yang tidak memiliki kata sandi". Idenya adalah untuk menjaga semua file pdf yang dilindungi kata sandi. Salin dengan Syncback freeware semua pdf (dengan subfolder terkait) di folder baru (C: \ 5 \ "). Tambahkan pdftotext.exe dan file teks ini diganti namanya di del_pdf_no_password.bat. Isinya:" UNTUK / RC: \ 5 \% % x IN (* .PDF) DO (pdftotext %% x NUL && DEL %% x) "di mana" C: \ 5 \ "adalah folder yang akan diubah. Kemudian mulailah pdftotext.exe dan hanya file .bat.
Erb
Lebih detail: Anda harus menghapus spasi kosong (+ karakter khusus seperti "," ...) di dalam nama folder apa pun dengan pembuat nama freeware (seperti misalnya: alternativeto.net/software/renamer ). Kalau tidak, itu tidak akan bekerja untuk semua subfolder! P: Saya tidak menulis skrip ini (saya dibantu oleh seseorang pada ... 2004!)
Erb

Jawaban:

3

Saya juga telah mencari cara untuk batch-OCR banyak PDF secara otomatis, tanpa banyak keberuntungan. Pada akhirnya saya telah menemukan solusi yang bisa diterapkan mirip dengan Anda, menggunakan Acrobat dengan skrip sebagai berikut:

  1. Salin semua PDF yang relevan ke direktori tertentu.

  2. Hapus PDF yang sudah mengandung teks (dengan asumsi mereka sudah OCRd atau sudah teks - tidak ideal saya tahu, tetapi cukup baik untuk saat ini).

  3. Gunakan AutoHotKey untuk secara otomatis menjalankan Acrobat, pilih direktori tertentu, dan OCR semua dokumen, tambahkan "-ocr" ke nama file mereka.

  4. Pindahkan OCRd PDF kembali ke lokasi aslinya, menggunakan keberadaan file "-ocr.pdf" untuk menentukan apakah itu berhasil.

Ini agak Heath Robinson , tetapi sebenarnya bekerja cukup baik.

Kiwi
sumber
Mengapa Anda perlu menggunakan Autohotkey jika Acrobat sudah batch batch direktori? Jika Anda khawatir tentang pengulangan proses jika acrobat crash, cap waktu yang dimodifikasi file akan memberi tahu Anda di mana Anda tinggalkan. Jika Anda ingin menyimpan aslinya, Anda cukup menyalin direktori. Jika Anda hanya ingin -ok di akhir Anda hanya dapat melakukan perubahan nama batch setelah Anda selesai.
Joe
1
Halo, Untungnya, Anda dapat membagikan bagaimana Anda melakukan poin 2. dan 3. di Windows? Terima kasih sebelumnya;)
Erb
2

Saya percaya Anda perlu menyadari bahwa ABBYY FineReader adalah solusi pengguna akhir yang dirancang untuk memberikan OCR out-of-the-box yang cepat & akurat.

Berdasarkan pengalaman saya, proyek-proyek OCR memiliki detail yang sangat berbeda setiap kali dan tidak ada cara membuat soulition di luar kotak untuk setiap kasus unik. Tetapi saya dapat menyarankan Anda alat yang lebih profesional yang dapat melakukan pekerjaan untuk Anda:

  • Lihatlah ABBYY Recognition Server , ini adalah produk profesional untuk otomatisasi OCR.

  • Ketika datang ke linux, lihat di http://ocr4linux.com , ini adalah utilitas baris perintah yang mungkin cocok untuk Anda juga.

  • Untuk tugas yang lebih kompleks, ABBYY memiliki SDK yang sangat fleksibel seperti ABBYY FineReader Engine (in-house host) atau ABBYY Cloud OCR SDK (berdasarkan Microsoft Azure cloud), yang memungkinkan Anda memilih pemrosesan OCR seperti yang Anda inginkan.

Saya adalah bagian dari tim pengembangan front-end untuk layanan cloud yang ditentukan di atas dan dapat memberikan lebih banyak info tentang itu jika perlu.

Mengingat pencarian lapisan teks dalam PDF, saya tidak bisa memberikan saran tentang itu, karena tugas ini sedikit mengesampingkan OCR yang merupakan spesialisasi saya, jadi saya menemukan pendekatan Anda menggunakan skrip eksternal sangat masuk akal. Mungkin Anda akan menemukan diskusi ini bermanfaat: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text

Nikolay
sumber
1
Yah setidaknya kita tahu bahwa ABBYY tidak memiliki dokumentasi atau fungsionalitas (yang ditemukan di Acrobat) untuk dengan mudah mengumpulkan OCR folder pdf. Batch sederhana OCR dari folder dokumen non-OCR adalah fitur yang sangat diinginkan (jauh lebih banyak dari beberapa fitur ABBYY lainnya). Hanya google untuk mencari tahu seberapa umum keinginan ini, jika tidak, saya dapat memberikan kutipan. Terima kasih atas pilihan lain, saya akan melihat ke dalamnya, tetapi untuk sekarang biarkan siapa pun yang datang ke sini mencari cara untuk menyelesaikan tugas yang SANGAT umum ini (mengutip tersedia) tahu bahwa kami mendengarnya dari mulut kuda bahwa ABBYY tidak dapat melakukan ini.
Joe
Batch OCR tersedia di ABBYY FineReader Professional. Dalam pertanyaan Anda, Anda menyatakan perlunya mengotomatisasi OCR sepenuhnya. Sekarang Anda hanya perlu pemrosesan batch. Harap jelaskan apa yang sebenarnya Anda butuhkan.
Nikolay
Baca di atas. Saya mengatakan 'MUDAH batch OCR', 'Batch sederhana dari folder'. Lebih jauh ke atas: "Jika Anda dapat menemukan cara untuk mengotomatisasi OCR batch secara penuh ..". Cukup jelas apa yang saya inginkan. Jadi, mari kita perjelas kepada siapa pun yang mengunjungi halaman ini: * Jika Anda ingin 'batch proses' folder pdf menggunakan antarmuka yang mengerikan, rumit dengan opsi simpan yang mengerikan dalam proses padat pengguna yang intensif, ABBYY dapat bekerja untuk Anda * Jika Anda ingin untuk 'EASILY batch OCR', 'batch sederhana oCR' dengan sedikit interaksi pengguna seperti ribuan lainnya, seperti yang sudah dilakukan Acrobat, ABBYY Finereader bukan untuk Anda.
Joe
2

Di linux

Cara terbaik dan termudah di luar sana adalah menggunakannya pypdfocrtidak mengubah pdf

pypdfocr your_document.pdf

Pada akhirnya Anda akan memiliki your_document_ocr.pdfcara lain yang Anda inginkan dengan teks yang dapat dicari. Aplikasi tidak mengubah kualitas gambar. Menambah ukuran file sedikit dengan menambahkan teks overlay.

Untuk mengumpulkan pdf

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

Jika PDF ada di dalam sub-folder:

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

Pembaruan 3 November 2018:

pypdfocrtidak lagi didukung sejak 2016 dan saya melihat beberapa masalah karena tidak dibimbing. ocrmypdf( modul ) melakukan pekerjaan similiar dan dapat digunakan seperti ini:

ocrmypdf in.pdf out.pdf

Untuk memasang:

pip install ocrmypdf

atau

apt install ocrmypdf

jadi perintah itu akan menjadi

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

Saya memiliki beberapa keberhasilan pada awal 2015 melakukan OCR batch sepenuhnya menggunakan Nuance OmniPage Ultimate di windows. Tidak gratis, daftar harga $ 500. Gunakan program batch "DocuDirect" yang disertakan. Ini memiliki opsi "Jalankan pekerjaan tanpa konfirmasi" yang tampaknya merupakan jawaban langsung untuk pertanyaan awal Anda.

Saya menggunakan DocuDirect untuk menghasilkan satu file PDF yang dapat dicari untuk setiap gambar input (yaitu, tidak dapat dicari) file PDF; dapat dikatakan untuk mereplikasi pohon direktori input di folder output serta nama file input asli (hampir - lihat di bawah). Menggunakan beberapa core juga. Akurasi adalah yang terbaik dari paket yang saya evaluasi. Dokumen yang dilindungi kata sandi dilewati (tanpa menghentikan pekerjaan, tanpa menunjukkan dialog).

Peringatan 1: Hampir nama file aslinya - akhiran ".PDF" menjadi ".pdf" (yaitu, dari huruf besar ke huruf kecil) karena hei, semuanya sama di windows. (Ugh.)

Peringatan 2: Tidak ada file log sehingga mendiagnosis file mana yang gagal selama pengenalan - yang pasti mereka lakukan - kembali pada Anda. DocuDirect akan dengan senang hati menghasilkan output yang kacau seperti seluruh halaman hilang begitu saja. Saya menulis skrip python menggunakan modul PyPDF2 untuk mengimplementasikan validasi mentah: menguji bahwa jumlah halaman output cocok dengan jumlah halaman input. Lihat di bawah.

Peringatan 3: File gambar input fuzzy, tidak jelas akan menyebabkan OmniPage menggantung selamanya, tidak menggunakan CPU apa pun; itu tidak pernah pulih. Ini benar-benar menggagalkan pemrosesan batch dan saya tidak menemukan solusi. Saya juga melaporkan ini ke Nuance, tetapi tidak berhasil.

@ Jo benar tentang perangkat lunak yang diprogram dan didokumentasikan dengan buruk. Saya perhatikan inti dari OmniPage memiliki teknologi sihir pengenal karakter yang luar biasa, tetapi cangkang luar (GUI & pemrosesan batch) sudah cukup untuk membuat Anda menarik rambut Anda.

Saya mendukung saran @ Joe dan @ Kiwi untuk menyaring file menggunakan skrip, sehingga untuk menyajikan paket OCR hanya dengan dokumen gambar yang tidak dilindungi.

Afiliasi saya satu-satunya dengan Nuance adalah sebagai pelanggan yang tidak sepenuhnya puas - Saya memiliki banyak tiket dukungan yang belum terselesaikan untuk membuktikannya :)

@ Jo: Jawaban terlambat, tapi mungkin masih relevan. Komunitas @SuperUser: Saya harap Anda merasa ini ada pada topik.

** Pembaruan ** paket penggantinya adalah Nuance PowerPDF Advanced, daftar harga hanya $ 150. Saya bahkan lebih sukses dengan ini, itu sama akurat tetapi jauh lebih stabil.

Skrip python validasi pohon pra / pasca-OCR berikut.

'''
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:])
chrisinmtown
sumber
Saya baru saja melihat pembaruan Anda. Saya akan mencobanya. Saya harap itu melakukan OCR secara diam-diam dan tanpa menabrak! (Wow! File unduhan 1GB!)
Erb
0

Anda dapat mempertimbangkan Aquaforest Autobahn DX: http://www.aquaforest.com/en/autobahn.asp

Ini dirancang untuk memproses kumpulan PDF dan memiliki beragam opsi (mis. Lewati atau lewati file OCR) serta opsi untuk penanganan cerdas PDF yang mungkin menawarkan hasil yang lebih baik (misalnya jika PDF memiliki beberapa halaman gambar dan beberapa halaman teks, bisa saja OCR halaman gambar)

Neil Pitman
sumber
Jika Anda berafiliasi dengan produk itu, harap katakan secara eksplisit dengan mengedit pertanyaan Anda.
slhck
0

Pada Macatau Linux:

parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf

Dari sini .

André Levy
sumber