Пакетное распознавание многих PDF-файлов

это обсуждалось здесь год назад:

пакетный OCR для многих PDF-файлов (еще не OCRed)?

есть ли способ пакетной обработки PDF-файлов OCR, которые еще не были обработаны? Таково, мне кажется, нынешнее положение дел, связанное с двумя вопросами:

партия OCR PDF-файлов

Windows

  • Acrobat - это самый прямолинейный ocr двигатель, который будет пакетной OCR. Только проблема кажется, 1) он не будет пропускать файлы, которые уже были OCRed 2) попробуйте бросить кучу PDF-файлов на него (некоторые старые) и смотреть его аварии. Это немного глючит. Он будет предупреждать вас при каждой ошибке, с которой он сталкивается (хотя вы можете сказать, что программное обеспечение не уведомляет. Но опять же, он ужасно умирает на некоторых типах PDF-файлов, поэтому ваш пробег может отличаться.

  • программы (Batch / Scansnap), Omnipage - эти должны быть одними из худших запрограммированных части программного обеспечения, известные человеку. Если вы можете узнать, как полностью автоматизация (без запроса) пакетный OCR PDF-файлы экономия то же имя тогда, пожалуйста, напишите здесь. Кажется, единственные решения, которые я мог найти, где-то потерпели неудачу-переименование, не полностью автоматизированное и т. д. п. В лучшем случае, есть способ сделать это, но документация и программирование настолько ужасны, что вы никогда не узнаете.

  • ABBYY FineReader Двигатель,ABBYY Recognition Server - это действительно больше корпоративных решений, вам, вероятно, было бы лучше просто заставить acrobat запустить папку и попытаться отсеять PDF-файлы, которые дают вам ошибки/сбой программы, чем пытаться установить оценочное программное обеспечение (предполагая, что вы простой конечный пользователь). Не кажется, что цена конкурсная для малого потребителя.

  • ** Автобан станция dх ** стоимость этого продукта настолько запредельно, что вы, вероятно, могли бы купить 6 копий acrobat. Не готовое решение. Если вы-корпоративная установка, это может стоить того.

Linux

  • WatchOCR - больше не разрабатывается, и в основном невозможно запустить на современных дистрибутивах Ubuntu
  • pdfsandwich - больше не разработаны, в основном невозможно запустить на современных дистрибутивах Ubuntu
  • ** * ABBY LINUX OCR ** - это должно быть scriptable, и, кажется, есть некоторые хорошие результаты:

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. как только вы это сделаете, вы можете обнаружить, как и я, что (Тессеракт)создает слой OCR, который смещается. Поэтому, если вы ищете слово "the", вы получите подсветку части слова рядом с она.
  • Пакетная DjVu → конвертировать в PDF-не смотрел в него, но кажется ужасным решением круглого боя.

Online

  • PDFcubed.com – ладно, не пакетное решение.
  • ABBYY Cloud OCR - не уверен, что это действительно пакетное решение, в любом случае, вы должны заплатить за страницу, и это может получиться довольно дорогой.

определения номера-распознавания PDF-файлов

это немного легче проблема, которая может быть легко решена в Linux и тем более в Windows. Я смог написать сценарий perl с помощью pdffont чтобы определить, внедрены ли шрифты, чтобы определить, какие файлы не являются OCRed.


нынешние "решения"

  1. используйте скрипт для идентификации PDF-файлов без OCRed (чтобы не перезапускать тысячи OCRed PDF-файлы) и скопируйте их во временный каталог (сохраняя правильное дерево каталогов), а затем используйте Acrobat в Windows, чтобы запустить их в надежде, что меньшие пакеты не будут аварийно завершаться.

  2. используйте тот же сценарий, но получите один из инструментов распознавания Linux для правильной работы, рискуя качеством распознавания.

Я думаю, что я собираюсь попробовать #1, я просто слишком беспокоюсь о результатах инструментов OCR Linux (я не предполагаю, что кто-то сделал сравнение) и разбиение файлов на части и сшивание их вместе снова кажется ненужным кодированием, если Adobe может фактически пакетно OCR каталог без удушья.

Если вы хотите полностью бесплатное решение, вам придется использовать скрипт для идентификации неокредных PDF-файлов (или просто перезапустить их), а затем использовать один из инструментов linux для их распознавания. Teseract, кажется, имеют лучшие результаты, но опять же, некоторые из этих инструментов не поддерживаются хорошо в современных версиях Ubuntu, хотя, если вы можно настроить его и решить проблему, которую я имел, где слой изображения, не соответствующий слой соответствия текста (с tesseract), то у вас будет довольно работоспособное решение и еще раз Linux > Windows.


у вас есть рабочее решение полностью автоматизировать, партия OCR PDF-файлов, пропуская уже OCRed файлы с тем же именем, с высокое качество? Если это так, я был бы очень признателен за вклад.


Perl-скрипт для перемещения не-распознавания файлов в директорию Temp. Не могу гарантировать, что это работает и, вероятно, нужно переписать, но если кто-то заставит его работать (предполагая, что он не работает) или работать лучше, дайте мне знать, и я опубликую лучшую версию здесь.


#!/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 OCRedn";
                my $currentdir = $File::Find::dir;
                if ( $currentdir =~ /$sourcedirectory(.+)/ ) {
                    #if directory doesn't exist, create
                    unless(-d $outputroot.){
                    system("mkdir -p $outputroot");
                    }
                    #copy over file
                    my $fromfile = "$currentdir/$file";
                    my $tofile = "$outputroot/$file";
                    print "copy from: $fromfilen";
                    print "copy to: $tofilen";
                    copy($fromfile, $tofile) or die "Copy failed: $!";
#                       `touch $outputroot/'$file'`;
                }
            }

        }

    }
}
7
задан Community
10.12.2022 1:23 Количество просмотров материала 3185
Распечатать страницу

5 ответов

Я тоже искал способ пакетного распознавания многих PDF-файлов в автоматическом режиме, без особой удачи. В итоге я придумал работоспособное решение похожее на ваше, используя Acrobat со скриптом следующим образом:

  1. скопировать все соответствующие PDF-файлы в определенный каталог.

  2. удалить PDF-файлы, уже содержащие текст (предполагая, что они уже OCRd или уже text - не идеально, я знаю, но достаточно хорошо на данный момент).

  3. использовать AutoHotKey чтобы автоматически запустить Acrobat, выберите конкретный каталог и OCR все документы, добавив "- ocr " к их имени файла.

  4. переместите OCRd PDF-файлы обратно в Исходное расположение, используя наличие " - ocr.PDF-файл", чтобы определить, был ли он успешным.

немного Хит Робинсон, но на самом деле работает довольно хорошо.

3
отвечен kiwi 2022-12-11 09:11

Я считаю, что вам нужно понять, что ABBYY FineReader-это решение для конечных пользователей, предназначенное для обеспечения быстрого и точного распознавания текста из коробки.

основываясь на моем опыте, OCR проекты имеют значительно разные детали каждый раз, и нет никакого способа создать из коробки soulition для каждого уникального случая.Но я могу предложить вам более профессиональные инструменты, которые могут сделать работу за вас:

  • посмотреть ABBYY Recognition Server, это a профессиональный продукт для автоматизации OCR.

  • когда дело доходит до linux, посмотрите наhttp://ocr4linux.com, это утилита командной строки, которая может вам подойти.

  • для более сложных задач ABBYY имеет очень гибкие SDK, такие как ABBYY FineReader Engine (внутренний хостинг) или ABBYY Cloud OCR SDK (на основе Microsoft Azure cloud), что позволяет desing OCR обработки, как вы хотите она.

Я был частью front-end команды разработчиков для облачной службы, указанной выше, и может предоставить более подробную информацию о нем, если это необходимо.

