20 votos

Lote-OCR muchos archivos Pdf

Esto ha sido discutido hace un año aquí:

OCR por lotes para muchos archivos PDF (no ya de Roc)?

Hay alguna forma de OCR por lotes de archivos Pdf que no han sido ya de Roc? Este es, creo, el estado actual de las cosas se trata de dos cuestiones:

OCR por lotes de archivos Pdf

Windows

  • Acrobat – Este es el más straightfoward motor de ocr que se OCR por lotes. El único problema parece ser que 1) no omitir archivos que ya han sido Roc 2) tratar de tirar un montón de archivos Pdf (algunos de los antiguos) y el reloj que se bloquee. Es un poco buggy. Se advertirá que en cada error que corre (aunque se puede decir que el software no notificar. Pero, de nuevo, se muere horriblemente en ciertos tipos de archivos Pdf para su kilometraje puede variar.

  • ABBYY FineReader (Lote/Scansnap), Omnipage – Estos tienen que ser algunas de las peores obras programadas de software conocida por el hombre. Si usted puede averiguar cómo plenamente automatizar (sin preguntar) OCR por lotes de archivos Pdf se guarda con el mismo nombre , a continuación, por favor, publicarlo aquí. Parece que la única solución que pude encontrar error en alguna parte--el cambio de nombre, no es totalmente automático, etc. etc. En el mejor, hay una manera de hacerlo, pero la documentación y la programación es tan horrible que nunca lo vas a encontrar.

  • ABBYY FineReader Engine, ABBYY Recognition Server - Estas son realmente más soluciones empresariales, probablemente sería mejor simplemente llegar acrobat para que se ejecute más de una carpeta y tratar y eliminar los archivos pdf que te dan errores/bloquear el programa que va a través de la molestia de tratar de instalar el software de evaluación (suponiendo que eres un simple usuario final). No parece un costo competitivo para el pequeño usuario.

  • ** Autobahn DX estación de trabajo ** el costo de este producto es tan prohibitivo, que probablemente podría comprar 6 copias de acrobat. Realmente no es un usuario final de la solución. Si eres una empresa de la instalación, esta puede ser la pena para ti.

Linux

  • WatchOCR – ya no desarrollado, y básicamente imposible de ejecutar en las modernas distribuciones de Ubuntu
  • pdfsandwich – ya no desarrollado, básicamente imposible de ejecutar en las modernas distribuciones de Ubuntu
  • ** ABBY LINUX OCR ** - esto debe ser secuencias de comandos, y parece que tiene buenos resultados:

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

Sin embargo, como muchos de estos otros los productos de ABBYY que cobran por la página, de nuevo, usted puede ser mejor tratando de conseguir Acrobat OCR por Lotes de trabajo.

  • *Ocrad, GOCR, OCRopus, tesseract, * – estos pueden funcionar, pero hay un par de problemas:

    1. Los resultados de OCR no son tan grandes como, por ejemplo, acrobat para algunos de estos (ver enlace arriba).
    2. Ninguno de los programas se llevan en un archivo PDF y de salida en un archivo PDF. Tienes que crear una secuencia de comandos y se rompen el PDF de la primera y ejecutar los programas de cada uno y, a continuación, vuelva a montar el archivo como un pdf
    3. Una vez que usted lo hace, usted puede encontrar, como hice yo, que (tesseract) crea un programa de OCR capa que se cambie. Así que si usted busca la palabra 'la', obtendrá un punto culminante de la parte de la palabra junto a ella.
  • Lote DjVu → Convertir a PDF – no lo he visto, pero parece un horrible round de una pelea de solución.

En línea

  • PDFcubed.com – vamos, no es realmente un lote de solución.
  • ABBYY Nube OCR - no estoy seguro si esto es realmente un lote de solución, de cualquier manera, usted tiene que pagar por la página y esto podría llegar a ser muy caro.

La identificación de la no-Roc Pdf

Este es un poco más fácil del problema, que puede ser resuelto fácilmente en Linux y mucho menos en Windows. Yo era capaz de código de un script en perl usando pdffont a identificar si las fuentes están incrustados para determinar qué archivos son no-Roc.


Actual "soluciones"

  1. Utilizar una secuencia de comandos para identificar a los no-Roc pdf (para que no vuelva a ejecutar a lo largo de miles de Roc Pdf) y copiar a un directorio temporal (manteniendo el correcto árbol de directorios) y, a continuación, utilizar Acrobat en Windows para ejecutarse a través de estos con la esperanza de que los lotes más pequeños no se cuelgue.

  2. uso el mismo guión, pero conseguir uno de los linux ocr herramientas para trabajar correctamente, arriesgando la calidad del ocr.

Creo que voy a probar #1, solo estoy preocupado demasiado por los resultados de la Linux herramientas de OCR (no creo que nadie se ha realizado una comparación) y de la ruptura de los archivos separados y costura juntos de nuevo parece ser innecesario de codificación si Adobe en realidad puede OCR por lotes de un directorio sin ahogarse.

Si quieres un completamente gratis solución, tendrás que utilizar una secuencia de comandos para identificar la no-Roc pdf (o simplemente volver a ejecutar más de Roc) y, a continuación, utilizar una de las herramientas de linux para probar y OCR. Teseract parece tener los mejores resultados, pero, de nuevo, algunas de estas herramientas no son compatibles bien en las modernas versiones de Ubuntu, aunque si se puede configurar y solucionar el problema que tuve, donde la capa de la imagen no coincide con la coincidencia de texto de la capa (con tesseract), entonces tendría una bonita solución viable y una vez más Linux > Windows.


¿Tiene usted una solución de trabajo para automatizar completamente, OCR por lotes de archivos Pdf, omitiendo ya Roc archivos manteniendo el mismo nombre, con alta calidad? Si es así, yo realmente apreciaría la entrada.


Script en Perl para mover la no-Roc archivos a un directorio temporal. No puedo garantizar que esto funciona y probablemente necesario volver a escribir, pero si alguien hace el trabajo (suponiendo que no funciona) o trabajar mejor, hágamelo saber y voy a publicar una versión mejor aquí.


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

        }

    }
}

