배치 -OCR 많은 PDF


20

이것은 1 년 전에 여기에서 논의되었습니다 :

많은 PDF 파일에 대한 배치 OCR (아직 OCR이 아님)?

아직 OCR되지 않은 OCR PDF를 배치하는 방법이 있습니까? 이것은 두 가지 문제를 다루는 현재 상태입니다.

배치 OCR PDF

윈도우

  • Acrobat – OCR을 일괄 처리하는 가장 간단한 ocr 엔진입니다. 유일한 문제는 1) 이미 OCR 된 파일을 건너 뛰지 않을 것입니다 .2) 많은 PDF를 던져 (일부 오래된) 시도하고 충돌하는 것을보십시오. 약간 버그가 있습니다. 각 오류가 발생할 때마다 경고합니다 (소프트웨어에 알리지 말라고 말할 수는 있지만 특정 유형의 PDF에서 심하게 죽어서 마일리지가 다를 수 있습니다.

  • ABBYY FineReader (배치 / 스캔 스냅), 옴니 페이지 –이 프로그램은 사람에게 알려진 최악의 프로그램 중 하나입니다. 동일한 이름으로 저장 한 PDF의 배치 OCR 을 완전히 자동화 하는 방법을 찾을 수있는 경우 여기에 게시하십시오. 이름 바꾸기, 완전 자동화되지 않은 등 어딘가에서 실패했을 수있는 유일한 솔루션 인 것 같습니다. 최선의 방법은 있지만 문서와 프로그래밍은 너무 끔찍하여 결코 찾을 수 없습니다.

  • ABBYY FineReader Engine , ABBYY Recognition Server- 이것들은 실제로 더 많은 엔터프라이즈 솔루션입니다. 아마도 폴더를 통해 Acrobat을 실행하여 PDF를 시도하고 제거하는 것이 더 나을 것입니다. 평가 소프트웨어 설치 (단순한 최종 사용자라고 가정) 소규모 사용자에게는 비용 경쟁력이없는 것으로 보입니다.

  • ** 아우토반 DX 워크 스테이션 **이 제품의 가격이 너무 비싸므로 아마 6 개의 사본을 구입할 수 있습니다. 실제로 최종 사용자 솔루션이 아닙니다. 엔터프라이즈 환경이라면 이것이 가치가있을 것입니다.

리눅스

  • WatchOCR – 더 이상 개발되지 않았으며 기본적으로 현대 우분투 배포판에서 실행할 수 없습니다.
  • pdfsandwich – 더 이상 개발되지 않았으며 기본적으로 현대 우분투 배포판에서 실행할 수 없습니다.
  • ** 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 결과는 이들 중 일부에 대한 곡예사만큼 좋지 않습니다 (위 링크 참조).
    2. 어떤 프로그램도 PDF 파일을 받아서 PDF 파일을 출력하지 않습니다. 스크립트를 작성하고 PDF를 먼저 분리하고 각 프로그램을 실행 한 다음 파일을 pdf로 다시 어셈블해야합니다.
    3. 일단 당신이 한 것처럼, 당신은 (tesseract) 전환 된 OCR 레이어를 생성한다는 것을 알 수 있습니다. 따라서 'the'라는 단어를 검색하면 옆에있는 단어 부분이 강조 표시됩니다.
  • Batch DjVu → PDF로 변환 – 살펴 보지 않았지만 끔찍한 일주일 솔루션처럼 보입니다.

온라인

  • PDFcubed.com – 실제로 배치 솔루션이 아닙니다.
  • ABBYY Cloud OCR- 이것이 실제로 배치 솔루션인지 확실하지 않으면 페이지를 지불해야하며 비용이 많이들 수 있습니다.

OCR이 아닌 PDF 식별

이것은 약간 더 쉬운 문제이며 Linux에서는 쉽게 해결할 수 있으며 Windows에서는 훨씬 덜 해결할 수 있습니다. pdffontOCR이 아닌 파일을 결정하기 위해 글꼴이 포함되어 있는지 여부를 식별하기 위해 펄 스크립트를 코딩 할 수있었습니다 .


현재 "솔루션"

  1. 스크립트를 사용하여 OCR이 아닌 PDF를 식별하여 (수천 개의 OCR이있는 PDF를 다시 실행하지 않음) 임시 디렉토리 (올바른 디렉토리 트리를 유지)에 복사 한 다음 Windows에서 Acrobat을 사용하여 더 작은 배치가 충돌하지 않습니다.

  2. 동일한 스크립트를 사용하지만 Linux ocr 도구 중 하나를 사용하여 제대로 작동하여 ocr 품질을 위험에 빠뜨리십시오.

나는 # 1을 시도 할 것이라고 생각합니다 .Linux OCR 도구의 결과에 대해 너무 걱정하고 있습니다 (누군가가 비교를하지 않았다고 생각합니다). 파일을 분리하고 다시 연결하는 것처럼 보입니다. Adobe가 실제로 숨 막히지 않고 디렉토리를 OCR로 일괄 처리 할 수 ​​있으면 불필요한 코딩이 필요합니다.

완전 무료 솔루션을 원할 경우 스크립트를 사용하여 OCR이 아닌 PDF를 식별하거나 OCR이있는 PDF를 다시 실행 한 다음 Linux 도구 중 하나를 사용하여 OCR을 사용해보십시오. Teseract가 최상의 결과를 얻는 것처럼 보이지만 다시 말하지만 이러한 도구 중 일부는 최신 버전의 Ubuntu에서 잘 지원되지 않지만 설정하고 문제를 해결할 수 있으면 이미지 레이어가 텍스트 일치 레이어와 일치하지 않는 문제가 있습니다 ( tesseract))를 사용하면 꽤 유용한 솔루션을 얻을 수 있으며 다시 한 번 Linux> Windows입니다.


OCR PDF완전히 자동화하고 일괄 처리 하여 동일한 이름을 가진 OCR 파일을 고품질로 건너 뛰는 효과적인 솔루션이 있습니까? 그렇다면 입력에 감사드립니다.


OCR이 아닌 파일을 임시 디렉토리로 이동하는 Perl 스크립트. 이 작동을 보장 할 수는 없으며 다시 작성해야 할 수도 있지만 누군가 작동하거나 작동하지 않는다고 가정하면 알려 주시면 여기에 더 나은 버전을 게시하겠습니다.


#!/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 "OCR이 아닌 pdf (...)를 식별하는 스크립트를 공유하여 임시 디렉토리 (올바른 디렉토리 트리를 유지)에 복사 할 수 있습니까? 미리 감사드립니다.)
Erb

@David 알았어. 처음 제대로 실행되지 않을 수 있다고 경고합니다. 이로 인해 PDF가 전혀 손상되지는 않지만 (복사본은 원본에 닿지 않습니다) 스크립트를 수정해야 할 수도 있습니다. 펄을 알고 있다면 산들 바람이 나에게 알려주지 않으면 직접 디버깅하여 사소한 편집 작업을 수행 할 수 있습니다.
Joe

많은 감사합니다. 나는 그것이 펄을 처음 사용하더라도 작동하도록 노력할 것이다. 감사.
Erb December

어쩌면 Windows의 다른 아이디어 (XP에서 작동)? 과거에 이것을 사용하여 "암호가없는 모든 pdf 파일 (하위 폴더가있는)에서 폴더를 제거합니다". 아이디어는 암호로 보호 된 모든 pdf 파일을 유지하는 것입니다. Syncback 프리웨어로 모든 pdf (관련 하위 폴더 포함)를 새 폴더 (C : \ 5 \ ")에 복사하십시오 .pdftotext.exe를 추가하고이 텍스트 파일의 이름을 del_pdf_no_password.bat로 변경하십시오. 내용 :"FOR / RC : \ 5 \ % % x IN (* .PDF) DO (pdftotext %% x NUL && DEL %% x) ""여기서 "C : \ 5 \"는 변경할 폴더입니다. 그런 다음 pdftotext.exe를 시작한 다음 .bat 파일 만 시작하십시오.
Erb

자세한 내용 : 프리웨어 이름 바꾸기가 포함 된 폴더 이름 (예 : alternativeto.net/software/renamer )에서 빈 공간 ( ","...과 같은 특수 문자 ")을 제거해야합니다 . 그렇지 않으면 모든 하위 폴더에서 작동하지 않습니다! 추신 : 나는이 스크립트를 작성하지 않았다 (나는 2004 년 누군가의 도움을 받았다!)
Erb

답변:


3

저도 많은 PDF를 자동화 된 방식으로 일괄 OCR로 처리하는 방법을 많이 찾았습니다. 결국 나는 다음과 같이 스크립트와 함께 Acrobat을 사용하여 당신과 비슷한 실행 가능한 솔루션을 생각해 냈습니다.

  1. 모든 관련 PDF를 특정 디렉토리에 복사하십시오.

  2. 이미 텍스트가 포함 된 PDF를 제거합니다 (이미 OCRd이거나 이미 텍스트라고 가정 할 경우 이상적이지만 현재로서는 충분합니다).

  3. AutoHotKey 를 사용 하여 Acrobat을 자동으로 실행하고 특정 디렉토리를 선택한 다음 파일 이름에 "-ocr"을 추가하여 모든 문서를 OCR하십시오.

  4. "-ocr.pdf"파일이 있는지 확인하여 OCRd PDF를 원래 위치로 다시 이동하십시오.

약간 Heath Robinson 이지만 실제로는 잘 작동합니다.


Acrobat에서 디렉토리를 이미 일괄 배치 할 경우 AutoHotKey를 사용해야하는 이유는 무엇입니까? Acrobat이 충돌하는 경우 프로세스 반복이 걱정되면 파일 수정 타임 스탬프가 중단 된 위치를 알려줍니다. 원본을 유지하려면 디렉토리를 복사하면됩니다. 마지막에 -ocr을 원하면 완료 후 배치 이름 변경을 수행 할 수 있습니다.
Joe

1
안녕하세요, Windows에서 포인트 2 및 3을 수행하는 방법을 공유 할 수 있습니까? 미리 감사드립니다;)
Erb December

2

ABBYY FineReader는 빠르고 정확한 OCR을 제공하도록 설계된 최종 사용자 솔루션이라는 것을 알고 있어야합니다.

내 경험을 바탕으로 OCR 프로젝트는 매번 상당히 다른 세부 사항을 가지고 있으며 각 고유 한 사례에 대해 즉시 정신을 잃을 방법이 없습니다.

  • ABBYY Recognition Server를 살펴보십시오 .이 제품은 OCR 자동화를위한 전문 제품입니다.

  • 리눅스에 관해서는 http://ocr4linux.com을 살펴보십시오 . 명령어 유틸리티는 귀하에게도 적합 할 수 있습니다.

  • 보다 복잡한 작업을 위해 ABBYY에는 ABBYY FineReader Engine (사내 호스팅) 또는 ABBYY Cloud OCR SDK (Microsoft Azure 클라우드 기반 ) 와 같은 매우 유연한 SDK가 있으므로 원하는 방식으로 OCR 처리를 수행 할 수 있습니다.

위에서 지정한 클라우드 서비스의 프런트 엔드 개발 팀의 일원으로 필요한 경우 추가 정보를 제공 할 수 있습니다.

PDF에서 텍스트 레이어의 조회를 고려할 때,이 작업은 내 전문 분야 인 OCR과 약간 떨어져 있으므로 외부 스크립트를 사용하는 방법이 매우 합리적이라고 생각하므로 조언을 할 수 없습니다. 아마도이 토론이 도움이 될 것입니다 : http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text


1
적어도 ABBYY에는 pdf 폴더를 쉽게 배치 할 수있는 문서 나 기능 (Acrobat에 있음)이 부족하다는 것을 알고 있습니다. OCR이 아닌 문서 폴더의 간단한 배치 OCR은 매우 바람직한 기능입니다 (ABBYY의 다른 기능보다 훨씬 더). Google이이 욕망이 얼마나 흔하게 일반적인지 알아 내려면 그렇지 않다면 인용을 제공 할 수 있습니다. 다른 옵션에 대해 감사드립니다. 그러나이 옵션을 살펴 보도록하겠습니다. 그러나 현재이 매우 일반적인 작업 (사용 가능한 인용)을 완료하는 방법을 찾기 위해 여기에 온 사람이라면 누구나 ABBYY가 할 수 없다는 말의 입에서 들었다는 것을 알게됩니다.
Joe

배치 OCR은 ABBYY FineReader Professional에서 사용할 수 있습니다. 귀하의 질문에 OCR을 완전히 자동화해야한다고 명시합니다. 이제 배치 처리 만하면됩니다. 정확히 필요한 것이 무엇인지 명확히하십시오.
Nikolay

위에서 읽으십시오. 나는 '쉬운 배치 OCR', '폴더의 간단한 배치 ocr'이라고 말했습니다. 추가 : "일괄 OCR을 완전히 자동화하는 방법 (프롬프트 없음)을 찾을 수있는 경우." 내가 원하는 것이 분명합니다. 따라서이 페이지를 방문하는 모든 사람에게 명확하게 설명하십시오. * 사용자 집약적 인 프로세스 에서 끔찍한 저장 옵션이있는 끔찍하고 복잡한 인터페이스를 사용하여 pdf 폴더를 '배치 처리'하려면 ABBYY가 작동 할 수 있습니다. * 원하는 경우 Acrobat과 마찬가지로 수천 가지 다른 사용자와의 상호 작용이 거의없는 '간단한 배치 OCR', '간단한 배치 OCR'에 ABBYY Finereader는 적합하지 않습니다.
Joe

2

리눅스에서

사용 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 {}

2018 년 11 월 3 일 업데이트 :

pypdfocr는 2016 년부터 더 이상 지원되지 않으며 유지되지 않아서 일부 문제를 발견했습니다. ocrmypdf( module )은 비슷한 작업을 수행하며 다음과 같이 사용할 수 있습니다.

ocrmypdf in.pdf out.pdf

설치하기 위해서:

pip install ocrmypdf

또는

apt install ocrmypdf

그래서 명령은

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

1

2015 년 초 Windows에서 Nuance OmniPage Ultimate를 사용하여 완전 수동 배치 OCR을 수행하여 성공했습니다. 무료가 아니며 정가는 500 달러입니다. 포함 된 배치 프로그램 "DocuDirect"를 사용하십시오. "질문없이 작업 실행"옵션이 있습니다. 이는 원래 질문에 대한 직접적인 대답으로 보입니다.

DocuDirect를 사용하여 각 입력 이미지 (즉, 검색 할 수없는) PDF 파일에 대해 하나의 검색 가능한 PDF 파일을 출력했습니다. 원래 입력 파일 이름과 함께 출력 폴더의 입력 디렉토리 트리를 복제하도록 지시 할 수 있습니다 (거의-아래 참조). 여러 코어도 사용합니다. 정확성은 내가 평가 한 패키지 중 최고였습니다. 비밀번호로 보호 된 문서를 건너 뜁니다 (대화를 표시하지 않고 작업을 중지하지 않고).

주의 사항 1 : 거의 원본 파일 이름-접미사 ".PDF"는 ".pdf"가됩니다 (즉, 대문자에서 소문자로). 모두 Windows에서 동일하기 때문입니다. (웃음)

주의 사항 2 : 인식하는 동안 어떤 파일이 실패했는지 진단하는 로그 파일이 없습니다. DocuDirect는 단순히 전체 페이지가 누락 된 것처럼 잘못된 출력을 만들어냅니다. 필자는 PyPDF2 모듈을 사용하여 python 스크립트를 작성하여 조잡한 유효성 검사를 구현했습니다. 출력 페이지 수가 입력 페이지 수와 일치하는지 테스트했습니다. 아래를 참조하십시오.

주의 사항 3 : 퍼지의 불분명 한 입력 이미지 파일은 CPU를 사용하지 않고 OmniPage를 영원히 정지시킵니다. 그것은 결코 회복되지 않습니다. 이것은 실제로 일괄 처리를 방해하며 해결 방법을 찾지 못했습니다. 나는 이것을 이것을 Nuance 에보 고했지만 아무데도 없었습니다.

@Joe는 소프트웨어가 잘못 프로그래밍되고 문서화되는 것에 관한 것입니다. OmniPage 의 핵심 에는 놀라운 문자 인식 마법 기술이 있지만 외부 셸 (GUI 및 배치 처리)은 머리카락을 뽑을 수있을 정도로 충분합니다.

스크립트를 사용하여 파일을 차단하여 보호되지 않은 이미지 문서 만 OCR 패키지에 표시하도록 @ Joe 's 및 @ Kiwi 's 제안을 승인합니다.

Nuance와의 유일한 제휴는 정확하지 않은 고객입니다. 입증되지 않은 지원 티켓이 있습니다. :)

@ 조 : 늦은 답변이지만 여전히 관련이 있습니다. @ 슈퍼 유저 커뮤니티 : 이것이 주제에 관한 것 같으면 좋겠습니다.

** 업데이트 ** 후속 패키지는 Nuance PowerPDF Advanced이며 정가는 $ 150입니다. 나는 이것으로 더 나은 성공을 거두었습니다. 정확하지만 훨씬 안정적입니다.

사전 / 사후 OCR 트리 유효성 검사 파이썬 스크립트는 다음과 같습니다.

'''
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을 수행하기를 바랍니다! (와! 1GB 다운로드 파일!)
Erb

0

Aquaforest의 Autobahn DX를 고려할 수 있습니다 : http://www.aquaforest.com/en/autobahn.asp

PDF 배치를 처리하도록 설계되었으며 다양한 옵션 (예 : 건너 뛰기 또는 OCR 파일 통과)과 더 나은 결과를 제공 할 수있는 PDF를 스마트하게 처리하는 옵션이 있습니다 (예 : PDF에 일부 이미지 페이지 및 일부 페이지가있는 경우) 텍스트 페이지, 이미지 페이지 만 OCR 가능)


해당 제품과 관련이있는 경우 질문 을 편집 하여 명시 적으로 말 하십시오.
slhck

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.