Przeszukiwalne warstwy tekstu OCR

HotPDF potrafi renderować wybrane załadowane strony dla silnika OCR dostarczonego przez aplikację i atomowo dodawać przeszukiwalny niewidzialny tekst Unicode wyrównany z każdym rozpoznanym słowem

Konsolowe demo SearchableOCR daje gotowy do uruchomienia workflow: wygeneruj trzystronicową próbkę samych obrazów przez --create-sample, wybierz wbudowany OCR, RapidOCR albo rozpoznawanie przez Tesseract DLL/CLI, wskaż strony, skonfiguruj pewność i limity zasobów, a potem zapisz przeszukiwalną kopię ze statystykami konwersji

Integracja silnika

Zaimplementuj IHPDFOCREngine z dowolnym synchronicznym dostawcą OCR dostępnym dla aplikacji

Silnik odbiera pożyczony TBitmap, żądane DPI, znormalizowaną rotację strony, współrzędne media box, pozostałe budżety słów i UTF-16 oraz efektywny token anulowania przez THPDFOCRRequest

Ramki słów i opcjonalne linie bazowe używają współrzędnych pikselowych bitmapy z początkiem w lewym górnym rogu, a silnik nie może zachowywać ani zwalniać pożyczonej bitmapy po powrocie Recognize

Opcjonalne silniki lokalne

Wersja 2.754.0 dodaje jawne fabryki Tesseract i RapidOCR zwracające IHPDFOCREngine na Windows; przeciążenie bez silnika nadal wybiera istniejący wbudowany silnik

Zainstaluj i skonfiguruj wybrany silnik lokalnie, zanim utworzysz jego adapter, a potem przekaż ten adapter do przeciążenia z silnikiem ApplyLoadedOCRTextLayer; pliki wykonywalne, pakiety Python i modele OCR to opcjonalne zależności zewnętrzne i nie są dołączane do HotPDF

Tesseract

Opcjonalny adapter natywnej biblioteki DLL Tesseract dodaje konfigurowalną segmentację strony i tryby silnika, wielojęzyczne rozpoznawanie oraz natywne linie bazowe słów przez HPDFCreateTesseractDLLOCREngine i THPDFTesseractOptions

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

Deklaracja jest w HPDFTesseractRecognition; dostarcz plik wykonywalny Tesseract potrafiący wypisywać TSV i katalog danych z żądanym modelem języka, np. chi_sim.traineddata dla chi_sim

Przeciążenie z opcjami przyjmuje THPDFTesseractOptions.Default z jawną segmentacją strony, trybem silnika rozpoznawania, timeoutem i limitem pikseli wejścia; wybierz tpsSingleLine, tpsSingleWord albo tpsSparseText dopasowane do layoutu wejścia, jak pokazano w Adapterach OCR Tesseract

Ten przykład zakłada, że plik wykonywalny i dane są już zainstalowane pod pokazanymi ścieżkami, a PDF to załadowana instancja THotPDF

uses SysUtils, HPDFDoc, HPDFTesseractRecognition;

