Batch-OCR nhiều tệp PDF


20

Điều này đã được thảo luận một năm trước đây:

Batch OCR cho nhiều tệp PDF (chưa OCRed)?

Có cách nào để xử lý các tệp PDF OCR chưa được OCRed không? Đây là, tôi nghĩ, tình trạng hiện tại của những thứ liên quan đến hai vấn đề:

Batch OCR PDF

các cửa sổ

  • Acrobat - Đây là công cụ ocr đơn giản nhất sẽ bó OCR. Vấn đề duy nhất có vẻ là 1) nó sẽ không bỏ qua các tệp đã được OCRed 2) thử ném một loạt các tệp PDF vào nó (một số cũ) và xem nó bị sập. Đó là một lỗi nhỏ. Nó sẽ cảnh báo bạn ở mỗi lỗi mà nó gặp phải (mặc dù bạn có thể yêu cầu phần mềm không thông báo. Nhưng một lần nữa, nó lại chết một cách khủng khiếp trên một số loại PDF nhất định để số dặm của bạn có thể thay đổi.

  • ABBYY FineReader (Batch / Scansnap), Omnipage - Đây phải là một trong những phần mềm được lập trình tồi tệ nhất mà con người biết đến. Nếu bạn có thể tìm hiểu làm thế nào để tự động hóa hoàn toàn (không cần nhắc) hàng loạt OCR lưu tệp PDFcùng tên thì vui lòng đăng ở đây. Dường như các giải pháp duy nhất tôi có thể tìm thấy thất bại ở đâu đó - đổi tên, không hoàn toàn tự động, v.v. Tốt nhất, có một cách để làm điều đó, nhưng tài liệu và lập trình rất khủng khiếp mà bạn sẽ không bao giờ tìm ra.

  • ABBYY FineReader Engine , ABBYY Recognition Server - Đây thực sự là những giải pháp dành cho doanh nghiệp nhiều hơn, có lẽ bạn sẽ tốt hơn nếu chỉ cần acrobat để chạy qua một thư mục và thử và loại bỏ các tệp pdf gây ra lỗi / làm hỏng chương trình hơn là gặp rắc rối khi thử để cài đặt phần mềm đánh giá (giả sử bạn là người dùng cuối đơn giản). Không có vẻ cạnh tranh chi phí cho người dùng nhỏ.

  • ** Máy trạm Autobahn DX ** chi phí của sản phẩm này rất nghiêm ngặt, bạn có thể mua 6 bản acrobat. Không thực sự là một giải pháp người dùng cuối. Nếu bạn là một thiết lập doanh nghiệp, điều này có thể xứng đáng với bạn.

Linux

  • WatchOCR - không còn được phát triển và về cơ bản không thể chạy trên các bản phân phối Ubuntu hiện đại
  • pdfsandwich - không còn được phát triển, về cơ bản không thể chạy trên các bản phân phối Ubuntu hiện đại
  • ** ABBY LINUX OCR ** - đây có thể là tập lệnh và dường như có một số kết quả tốt:

http://www.splitbrain.org/blog/2010-06/15-linux_ nền_software_comparison

Tuy nhiên, giống như nhiều sản phẩm ABBYY khác mà họ tính phí trên trang, một lần nữa, bạn có thể tốt hơn khi cố gắng để Acrobat Batch OCR hoạt động.

  • ** Ocrad, GOCR, OCRopus, tesseract, ** - những thứ này có thể hoạt động nhưng có một vài vấn đề:

    1. Kết quả OCR không tuyệt vời như, nói, acrobat cho một số trong số này (xem liên kết ở trên).
    2. Không có chương trình nào nhận tệp PDF và xuất tệp PDF. Trước tiên, bạn phải tạo một tập lệnh và tách PDF ra và chạy các chương trình trên mỗi tập tin và sau đó tập hợp lại tập tin dưới dạng pdf
    3. Khi bạn làm như vậy, bạn có thể thấy, giống như tôi đã làm, điều đó (tesseract) tạo ra một lớp OCR được chuyển qua. Vì vậy, nếu bạn tìm kiếm từ 'the', bạn sẽ nhận được phần nổi bật của phần bên cạnh từ đó.
  • Batch DjVu → Chuyển đổi sang PDF - chưa nhìn vào nó, nhưng có vẻ như là một giải pháp vòng quanh khủng khiếp.

Trực tuyến

  • PDFcubed.com - thôi nào, không thực sự là một giải pháp hàng loạt.
  • ABBYY Cloud OCR - không chắc đây có thực sự là một giải pháp hàng loạt hay không, dù sao đi nữa, bạn phải trả tiền theo trang và điều này có thể khá tốn kém.

Xác định các tệp PDF không OCRed

Đây là một vấn đề dễ dàng hơn một chút, có thể được giải quyết dễ dàng trong Linux và ít hơn nhiều trong Windows. Tôi đã có thể mã một tập lệnh perl bằng cách sử dụng pdffontđể xác định xem các phông chữ có được nhúng để xác định tệp nào không-OCRed hay không.


"Giải pháp" hiện tại

  1. Sử dụng tập lệnh để xác định các tệp pdf không OCRed (vì vậy bạn không chạy lại hàng ngàn tệp PDF OCRed) và sao chép chúng vào một thư mục tạm thời (giữ lại cây thư mục chính xác) và sau đó sử dụng Acrobat trên Windows để chạy với những hy vọng nhỏ hơn lô sẽ không sụp đổ.

  2. sử dụng cùng một tập lệnh nhưng có được một trong các công cụ ocr linux để hoạt động đúng, gây rủi ro cho chất lượng ocr.

Tôi nghĩ rằng tôi sẽ thử # 1, tôi chỉ lo lắng quá nhiều về kết quả của các công cụ OCR của Linux (tôi không cho rằng bất kỳ ai đã thực hiện một phép so sánh) và phá vỡ các tệp và ghép chúng lại với nhau là mã hóa không cần thiết nếu Adobe thực sự có thể bó OCR một thư mục mà không bị nghẹn.

Nếu bạn muốn một giải pháp hoàn toàn miễn phí, bạn sẽ phải sử dụng tập lệnh để xác định các tệp pdf không OCRed (hoặc chỉ chạy lại các tệp OCRed), sau đó sử dụng một trong các công cụ linux để thử và OCR chúng. Teseract dường như có kết quả tốt nhất, nhưng một lần nữa, một số công cụ này không được hỗ trợ tốt trong các phiên bản Ubuntu hiện đại, mặc dù nếu bạn có thể thiết lập và khắc phục sự cố tôi gặp phải khi lớp hình ảnh không khớp với lớp khớp văn bản ( với tesseract) thì bạn sẽ có một giải pháp khá khả thi và một lần nữa Linux> Windows.


Bạn có một giải pháp làm việc để tự động hóa hoàn toàn, các tệp PDF OCR hàng loạt , bỏ qua các tệp OCRed giữ cùng tên, với chất lượng cao không? Nếu vậy, tôi thực sự sẽ đánh giá cao đầu vào.


Tập lệnh Perl để di chuyển các tệp không OCRed vào thư mục tạm thời. Không thể đảm bảo điều này hoạt động và có thể cần phải viết lại, nhưng nếu ai đó làm cho nó hoạt động (giả sử nó không hoạt động) hoặc hoạt động tốt hơn, hãy cho tôi biết và tôi sẽ đăng một phiên bản tốt hơn ở đây.


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

        }

    }
}

Xin chào, bạn có thể vui lòng chia sẻ tập lệnh Windows "của mình để xác định các tệp pdf không OCRed (...) và sao chép chúng vào một thư mục tạm thời (giữ lại cây thư mục chính xác) không? Cảm ơn trước;)
Erb

@David ok nó lên. Tôi cảnh báo bạn rằng nó có thể không chạy đúng lần đầu tiên. Điều này sẽ không làm hỏng pdf của bạn (nó chỉ là bản sao, nó không chạm vào bản gốc) nhưng ý tôi là bạn có thể phải sửa đổi tập lệnh. Nếu bạn biết perl thì sẽ rất dễ, nếu không cho tôi biết, hoặc bạn có thể tự gỡ lỗi và thực hiện các chỉnh sửa nhỏ cần thiết.
Joe

Cảm ơn nhiều. Tôi sẽ cố gắng làm cho nó hoạt động (ngay cả khi tôi mới sử dụng perl). Cảm ơn.
Erb

Có lẽ một ý tưởng khác trong Windows (làm việc trong XP)? Tôi đã sử dụng điều này trong quá khứ để "xóa khỏi thư mục (có thư mục con) tất cả các tệp pdf không có mật khẩu". Ý tưởng là giữ cho tất cả các tệp pdf được bảo vệ bằng mật khẩu. Sao chép bằng phần mềm miễn phí Syncback tất cả pdf (với các thư mục con có liên quan) trong một thư mục mới (C: \ 5 \ "). Thêm pdftotext.exe và tệp văn bản này được đổi tên trong del_pdf_no_password.bat. Nội dung của nó:" FOR / RC: \ 5 \% % x IN (* .PDF) DO (pdftotext %% x NUL && DEL %% x) "trong đó" C: \ 5 \ "là thư mục cần thay đổi. Sau đó, khởi động pdftotext.exe và chỉ sau đó là tệp .bat.
Erb

Thêm chi tiết: bạn sẽ cần xóa các khoảng trống (+ ký tự đặc biệt như "," ...) bên trong bất kỳ tên thư mục nào có bộ đổi tên phần mềm miễn phí (ví dụ: Alternativeto.net/software/renamer ). Nếu không, nó sẽ không hoạt động cho tất cả các thư mục con! Ps: Tôi đã không viết kịch bản này (Tôi đã được ai đó giúp đỡ trong ... 2004!)
Erb

Câu trả lời:


3

Tôi cũng đã tìm kiếm một cách để OCR nhiều tệp PDF theo cách tự động, mà không gặp nhiều may mắn. Cuối cùng, tôi đã đưa ra một giải pháp khả thi tương tự như của bạn, sử dụng Acrobat với một kịch bản như sau:

  1. Sao chép tất cả các tệp PDF có liên quan vào một thư mục cụ thể.

  2. Xóa các tệp PDF đã chứa văn bản (giả sử chúng đã là OCRd hoặc đã là văn bản - tôi không biết lý tưởng, nhưng đủ tốt cho bây giờ).

  3. Sử dụng AutoHotKey để tự động chạy Acrobat, chọn thư mục cụ thể và OCR tất cả các tài liệu, nối thêm "-oc" vào tên tệp của chúng.

  4. Di chuyển các tệp PDF OCRd trở lại vị trí ban đầu của chúng, bằng cách sử dụng sự hiện diện của tệp "-oc.pdf" để xác định xem nó có thành công hay không.

Đó là một chút Heath Robinson , nhưng thực sự hoạt động khá tốt.


Tại sao bạn cần sử dụng AutoHotKey nếu Acrobat sẽ bó ocr một thư mục? Nếu bạn lo lắng về việc lặp lại quy trình nếu acrobat gặp sự cố, dấu thời gian đã sửa đổi tệp sẽ cho bạn biết nơi bạn rời đi. Nếu bạn muốn giữ bản gốc, bạn có thể sao chép thư mục. Nếu bạn chỉ muốn phần cuối cùng, bạn có thể thay đổi tên lô sau khi hoàn tất.
Joe

1
Xin chào, may mắn, bạn có thể chia sẻ cách bạn làm điểm 2. và 3. trong Windows không? Cảm ơn trước;)
Erb