учитывая поиск текстового слоя в PDF, я не могу дать никаких советов по этому поводу, потому что эта задача немного в стороне от OCR, который является моей специальностью, поэтому я считаю ваш подход к использованию внешнего скрипта очень разумным. Возможно, вы найдете эту дискуссию полезной: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text

2
отвечен Nikolay 2022-12-11 11:28

Я имел некоторый успех в начале 2015 года делает полностью Руки прочь пакетное распознавание текста с использованием Nuance OmniPage Ultimate на windows. Не бесплатно, Цена $500. Использовать пакетная программа "DocuDirect", которая входит. Он имеет опцию "выполнить задание без каких-либо подсказок", которая кажется прямым ответом на ваш первоначальный вопрос.

Я использовал DocuDirect для вывода одного PDF-файла с возможностью поиска для каждого входного изображения (т. е. PDF-файла без возможности поиска); его можно сказать, чтобы реплицировать входное дерево каталогов в выходных данных папки, а также имена исходных входных файлов (почти-см. ниже). Использует несколько ядер тоже. Точность была лучшей из пакетов, которые я оценивал. Защищенные паролем документы пропускаются (без остановки задания, без отображения диалогового окна).

предостережение 1: почти исходные имена файлов-суффикс ".PDF" становится ".pdf " (т. е. от верхнего к нижнему регистру), потому что на windows все то же самое. (Тьфу.)

нюанс 2: нет файл журнала диагностики, какие файлы не во время признание-что они наверняка делать-это тебя. DocuDirect будет счастливо производить искаженные выходы, как целые страницы просто отсутствует. Я написал сценарий python, используя модуль PyPDF2 для реализации грубой проверки: тестирование того, что количество выходных страниц соответствует количеству входных страниц. Смотреть ниже.

предостережение 3: нечеткий, нечеткий входной файл изображения заставит OmniPage зависнуть навсегда, не используя какой-либо процессор; он просто никогда не восстанавливается. Это действительно сходит с рельсов пакетной обработки и я не нашел любые обходные пути. Я также сообщил об этом нюансу, но ничего не получил.

@Joe прав, что программное обеспечение плохо запрограммировано и документировано. Я отмечаю core из OmniPage имеет удивительную технологию распознавания символов магии, но внешней оболочки (GUI и пакетной обработки) достаточно, чтобы заставить вас вытащить волосы.

Я поддерживаю предложение @Joe'S и @Kiwi отсеять файлы с помощью скриптов, чтобы представить пакет OCR только с незащищенным изображением документы.

моя единственная принадлежность к Nuance - это не совсем удовлетворенный клиент - у меня есть партия неразрешенных заявок на поддержку, чтобы доказать это:)

@Joe: поздний ответ, но, возможно, все еще актуален. @Superuser сообщество: я надеюсь, что вы чувствуете, что это по теме.

** обновление ** преемник пакет Nuance PowerPDF Advanced, прайс-лист всего $ 150. У меня был еще лучший успех в этом, он такой же точный, но гораздо более стабильный.

дерево Pre / post-OCR проверка python скрипт следующим образом.

'''
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:])
1
отвечен chrisinmtown 2022-12-11 13:45

вы могли бы рассмотреть Aquaforest по автобану ДХ : http://www.aquaforest.com/en/autobahn.asp

Он предназначен для обработки пакетов из PDF-файлов и имеет множество вариантов (например, пропуск или пропуск-через распознавания файлов), а также для обработки PDF-файлов, которое может предложить более лучший результат (например, если PDF имеет некоторые изображения страниц и несколько текстовых страниц, это может быть просто ОРЗ изображения страниц)

0
отвечен Neil Pitman 2022-12-11 16:02

на 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 больше не поддерживается начиная с 2016 года, и я заметил некоторые проблемы из-за не mentained. ocrmypdf(модуль) выполняет работу symiliar и может быть использован такой:

ocrmypdf in.pdf out.pdf

установка:

pip install ocrmypdf

или

apt install ocrmypdf

так что команда станет

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  ocrmypdf {} {}_ocr.pdf 
0
отвечен Eduard Florinescu 2022-12-11 18:19

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх