Batch-OCR viele PDFs

Dies diskutiert wurde vor einem Jahr hier:

Batch-OCR für viele PDF-Dateien (nicht bereits OCRed)?

Gibt es eine Möglichkeit, OCR-PDFs zu stapeln, die noch nicht OCRed wurden? Dies ist, denke ich, der aktuelle Stand der Dinge, der sich mit zwei Themen befasst:

Stapel-OCR PDF

Fenster

  • Acrobat - Dies ist die straightfoward OCR-Engine, die OCR stapeln wird. Das einzige Problem scheint 1) es wird nicht überspringen dateien, die bereits OCRed wurden 2) Versuchen Sie, eine Reihe von PDFs darauf zu werfen (einige alte) und beobachten Sie, wie es abstürzt. Es ist ein kleiner Buggy. Es warnt Sie bei jedem Fehler, auf den es stößt (obwohl Sie der Software mitteilen können, dass Sie sie nicht benachrichtigen soll. Aber auch hier stirbt es bei bestimmten Arten von PDFs schrecklich, sodass Ihre Laufleistung variieren kann.

  • ABBYY FineReader (Batch/Scansnap), Omnipage – Das müssen einige der schlimmsten programmierten Software-Teile sein, die dem Menschen bekannt sind. Wenn Sie herausfinden können, wie vollständig automatisieren (keine Aufforderung) Batch-OCR von PDFs Speichern mit dem gleichen Namen dann posten Sie bitte hier. Es scheint, dass die einzigen Lösungen, die ich finden konnte, irgendwo fehlgeschlagen sind-Umbenennen,nicht vollständig automatisiert usw. etc. Bestenfalls gibt es einen Weg, dies zu tun, aber die Dokumentation und Programmierung ist so schrecklich, dass Sie es nie herausfinden werden.

  • ABBYY FineReader Engine, ABBYY Recognition Server - Das sind wirklich mehr Unternehmenslösungen, sie wären wahrscheinlich besser dran, Acrobat einfach dazu zu bringen, über einen Ordner zu laufen und PDFs auszusortieren, die Fehler verursachen/das Programm abstürzen lassen, als zu versuchen, die Software zu installieren (vorausgesetzt, Sie sind ein einfacher Endbenutzer). Scheint für den kleinen Benutzer nicht wettbewerbsfähig zu sein.

  • ** Autobahn DX Workstation ** Die Kosten für dieses Produkt sind so unerschwinglich, dass Sie wahrscheinlich 6 Exemplare von Acrobat kaufen könnten. Nicht wirklich eine Endbenutzerlösung. Wenn Sie ein Unternehmen sind setup, das kann sich für Sie lohnen.

Linux

  • WatchOCR - nicht mehr entwickelt, und im Grunde unmöglich, auf modernen Ubuntu-Distributionen laufen
  • pdfsandwich - nicht mehr entwickelt, im Grunde unmöglich, auf modernen Ubuntu-Distributionen laufen
  • ** ABBY LINUX OCR * * sein soll, skriptfähig, und scheint zu haben ein paar gute Ergebnisse:

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

Wie bei vielen anderen ABBYY-Produkten, die von der Seite geladen werden, ist es jedoch möglicherweise besser, Acrobat Batch OCR zum Laufen zu bringen.

  • **Ocrad, GOCR, OCRopus, tesseract, ** – diese kann funktionieren, aber es gibt ein paar Probleme:

    1. OCR-Ergebnisse sind nicht so groß wie, sagen wir, Acrobat für einige von ihnen (siehe obigen Link).
    2. Keiner der programme nehmen eine PDF-Datei auf und geben eine PDF-Datei aus. Sie müssen ein Skript erstellen und die PDF-Datei zuerst auseinander brechen und die Programme über jede ausführen und dann die Datei als PDF wieder zusammensetzen
    3. Sobald Sie dies tun, können Sie wie ich feststellen, dass (Tesseract) eine OCR-Ebene erstellt, die verschoben wird. Wenn Sie also nach dem Wort " das " suchen, erhalten Sie ein Highlight des Teils des Wortes daneben.
  • Batch DjVu → In PDF konvertieren-habe nicht nachgesehen, aber scheint wie eine schreckliche Round-a-Bout-Lösung.

Online

  • PDFcubed.com - komm schon, nicht wirklich eine Batch-Lösung.
  • ABBYY Cloud OCR - nicht sicher, ob dies wirklich eine Batch-Lösung ist, so oder so, Sie müssen auf der Seite bezahlen und dies könnte ziemlich teuer werden.

Identifizierung nicht-OCRed PDFs

Dies ist ein etwas einfacheres Problem, das leicht in Linux und viel weniger in Windows gelöst werden kann. Ich konnte a codieren perl-Skript mithilfe von pdffont, zu erkennen, ob Schriftarten eingebettet werden, um festzustellen, welche Dateien nicht-OCRed.


Aktuelle "Lösungen"

  1. Verwenden Sie ein Skript, um Nicht-OCRed-PDFs zu identifizieren (damit Sie nicht Tausende von OCRed-PDFs erneut ausführen), und kopieren Sie diese in ein temporäres Verzeichnis (unter Beibehaltung des richtigen Verzeichnisbaums) und verwenden Sie dann Acrobat unter Windows, um diese auszuführen, in der Hoffnung, dass die kleineren Stapel nicht abstürzen.

  2. Verwenden Sie dasselbe Skript, erhalten Sie jedoch eines der Linux ocr-Tools, um richtig zu arbeiten, riskieren OCR-Qualität.

Ich denke, ich werde #1 versuchen, ich mache mir nur zu viele Sorgen um die Ergebnisse der Linux OCR-Tools (ich nehme nicht an, dass jemand einen Vergleich gemacht hat) und zerbreche die Dateien und hefte sie wieder zusammen scheint unnötige Codierung zu sein, wenn Adobe tatsächlich ein Verzeichnis stapeln kann, ohne zu ersticken.

Wenn Sie eine völlig kostenlose Lösung wünschen, müssen Sie ein Skript verwenden, um die Nicht-OCRed-PDFs zu identifizieren (oder einfach erneut auszuführen over OCRed ones), und verwenden Sie dann eines der Linux-Tools, um sie zu OCR. Teseract scheint die besten Ergebnisse zu erzielen, aber auch hier werden einige dieser Tools in modernen Ubuntu-Versionen nicht gut unterstützt, aber wenn Sie es einrichten und das Problem beheben können, bei dem die Bildebene nicht mit der Textübereinstimmung übereinstimmt Ebene (mit Tesseract) Dann hätten Sie eine ziemlich praktikable Lösung und noch einmal Linux > Windows.


Haben Sie eine funktionierende Lösung, um [[17]}Batch-OCR vollständig zu automatisieren PDFs, Überspringen bereits OCRed Dateien mit dem gleichen Namen, mit hohe Qualität? Wenn ja, würde ich die Eingabe wirklich schätzen.


Perl-Skript zum Verschieben von Nicht-OCRed-Dateien in ein temporäres Verzeichnis. Ich kann nicht garantieren, dass dies funktioniert und wahrscheinlich neu geschrieben werden muss, aber wenn jemand es zum Laufen bringt (vorausgesetzt, es funktioniert nicht) oder besser funktioniert, lassen Sie es mich wissen und ich werde hier eine bessere Version veröffentlichen.


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

        }

    }
}
Author: Community, 2012-05-14

6 answers

Auch ich habe nach einer Möglichkeit gesucht, viele PDFs automatisiert zu stapeln, ohne viel Glück. Am Ende habe ich eine praktikable Lösung gefunden, die Ihrer ähnelt, indem ich Acrobat mit einem Skript wie folgt verwende:

  1. Kopieren Sie alle relevanten PDFs in ein bestimmtes Verzeichnis.

  2. Entfernen Sie PDFs, die bereits Text enthalten (vorausgesetzt, sie sind bereits OCRd oder bereits Text - nicht ideal, ich weiß, aber gut genug für jetzt).

  3. Verwenden Sie AutoHotkey, um automatisch auszuführen Acrobat, wählen Sie das spezifische Verzeichnis und OCR alle Dokumente, Anhängen "- ocr", um ihren Dateinamen.

  4. Verschieben Sie die OCRd-PDFs mithilfe einer "-ocr " wieder an ihren ursprünglichen Speicherort.pdf" - Datei, um festzustellen, ob es erfolgreich war.

Es ist ein bisschen Heath Robinson, funktioniert aber eigentlich ziemlich gut.

 4
Author: kiwi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-10-14 23:36:46

Ich glaube, Sie brauchen, um zu realisieren, dass ABBYY FineReader ist ein end-user-Lösung entwickelt, um bieten schnelle&genaue out-of-the-box-OCR.

Basierend auf meiner Erfahrung haben OCR-Projekte jedes Mal signifikant unterschiedliche Details, und es gibt keine Möglichkeit, eine sofort einsatzbereite Wiederholung für jeden Einzelfall zu erstellen.Aber ich kann Ihnen professionellere Tools vorschlagen, die die Arbeit für Sie erledigen können:

  • Schauen Sie sich ABBYY Recognition Server an, dies ist ein professionelles Produkt für OCR automatisierung.

  • Wann kommt linux, anschauen http://ocr4linux.com, es ist ein Befehlszeilen-Dienstprogramm, dass kann passen Sie als gut.

  • Für komplexere Aufgaben verfügt ABBYY über ein sehr flexibles SDKs wie ABBYY FineReader Engine (intern gehostet) oder ABBYY Cloud OCR SDK (basierend auf Microsoft Azure Cloud), mit dem Sie die OCR-Verarbeitung nach Ihren Wünschen gestalten können.

Ich war ein Teil des Front-End-Entwicklungsteams für die cloud-Service oben angegeben und kann bei Bedarf weitere Informationen dazu liefern.

In Anbetracht der Suche einer Textebene in PDF kann ich dazu keinen Rat geben,da diese Aufgabe etwas außerhalb von OCR liegt, was meine Spezialität ist, daher finde ich Ihren Ansatz zur Verwendung eines externen Skripts sehr vernünftig. Vielleicht finden Sie diese Diskussion hilfreich: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text

 3
Author: Nikolay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-05-17 06:20:58

Ich hatte Anfang 2015 einige Erfolge bei der vollständigen praktischen Batch-OCR mit Nuance OmniPage Ultimate unter Windows. Nicht kostenlos, Listenpreis $ 500. Verwenden Sie das mitgelieferte Batch-Programm "DocuDirect". Es hat eine Option "Job ohne Eingabeaufforderungen ausführen", die die direkte Antwort auf Ihre ursprüngliche Frage zu sein scheint.

Ich habe DocuDirect verwendet, um eine durchsuchbare PDF-Datei für jedes Eingabebild (dh eine nicht durchsuchbare) PDF-Datei auszugeben. es kann gesagt werden, den Eingabeverzeichnisbaum im Ausgabeordner als zu replizieren sowie die ursprünglichen Eingabedateinamen (fast - siehe unten). Verwendet auch mehrere Kerne. Die Genauigkeit war das Beste der Pakete, die ich bewertet habe. Passwortgeschützte Dokumente werden übersprungen (ohne den Job zu stoppen, ohne einen Dialog anzuzeigen).

Einschränkung 1: Fast die ursprünglichen Dateinamen-Suffix".PDF" wird ".pdf " (dh von Groß-nach Kleinschreibung), weil hey, es ist alles gleich unter Windows. (Pfui.)

Vorbehalt 2: Keine Protokolldatei, damit diagnostiziert wird, welche Dateien während der Erkennung fehlschlagen - welche sie auf jeden Fall tun - ist wieder auf Sie. DocuDirect wird gerne verstümmelte Ausgaben produzieren, wie ganze Seiten einfach fehlen. Ich habe ein Python-Skript mit dem PyPDF2-Modul geschrieben, um eine grobe Validierung zu implementieren: Testen, ob die Anzahl der Ausgabeseiten mit der Anzahl der Eingabeseiten übereinstimmt. Siehe unten.

Vorbehalt 3: Eine unscharfe, undeutliche Eingabebilddatei führt dazu, dass OmniPage für immer hängt und keine CPU verwendet.es erholt sich einfach nie. Dies entgleist wirklich die Stapelverarbeitung und ich habe keine Problemumgehungen gefunden. Ich auch meldete dies Nuance, kam aber nirgendwohin.

@Joe hat Recht, dass die Software schlecht programmiert und dokumentiert ist. Ich stelle fest, dass der [[12]}Core von OmniPage über eine erstaunliche magische Technologie zur Zeichenerkennung verfügt, aber die äußere Hülle (GUI & Batch-Verarbeitung) reicht aus, um Ihre Haare herauszuziehen.

Ich unterstütze den Vorschlag von @Joe und @Kiwi, Dateien mithilfe von Skripten auszublenden, um das OCR-Paket nur mit ungeschützten Bilddokumenten zu präsentieren.

Meine einzige Zugehörigkeit mit Nuance ist als nicht gerade zufriedener Kunde-ich habe eine Menge ungelöster Support-Tickets, um es zu beweisen:)

@Joe: Späte Antwort, aber vielleicht noch relevant. @SuperUser Community: Ich hoffe, Sie fühlen sich das Thema ist.

* * Update * * Nachfolgepaket ist Nuance PowerPDF Advanced, Listenpreis nur $ 150. Ich hatte damit noch besseren Erfolg, es ist genauso genau, aber weitaus stabiler.

Pre / post-OCR Baum Validierung Python skript folgt.

'''
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:])
 2
Author: chrisinmtown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-09 08:46:45

Unter Linux

Der beste und einfachste Weg ist, pypdfocr zu verwenden, es ändert sich nicht das PDF

pypdfocr your_document.pdf

Am Ende haben Sie ein anderes your_document_ocr.pdf, wie Sie es mit durchsuchbarem Text wollen. Die app ändert nicht die Qualität des Bildes. Erhöht die Größe der Datei ein wenig, indem Sie den Overlay-Text hinzufügen.

Zum Stapeln der PDFs

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

Wenn sich die PDFs in Unterordnern befinden:

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

Update 3. November 2018:

pypdfocr wird seither nicht mehr unterstützt 2016 und ich habe einige Probleme bemerkt, weil ich nicht erwähnt wurde. ocrmypdf(modul) macht einen symiliaren Job und kann wie folgt verwendet werden:

ocrmypdf in.pdf out.pdf

Zu installieren:

pip install ocrmypdf

Oder

apt install ocrmypdf

So würde der Befehl

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  ocrmypdf {} {}_ocr.pdf 
 2
Author: Eduard Florinescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-11-03 21:03:37

Man könnte Aquaforest ' s Autobahn DX betrachten: http://www.aquaforest.com/en/autobahn.asp

Es wurde entwickelt, um Stapel von PDFs zu verarbeiten und verfügt über eine Vielzahl von Optionen (z. B. Überspringen oder Übergeben von OCRed-Dateien) sowie Optionen für die intelligente Behandlung von PDFs, die möglicherweise ein besseres Ergebnis liefern (z. B. wenn ein PDF einige Bildseiten und einige Textseiten hat, kann es nur die Bildseiten OCR)

 1
Author: Neil Pitman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-05-17 15:06:24

Auf Mac oder Linux:

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

Von hier.

 1
Author: André Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-06-17 01:25:12