2

Tôi tin rằng bạn cần nhận ra rằng ABBYY FineReader là một giải pháp người dùng cuối được thiết kế để cung cấp OCR nhanh chóng và chính xác.

Dựa trên kinh nghiệm của tôi, các dự án OCR có các chi tiết khác nhau đáng kể mỗi lần và không có cách nào tạo ra linh hồn cho mỗi trường hợp duy nhất. Nhưng tôi có thể đề xuất cho bạn các công cụ chuyên nghiệp hơn có thể thực hiện công việc cho bạn:

  • Hãy xem ABBYY Recognition Server , đây là một sản phẩm chuyên nghiệp cho tự động hóa OCR.

  • Khi đến với linux, hãy xem http: // nob4linux.com , đây là một tiện ích dòng lệnh có thể phù hợp với bạn.

  • Đối với các tác vụ phức tạp hơn, ABBYY có SDK rất linh hoạt như ABBYY FineReader Engine (được lưu trữ trong nhà) hoặc ABBYY Cloud OCR SDK (dựa trên đám mây Microsoft Azure), cho phép bạn xử lý OCR theo cách bạn muốn.

Tôi là một phần của nhóm phát triển front-end cho dịch vụ đám mây được chỉ định ở trên và có thể cung cấp thêm thông tin về nó nếu cần thiết.