3voto

kiwi Puntos 31

Yo también he buscado una manera de lote-OCR muchos archivos Pdf de una manera automatizada, sin demasiada suerte. Al final he llegado a una solución viable similar a la tuya, uso de Acrobat con una secuencia de comandos de la siguiente manera:

  1. Copia todos los archivos Pdf en un directorio específico.

  2. Eliminar archivos Pdf ya que contiene el texto (asumiendo que ya están OCRd o ya de texto - lo ideal no sé, pero lo suficientemente bueno, por ahora).

  3. El uso de AutoHotKey para ejecutar automáticamente Acrobat, seleccione el directorio específico, y OCR todos los documentos, añadiendo "-ocr" a su nombre de archivo.

  4. Mover la OCRd archivos Pdf de nuevo a su ubicación original, mediante la presencia de un "-ocr.pdf" archivo para determinar si fue un éxito.

Es un poco Heath Robinson, pero en realidad funciona bastante bien.

2voto

David Puntos 26

Yo creía que usted necesita para darse cuenta de que ABBYY FineReader es un usuario final una solución diseñada para proporcionar de manera rápida y precisa a cabo-de-la-caja de OCR.

Basado en mi experiencia, OCR proyectos significativamente diferentes detalles de cada momento y no hay manera de crear una saliendo de la caja soulition para cada caso singular.Pero puedo sugerir más profesional de herramientas que pueden hacer el trabajo para usted:

  • Eche un vistazo a ABBYY Recognition Server, este es un producto profesional para OCR automatiation.

  • Cuando se trata de linux, echar un vistazo a http://ocr4linux.comes una utilidad de línea de comandos que puede adaptarse a usted así.

  • Para tareas más complejas de ABBYY es muy flexible Sdk como ABBYY FineReader Engine (hosted) o de ABBYY Nube de OCR SDK (basado en Microsoft Azure en la nube), que permiten diseñar el procesamiento de OCR de la manera que usted desea.

Yo era parte del front-end del equipo de desarrollo del servicio en la nube especificado anteriormente y puede dar más info sobre si es necesario.

Teniendo en cuenta que la búsqueda de una capa de texto en PDF, no te puedo dar ningún consejo sobre que, debido a que esta tarea es un poco a un lado de OCR que es mi especialidad, así que creo que su enfoque de la utilización de script externo muy razonable. Tal vez usted encontrará esta discusión útil: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text

1voto

chrislott Puntos 129

He tenido algo de éxito en los principios de 2015 haciendo totalmente en manos de OCR por lotes utilizando Nuance OmniPage Ultimate de windows. No es gratis, el precio de lista de $500. Utilice el programa de proceso por lotes "DocuDirect" que se incluye. Tiene una opción de "Ejecutar el trabajo sin ningún tipo de peticiones" que parece la respuesta directa a tu pregunta original.

He utilizado DocuDirect a la salida de un PDF con capacidad de búsqueda de archivo de cada imagen de entrada (es decir, no se pueden realizar búsquedas de) archivo PDF; puede ser dicho para replicar la entrada de árbol de directorio en la carpeta de salida así como el original de entrada de nombres de archivo (casi - ver más abajo). Usos múltiples núcleos. La exactitud fue el mejor de los paquetes que he evaluado. Los documentos protegidos por contraseña son omitidos (sin detener el trabajo, sin mostrar un cuadro de diálogo).

Advertencia 1: Casi los nombres de archivo originales - sufijo ".PDF" se convierte ".pdf" (es decir, desde la inferior a la superior caso) porque oye, es todo lo mismo en windows. (Ugh.)

Advertencia 2: No hay archivo de registro para el diagnóstico de los archivos que fallan durante el reconocimiento-que lo hacen sin duda -- está de vuelta. DocuDirect estará feliz de producir ilegible salidas como páginas enteras simplemente ausentes. Escribí un script de python utilizando el PyPDF2 módulo a implementar un crudo de validación: la prueba de que la salida de la página recuento de emparejado de entrada número de páginas. Ver a continuación.

Advertencia 3: Una masa indistinta de archivo de imagen de entrada será causa de OmniPage para colgar para siempre, el no uso de la CPU; sólo que nunca se recupera. Esto realmente descarrila el procesamiento por lotes y no encontré ninguna solución. También me informó de esto a los Matices, pero no consiguió nada.

@Joe es derecho sobre el software que está siendo mal programadas y documentadas. Tomo nota de que el núcleo de OmniPage ha personaje increíble-reconocimiento de la magia de la tecnología, pero la cáscara externa (GUI & procesamiento por lotes) es suficiente para hacer que usted tira de sus cabellos.

Estoy de acuerdo con @Joe y @Kiwi sugerencia de la pantalla de los archivos de salida mediante el uso de scripts, así como para presentar el paquete de OCR sólo con desprotegidos de documentos de imagen.

Mi única afiliación con Matiz es como un no-exactamente-satisfacción del cliente - tengo un lote de sin resolver tickets de soporte para probarlo :)

@Joe: tardanza en responderte, pero tal vez todavía relevantes. @Super-usuario de la comunidad: espero que usted se siente que esto es en el tema.

** Actualización ** sucesor del paquete es de Matiz PowerPDF Avanzada, lista de precio de 150 dólares. Tenía incluso mejor éxito con esto, es tan preciso, pero mucho más estable.

Pre/post-OCR árbol de la validación de secuencia de comandos de python de la siguiente manera.

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

0voto

Neil Pitman Puntos 1

Usted podría considerar la posibilidad de Aquaforest de la Autopista DX : http://www.aquaforest.com/en/autobahn.asp

Está diseñada para procesar lotes de archivos Pdf y tiene una variedad de opciones (por ejemplo, Omitir o pasar a través de Roc archivos), así como las opciones para el tratamiento inteligente de archivos Pdf que puede ofrecer un mejor resultado (por ejemplo, si un archivo PDF tiene algunas páginas de imágenes y algunas de las páginas de texto, puede OCR de la imagen de las páginas)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: