Adapters Tesseract OCR

Το HPDFTesseractRecognition παρέχει προαιρετικές μηχανές Windows που υλοποιούν το IHPDFOCREngine για αναζητήσιμα επίπεδα κειμένου OCR

Factory εγγενών DLL

function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Παρέχετε ένα υπάρχον DLL του Tesseract που εκθέτει το C API συμβατό με Tesseract 5, έναν κατάλογο tessdata, και ένα ASCII αναγνωριστικό γλώσσας ή συνδυασμό όπως eng, chi_sim, ή chi_sim+eng

Η αρχιτεκτονική της βιβλιοθήκης πρέπει να ταιριάζει με την εφαρμογή: μια εφαρμογή Win32 φορτώνει DLL 32-bit, ενώ μια εφαρμογή Win64 φορτώνει DLL 64-bit

Κρατήστε τα απαιτούμενα DLL εξαρτήσεων δίπλα στην επιλεγμένη βιβλιοθήκη ή σε τυπικούς καταλόγους loader των Windows· ο adapter φορτώνει τη ρητή διαδρομή βιβλιοθήκης χωρίς να αλλάξει τον τρέχοντα κατάλογο ή τη διαδρομή αναζήτησης της διεργασίας

Το factory επαληθεύει κάθε ζητούμενο αρχείο .traineddata, φορτώνει τη βιβλιοθήκη, και επιλύει τα απαιτούμενα exports πριν επιστρέψει· άκυρες διαδρομές, μοντέλα, ή επιλογές, λείποντα exports, ασυμβατότητα αρχιτεκτονικής, και μη διαθέσιμες εξαρτήσεις εγείρουν εξαίρεση

Κανένα runtime ή μοντέλα OCR δεν έρχονται δεματισμένα ούτε κατεβαίνουν αυτόματα

Και τα δύο factories είναι διαθέσιμα στο πακέτο FPC/Lazarus για Windows όπως και σε builds Delphi και C++Builder· ξαναχτίστε το Lib/FPC/HotPDFLaz.lpk για την αρχιτεκτονική στόχο πριν χρησιμοποιήσετε το HPDFTesseractRecognition

Ο εγγενής adapter FPC διαβάζει την τρέχουσα ακατέργαστη εικόνα LCL, συμπεριλαμβανομένων pixels γραμμένων μέσω scanlines, και διατηρεί λέξεις Unicode ανεξάρτητα από τη σελίδα κώδικα ANSI του συστήματος

Επιλογές

THPDFTesseractOptions = record
  PageSegMode: THPDFTesseractPageSegMode;
  EngineMode: THPDFTesseractEngineMode;
  TimeoutMilliseconds: Cardinal;
  MaxPixels: Integer;
  class function Default: THPDFTesseractOptions; static;
end;

Καλέστε την THPDFTesseractOptions.Default πριν παρακάμψετε πεδία· η ίδια εγγραφή μπορεί να ρυθμίσει το factory εγγενών DLL ή την overload με options του τοπικού CLI

ΠεδίοΠροεπιλογήΣημασία
PageSegModetpsAutoΑυτόματη σελιδοτομή χωρίς ανίχνευση προσανατολισμού
EngineModetemDefaultΗ λειτουργία μηχανής που υποστηρίζουν τα επιλεγμένα γλωσσικά μοντέλα
TimeoutMilliseconds60000Deadline αιτήματος από 1 έως 3.600.000 χιλιοστά του δευτερολέπτου· το DLL συνεργάζεται με την ακύρωση, ενώ ο worker του CLI τερματίζεται σε timeout
MaxPixels16777216Ο προϋπολογισμός pixel εισόδου, ρυθμιζόμενος από 1 έως 67.108.864 pixels
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

Οι tpsOSDOnly και tpsAutoOnly δεν εκτελούν αναγνώριση λέξεων και απορρίπτονται από τον adapter· οι tpsAutoOSD και tpsSparseTextOSD απαιτούν επιπλέον το osd.traineddata

Χρησιμοποιήστε tpsSingleLine για μία γραμμή κειμένου, tpsSingleBlock για ένα ομοιογενές block, ή tpsSparseText για διασκορπισμένο κείμενο· αυτές οι λειτουργίες δεν διορθώνουν την προοπτική μιας σάρωσης ούτε δίνουν γενική εγγύηση διάταξης

Η temLSTMOnly απαιτεί μοντέλα LSTM, ενώ οι λειτουργίες legacy απαιτούν αντίστοιχα components μοντέλων legacy· μη υποστηριζόμενοι συνδυασμοί αποτυγχάνουν κατά την εγγενή αρχικοποίηση

Παράδειγμα αναζητήσιμου PDF

Το PDF πρέπει να είναι ήδη φορτωμένο, και το DLL, οι εξαρτήσεις, και τα γλωσσικά μοντέλα πρέπει να είναι εγκατεστημένα στις εμφανιζόμενες τοποθεσίες

uses SysUtils, HPDFDoc, HPDFTesseractRecognition;

procedure AddNativeOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  NativeOptions: THPDFTesseractOptions;
  LayerOptions: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  NativeOptions := THPDFTesseractOptions.Default;
  NativeOptions.EngineMode := temLSTMOnly;
  NativeOptions.PageSegMode := tpsAuto;
  Engine := HPDFCreateTesseractDLLOCREngine(
    'C:\OCR\libtesseract-5.dll', 'C:\OCR\tessdata',
    'chi_sim+eng', NativeOptions);
  LayerOptions := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, LayerOptions, Info) then
    raise Exception.Create(string(Info.Diagnostic));
end;

Αποτελέσματα και ιδιοκτησία

Ο adapter αντιγράφει το δανεισμένο bitmap σε ένα buffer grayscale με αρχή πάνω, προωθεί το ζητούμενο DPI, και αναγνωρίζει μέσω ενός instance εγγενούς API τοπικού στο αίτημα

Οι λέξεις διατηρούν εγγενή σειρά ανάγνωσης, επικυρωμένο κείμενο Unicode UTF-8, όρια pixel πάνω-αριστερά, και εμπιστοσύνη κλιμακωμένη από 0 έως 100 σε 0 έως 1· οι συμπληρωματικοί χαρακτήρες καταναλώνουν δύο μονάδες UTF-16

Οι διαθέσιμοι baselines λέξεων περνούν μέσα με και τα δύο τους άκρα· όταν ένα baseline δεν είναι διαθέσιμο, εφαρμόζεται το υπάρχον γεωμετρικό fallback του text layer

Για μια κατά κύριο λόγο κατακόρυφη γραμμή βάσης, ο εγγενής adapter χρησιμοποιεί το πλάτος του πλαισίου λέξης ως TextHeightPixels· οι οριζόντιες γραμμές βάσης χρησιμοποιούν το ύψος του πλαισίου, συμπεριλαμβανομένων αντεστραμμένων κατευθύνσεων ανάγνωσης, ώστε το μήκος μιας κάθετης λέξης να μην γίνεται το μέγεθος της γραμματοσειράς της

Πρόκειται για εκτίμηση κυρίαρχου άξονα: ένα ευθυγραμμισμένο με τους άξονες πλαίσιο λέξης και γραμμή βάσης δεν μπορούν μόνα τους να ανακτήσουν το ακριβές ύψος κειμένου σε αυθαίρετες γωνίες στρέβλωσης

Μια κενή σελίδα πετυχαίνει με κενό πίνακα λέξεων· κακοδιατυπωμένο UTF-8, ενσωματωμένοι χαρακτήρες ελέγχου, άκυρη γεωμετρία ή εμπιστοσύνη, εξαντλημένοι προϋπολογισμοί λέξεων ή κειμένου, ακύρωση, και αποτυχίες αναγνώρισης επιστρέφουν False, εκκαθαρίζουν όλες τις μερικές λέξεις, και γεμίζουν το διαγνωστικό

Κάθε αίτημα απελευθερώνει τον iterator του, τα κατανεμημένα εγγενή strings, το monitor, και το instance του API· η απελευθέρωση του adapter ξεφορτώνει την αναφορά του στη βιβλιοθήκη

Όρια και ακύρωση

Κάθε διάσταση εισόδου πρέπει να είναι το πολύ 32.767 pixels και να χωράει στο MaxPixels· το αναγνωρισμένο κείμενο πρέπει να χωράει στον προϋπολογισμό MaxTextCodeUnits του αιτήματος και στο όριο 1.048.576 μονάδων UTF-16 του adapter, και το πλήθος λέξεων στο MaxWords

Ο adapter ελέγχει ακύρωση και παρόδο χρόνο κατά τη μετατροπή bitmap και την επανάληψη αποτελεσμάτων, και παρέχει ένα εγγενές monitor με το εναπομένον deadline και ένα callback ακύρωσης κατά την αναγνώριση

Η εγγενής ακύρωση είναι συνεργατική: το monitor του Tesseract καλύπτει την αναγνώριση λέξεων και δεν διακόπτει κάθε βήμα αρχικοποίησης ή ανάλυσης διάταξης· αυτές οι κλήσεις μπορεί να ολοκληρωθούν πριν αναφερθεί ζητούμενη ακύρωση ή ληγμένο deadline

Οι προϋπολογισμοί pixel και εξόδου δεν επιβάλλουν σκληρό όριο στη χρήση μνήμης μοντέλων ή αναγνώρισης της εγγενής βιβλιοθήκης· χρησιμοποιήστε τον adapter διεργασίας όταν η εφαρμογή χρειάζεται worker που τερματίζεται ξεχωριστά

Η ApplyLoadedOCRTextLayer επικυρώνει όλα τα αποτελέσματα και δημοσιεύει κάθε επιλεγμένη σελίδα ατομικά, ώστε μια αποτυχία adapter να αφήνει το φορτωμένο έγγραφο αμετάβλητο

Ο adapter DLL απορρίπτει άκυρο UTF-8, κόβει κενά από το decoded κείμενο λέξεων, και απορρίπτει εναπομείναντες χαρακτήρες ελέγχου C0, DEL, και C1 πριν επιστρέψει αποτελέσματα, ώστε κακοδιατυπωμένο κείμενο να αποτυγχάνει το αίτημα αντί να παραλείπεται σιωπηλά από το text layer PDF

Factory τοπικού CLI

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Η overload με options προωθεί το PageSegMode ως --psm και το EngineMode ως --oem, χρησιμοποιεί το ρυθμισμένο timeout, και ελέγχει το MaxPixels πριν αποθηκεύσει το δανεισμένο bitmap ή ξεκινήσει worker

Το υπάρχον overload με timeout διατηρεί την αυτόματη σελιδοτομή και τη λειτουργία μηχανής που επιλέγει το εκτελέσιμο, χωρίς να επιβάλλει νέο όριο pixel του adapter· χρησιμοποιήστε την overload με options όταν απαιτείται ρητό όριο εισόδου

Και τα δύο overloads διατηρούν το ζητούμενο DPI, την έξοδο TSV, τις περιορισμένες κληρονομημένες λαβές, το polling ακύρωσης, και τον τερματισμό worker σε αποτυχία· το CLI δεν έχει εγγενείς πληροφορίες baseline, περιορίζει την έξοδο TSV στα 64 MiB και την έξοδο αρχείου διαγνωστικών στο 1 MiB

Μη έγκυρες λειτουργίες σελιδοτομής, λειτουργίες μηχανής, timeouts, και όρια pixel εγείρουν EArgumentException κατά τη δημιουργία του ρυθμισμένου engine· η διαθεσιμότητα μοντέλων, συμπεριλαμβανομένου του osd.traineddata για λειτουργίες προσανατολισμού, και η συμβατότητα μοντέλου/μηχανής ελέγχονται από το εκτελέσιμο κατά την αναγνώριση

var
  CLIOptions: THPDFTesseractOptions;
  Engine: IHPDFOCREngine;
begin
  CLIOptions := THPDFTesseractOptions.Default;
  CLIOptions.PageSegMode := tpsSingleLine;
  CLIOptions.EngineMode := temLSTMOnly;
  CLIOptions.MaxPixels := 8000000;
  Engine := HPDFCreateTesseractOCREngine(
    'C:\OCR\tesseract.exe', 'C:\OCR\tessdata', 'eng', CLIOptions);
end;

Χρησιμοποιήστε tpsSingleWord για μια απομονωμένη λέξη, tpsSparseText για διασκορπισμένο κείμενο, ή tpsSingleBlockVertical με κατάλληλο μοντέλο κατακόρυφου κειμένου για ένα κατακόρυφο block· το factory δεν κόβει σελίδες ούτε επιλέγει μοντέλα αυτόματα

Ο adapter CLI επικυρώνει αυστηρά το UTF-8, απορρίπτει NUL bytes και χαρακτήρες ελέγχου C0/C1 μέσα στις αναγνωρισμένες λέξεις, και εκκαθαρίζει όλα τα αποτελέσματα αν κακοδιατυπωμένη έξοδος ακολουθήσει μια αλλιώς έγκυρη λέξη

Δείτε τα Αναζητήσιμα επίπεδα κειμένου OCR για το παράδειγμα CLI, επιλογές απόδοσης, ομαδοποίηση optional-content, και όρια συμμόρφωσης