Xem xét việc tra cứu một lớp văn bản trong PDF, tôi không thể đưa ra bất kỳ lời khuyên nào về điều đó, vì nhiệm vụ này hơi khác với OCR, đây là chuyên môn của tôi, vì vậy tôi thấy cách tiếp cận của bạn là sử dụng tập lệnh bên ngoài rất hợp lý. Có lẽ bạn sẽ thấy cuộc thảo luận này hữu ích: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scned-image-or-contains-text


1
Ít nhất chúng ta cũng biết rằng ABBYY thiếu tài liệu hoặc chức năng (có trong Acrobat) để dễ dàng bó OCR một thư mục pdf. OCR lô đơn giản của một thư mục tài liệu không phải OCRed là một tính năng cực kỳ mong muốn (nhiều hơn một số tính năng khác của ABBYY). Chỉ cần google để tìm hiểu mức độ phổ biến của mong muốn này, nếu không, tôi có thể cung cấp trích dẫn. Cảm ơn các lựa chọn khác, tôi sẽ xem xét chúng, nhưng bây giờ hãy để bất kỳ ai đến đây tìm kiếm cách hoàn thành nhiệm vụ chung RẤT (trích dẫn có sẵn) này biết rằng chúng tôi đã nghe thấy từ miệng ngựa mà ABBYY không thể làm điều này.
Joe

Batch OCR có sẵn trong ABBYY FineReader Professional. Trong câu hỏi của bạn, bạn nêu cần phải tự động hóa hoàn toàn OCR. Bây giờ bạn chỉ cần một xử lý hàng loạt. Hãy rõ ràng trong chính xác những gì bạn cần.
Nikolay

Đọc ở trên. Tôi đã nói 'DỄ DÀNG OCR', 'SIMPLE ocr của một thư mục'. Hơn nữa: "Nếu bạn có thể tìm hiểu làm thế nào để tự động hóa hoàn toàn (không cần nhắc) hàng loạt OCR ..". Đó là khá rõ ràng những gì tôi muốn. Vì vậy, hãy rõ ràng với bất kỳ ai truy cập trang này: * Nếu bạn muốn 'xử lý hàng loạt' một thư mục pdf sử dụng giao diện phức tạp, khủng khiếp với các tùy chọn lưu khủng khiếp trong quy trình sử dụng nhiều người dùng ABBYY có thể phù hợp với bạn * Nếu bạn muốn thành 'EASRY batch OCR', 'ocr lô đơn giản' với ít tương tác người dùng như hàng ngàn người khác, như Acrobat đã làm, ABBYY Finereader không dành cho bạn.
Joe

2

Trên linux

Cách tốt nhất và dễ nhất là sử dụng pypdfocrnó không thay đổi pdf

pypdfocr your_document.pdf

Cuối cùng, bạn sẽ có một your_document_ocr.pdfcách khác mà bạn muốn với văn bản có thể tìm kiếm. Ứng dụng không thay đổi chất lượng của hình ảnh. Tăng kích thước của tệp một chút bằng cách thêm văn bản lớp phủ.

Để bó các tệp pdf

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

Nếu các tệp PDF nằm trong các thư mục con:

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

Cập nhật ngày 3 tháng 11 năm 2018:

pypdfocrkhông còn được hỗ trợ kể từ năm 2016 và tôi nhận thấy một số vấn đề do không được lưu ý. ocrmypdf( mô-đun ) thực hiện một công việc quen thuộc và có thể được sử dụng như thế này:

ocrmypdf in.pdf out.pdf

Để cài đặt:

pip install ocrmypdf

hoặc là

apt install ocrmypdf

vì vậy lệnh sẽ trở thành

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

1

Tôi đã có một số thành công vào đầu năm 2015 khi thực hiện đầy đủ OCR hàng loạt bằng cách sử dụng Nuance OmniPage Ultimate trên windows. Không miễn phí, giá niêm yết $ 500. Sử dụng chương trình hàng loạt "DocuDirect" được bao gồm. Nó có một tùy chọn "Chạy công việc mà không có bất kỳ lời nhắc nào" có vẻ như câu trả lời trực tiếp cho câu hỏi ban đầu của bạn.