procedure AddTesseractText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateTesseractOCREngine(
    'C:\OCR\Tesseract\tesseract.exe',
    'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

RapidOCR

Adapter natywnej biblioteki DLL RapidOCR rozpoznaje snapshoty pamięci trwałymi modelami ONNX na CPU w ramach procesu przez HPDFCreateRapidOCRDLLOCREngine, z opcjonalną klasyfikacją kątową i kooperatywnym anulowaniem w kompilacjach Delphi, C++Builder oraz Windows FPC/Lazarus

Adapter lokalnych modeli RapidOCR dostarcza też przeciążenie z THPDFRapidOCROptions dla jawnych ścieżek modeli ONNX, opcjonalnej klasyfikacji kątowej, lokalnych słowników znaków i fontów, limitów wątków CPU oraz budżetu pikseli wejścia w kompilacjach Delphi, C++Builder i FPC/Lazarus

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;

Deklaracja jest w HPDFRapidOCRRecognition; przygotuj Python z rapidocr i onnxruntime, dostarczany bridge tools/OCR/rapidocr_tsv.py oraz te trzy lokalne modele

Bridge wymaga też %WINDIR%\Fonts\arial.ttf dla kontenera wyników RapidOCR, wyłącza automatyczne pobieranie i używa jednego wątku ONNX na skonfigurowaną pulę wykonawczą; brakujące modele, pakiety lub lokalny font powodują porażkę rozpoznawania

Obecny bridge używa konfiguracji modeli chińskiego uproszczonego i zachowuje rozpoznaną interpunkcję bez podstawiania wąskich lub szerokich wariantów znaków

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\RapidOCR\models', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

Obie fabryki walidują istniejące ścieżki plików wykonywalnych i danych oraz przyjmują timeout od 1 do 3 600 000 milisekund, domyślnie 60 000; nieprawidłowa konfiguracja podnosi EArgumentException

Wspólny adapter uruchamia ukryty proces lokalny z cytowanymi ścieżkami i ograniczonymi dziedziczonymi uchwytami, odpytuje anulowanie, timeout i rozmiary wyjścia co 25 milisekund oraz terminuje proces przy porażce, zanim posprząta pliki tymczasowe

Wyjście TSV jest ograniczone do 64 MiB, a wyjście pliku diagnostycznego do 1 MiB, przy czym zwracana diagnostyka jest ucinana do 4 096 znaków; rozpoznane słowa muszą też mieścić się w budżetach słów i UTF-16 żądania oraz w ważnych granicach bitmapy

Wyjście TSV rozpoznawania musi być poprawnym UTF-8 i nie może zawierać bajtów NUL ani znaków kontrolnych C0/C1 wewnątrz rozpoznanych słów; zniekształcone wyjście kończy całe żądanie rozpoznawania porażką, nawet gdy przed błędem pojawiły się poprawne słowa

To limity wyjścia i żądania, a nie twardy sufit zużycia pamięci zewnętrznego silnika; anulowanie i porażki silnika wracają przez status warstwy tekstu, bez publikowania częściowych stron

Dowody rozpoznawania i limity

Lokalny baseline RapidOCR 3.8.4 zaliczył wszystkie 15 powtórzeń na pięciu stałych chińskich regionach skanów: dwóch wyraźnych w 300 DPI i trzech presyjnych o niskiej rozdzielczości w 150 DPI, ocenianych względem bieżących transkryptów referencyjnych z błędem znakowym co najwyżej 5% i współczynnikiem usunięć co najwyżej 2%

Wszystkie powtórzenia zaliczyły sprawdzenia kolejności czytania, łącznie 5 190 sprawdzeń współrzędnych słów lub znaków oraz równość widocznych pikseli w 72 DPI; dwa wyraźne regiony miały zero błędów znakowych względem tych referencji

Dwa wizualne przeglądy AI zgadzają się co do chińskiego tekstu i liczb, ale niektóre punkty kodowe interpunkcji w rastrze pozostają niejednoznaczne i rozstrzygnięcie człowieka jest w toku; różnice interpunkcyjne nadal liczą się jako błędy, a te wyniki to dowód korpusowy, nie ogólna gwarancja dokładności

Geometria i tekst wyszukiwania

HotPDF odwraca transformację strony renderera, więc linie bazowe słów pozostają wyrównane na stronach obróconych o 0, 90, 180 lub 270 stopni

Każde przyjęte słowo jest zapisywane w trybie renderowania tekstu 3 Tr, z dopasowaną poziomą skalą tekstu i macierzą tekstu świadomą rotacji, zostawiając raster strony bez zmian i zachowując kolejność zaznaczalnej treści

Współdzielony font Type 0 Identity-H przypisuje ograniczone, lokalne dla dokumentu CID-y do skalarów Unicode i zapisuje kompletną mapę ToUnicode, łącznie z celami surrogate UTF-16 dla znaków uzupełniających

Sąsiadujące słowa łacińskie i cyrylickie na tej samej linii bazowej dostają jawną spację Unicode, gdy ich geometria wskazuje przerwę między wyrazami; sąsiadujące słowa CJK zachowują oryginalny tekst bez wstawianych spacji

Przetwarzanie zeskanowanego PDF

Konsolowy przykład Demo/Delphi/SearchableOCR/SearchableOCR.dpr ładuje zeskanowany PDF, uruchamia natywny RapidOCR z jawnym lokalnym profilem języka, publikuje niewidzialny tekst Unicode na wszystkich kwalifikujących się stronach i zapisuje nowy PDF bez otwierania przeglądarki

SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300

Użyj --language ch dla chińskiego uproszczonego albo --language chinese_cht dla chińskiego tradycyjnego; biblioteka DLL musi pasować do architektury pliku wykonywalnego, a wybrany lokalny pakiet modeli musi być zainstalowany

Przykład odmawia nadpisania istniejącego pliku wyjściowego i przyjmuje --replace-ocr przy aktualizacji oznaczonej warstwy OCR HotPDF

Dekodowanie skanów JPEG w FPC na Windows rysuje do docelowego formatu pikseli bitmapy przed rozpoznawaniem, więc konwersja formatu w LCL zachowuje zdekodowany obraz

Aktualizacja istniejącej warstwy OCR

Ustaw THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer na True, aby zastąpić wcześniej wygenerowane, oznaczone strumienie OCR HotPDF na rozpoznanych stronach w tej samej transakcji co nowy tekst

To omija SkipPagesWithText tylko na oznaczonych stronach i działa po zapisaniu i ponownym załadowaniu; THPDFOCRTextLayerInfo.ReplacedPageCount raportuje liczbę zastąpionych stron

Porażki rozpoznawania i strony bez przyjętych słów zachowują starą warstwę tekstu; nieoznaczone strumienie, w tym OCR stron trzecich i warstwy wygenerowane przez wcześniejsze wydania HotPDF, są zachowywane

Zastąpienie odłącza stare strumienie treści OCR, ale nie usuwa zasobów fontów ani grup zawartości opcjonalnej, do których wciąż można się odwoływać gdzie indziej; zapis przyrostowy może zachować zastąpione obiekty z poprzednich rewizji

Domyślnie nadal pomija się każdą stronę z wyekstrahowanym tekstem, w tym numer strony czy nagłówek na skanie; wyłączenie SkipPagesWithText rozpoznaje całą stronę i może zduplikować istniejący tekst natywny, więc strony mieszane wymagają przetwarzania wybranego przez aplikację

Granice, anulowanie i atomowość

THPDFOCRTextLayerOptions.Default włącza rozpoznawanie w 300 DPI, pomija strony, które już wystawiają tekst, i ogranicza liczbę stron, pikseli, słów, jednostek UTF-16 i bajtów wygenerowanej treści

HotPDF waliduje każdy wynik silnika i buduje całą treść strony przed rozpoczęciem jednej transakcji grafu copy-on-write, więc porażki silnika, nieprawidłowa geometria, wyczerpane budżety, anulowanie lub błędy zatwierdzania zostawiają załadowany graf obiektów bez zmian

Pusta tablica indeksów stron wybiera każdą załadowaną stronę, a zduplikowane indeksy stron są rozpoznawane raz, w kolejności pierwszego napotkania

MaxTotalWords liczy wszystkie otrzymane słowa, w tym słowa o niskiej pewności lub nieprawidłowe, które później zostają odrzucone, a każde żądanie strony dostaje tylko pozostały przydział

Jeśli budżet słów lub UTF-16 się wyczerpie, a pozostaje inna kwalifikująca się strona, przetwarzanie zwraca otlsBudgetExceeded przed renderowaniem lub rozpoznawaniem tej strony i nie publikuje żadnej z zaplanowanych warstw tekstu; strony pominięte z powodu istniejącego tekstu nie wymagają pozostałego budżetu rozpoznawania

Grupowanie w zawartości opcjonalnej

Ustaw UseOptionalContentGroup, aby związać cały wygenerowany tekst z jedną nazwaną warstwą przez słownik Resources/Properties każdej strony

Ta opcja wymaga PDF 1.5 i podąża za StrictVersionLock; domyślnie niewidzialny tekst zostaje poza grupą zawartości opcjonalnej dla najszerszej kompatybilności

Uwaga o zgodności

Generowana przeszukiwalna warstwa celowo używa nieosadzonego fontu syntetycznego, bo tryb renderowania 3 nigdy nie maluje glifów

To API samo z siebie nie produkuje wyjścia OCR zgodnego z PDF/A, więc workflow PDF/A powinien użyć ścieżki warstwy tekstu z osadzonym fontem i uruchomić żądaną walidację zgodności przed publikacją

Główne API

Renderowanie progresywne i anulowanie · Metoda ExtractLoadedPageText