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
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
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
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Renderowanie progresywne i anulowanie · Metoda ExtractLoadedPageText