Tôi đã sử dụng DocuDirect để xuất một tệp PDF có thể tìm kiếm cho mỗi tệp hình ảnh đầu vào (nghĩa là không thể tìm kiếm); có thể yêu cầu sao chép cây thư mục đầu vào trong thư mục đầu ra cũng như tên tệp đầu vào ban đầu (gần như - xem bên dưới). Sử dụng nhiều lõi quá. Độ chính xác là tốt nhất trong các gói tôi đánh giá. Tài liệu được bảo vệ bằng mật khẩu được bỏ qua (không dừng công việc, không hiển thị hộp thoại).

Hãy cẩn thận 1: Hầu như tên tệp gốc - hậu tố ".PDF" trở thành ".pdf" (nghĩa là từ chữ hoa đến chữ thường) bởi vì này, tất cả đều giống nhau trên windows. (Ừ.)

Hãy cẩn thận 2: Không có tệp nhật ký để chẩn đoán tệp nào bị lỗi trong khi nhận dạng - điều mà chúng chắc chắn làm - đã trở lại với bạn. DocuDirect sẽ vui vẻ tạo ra các kết quả bị cắt xén giống như toàn bộ các trang bị thiếu. Tôi đã viết một kịch bản python bằng cách sử dụng mô-đun PyPDF2 để thực hiện xác nhận thô: kiểm tra xem số trang đầu ra khớp với số trang đầu vào. Xem bên dưới.

Hãy cẩn thận 3: Một tệp hình ảnh đầu vào mờ, không rõ ràng sẽ khiến OmniPage bị treo vĩnh viễn, không sử dụng bất kỳ CPU nào; nó chỉ không bao giờ phục hồi. Điều này thực sự làm hỏng việc xử lý hàng loạt và tôi không tìm thấy bất kỳ cách giải quyết nào. Tôi cũng đã báo cáo điều này với Nuance, nhưng chẳng đi đến đâu.

@Joe nói đúng về phần mềm được lập trình và ghi chép kém. Tôi lưu ý rằng lõi của OmniPage có công nghệ ma thuật nhận dạng nhân vật đáng kinh ngạc, nhưng lớp vỏ bên ngoài (GUI & xử lý hàng loạt) đủ để khiến bạn nhổ tóc.

Tôi tán thành đề xuất của @ Joe và @ Kiwi để sàng lọc các tệp bằng các tập lệnh, để chỉ hiển thị gói OCR với các tài liệu hình ảnh không được bảo vệ.

Mối quan hệ duy nhất của tôi với Nuance là một khách hàng không hài lòng - Tôi có một loạt vé hỗ trợ chưa được giải quyết để chứng minh điều đó :)

@Joe: Trả lời muộn, nhưng có lẽ vẫn còn liên quan. @SuperUser cộng đồng: Tôi hy vọng bạn cảm thấy đây là chủ đề.

** Cập nhật ** gói kế nhiệm là Nuance PowerPDF Advanced, giá niêm yết chỉ $ 150. Tôi thậm chí còn thành công hơn với điều này, nó chính xác nhưng ổn định hơn nhiều.

Kịch bản python xác thực trước / sau OCR sau.

'''
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:])

Tôi vừa thấy cập nhật của bạn. Tôi sẽ thử nó. Tôi hy vọng nó làm OCR âm thầm và không bị rơi! (Wow! Tệp tải xuống 1GB!)
Erb

0

Bạn có thể xem xét Autobahn DX của Aquaforest: http://www.aquaforest.com/en/autobahn.asp

Nó được thiết kế để xử lý các lô PDF và có nhiều tùy chọn (ví dụ: Bỏ qua hoặc chuyển qua các tệp OCRed) cũng như các tùy chọn để xử lý thông minh các tệp PDF có thể mang lại kết quả tốt hơn (ví dụ: nếu PDF có một số trang hình ảnh và một số trang trang văn bản, nó chỉ có thể OCR các trang hình ảnh)


Nếu bạn được liên kết với sản phẩm đó, vui lòng nói rõ bằng cách chỉnh sửa câu hỏi của bạn.
slhck

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.