Търсими OCR текстови слоеве
HotPDF може да рендира избрани заредени страници за от приложението доставен OCR engine и атомарно да добави търсим невидим Unicode текст, подравнен с всяка разпозната дума
Конзолното демо SearchableOCR предлага работещ работен поток: генерирайте тристраничен образец само с изображение чрез --create-sample, изберете вграден OCR, RapidOCR или Tesseract DLL/CLI разпознаване, изберете страници, конфигурирайте увереност и ресурсни лимити и запазете търсимо копие със статистики за конверсията
Интеграция на engine
Имплементирайте IHPDFOCREngine с всеки синхронен OCR provider, достъпен за приложението
Engine-ът получава зает TBitmap, искано DPI, нормализирано завъртане на страницата, media-box координати, оставащи бюджети за думи и UTF-16 единици и действащия токен за отмяна чрез THPDFOCRRequest
Кутиите на думите и опционалните базови линии използват координати в пиксели на bitmap-а с начало горе-вляво, а engine-ът не трябва да задържа или освобождава заетия bitmap след като Recognize се върне
Опционални локални engine-и
Версия 2.754.0 добавя изрични Tesseract и RapidOCR фабрики, връщащи IHPDFOCREngine на Windows; претоварването без engine все още избира съществуващия вграден engine
Инсталирайте и подгответе избрания engine локално, преди да създадете неговия adapter, после подайте adapter-а на engine претоварването на ApplyLoadedOCRTextLayer; изпълнимите файлове, Python пакетите и OCR моделите са опционални външни зависимости и не се доставят с HotPDF
Tesseract
Опционалният native Tesseract DLL адаптер добавя конфигурируемо page segmentation и engine режими, многоезично разпознаване и native word baseline-и чрез HPDFCreateTesseractDLLOCREngine и 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;
Декларацията е в HPDFTesseractRecognition; осигурете Tesseract изпълним файл, способен на TSV изход, и data директория с искания езиков модел, например chi_sim.traineddata за chi_sim
Претоварението с опции приема THPDFTesseractOptions.Default с изрично page segmentation, engine режим на разпознаване, timeout и лимит за входните пиксели; изберете tpsSingleLine, tpsSingleWord или tpsSparseText според входното оформление, както е показано в Tesseract OCR адаптерите
Примерът предполага, че изпълнимият файл и данните вече са инсталирани на показаните пътища и че PDF е заредена 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
Native RapidOCR DLL адаптерът разпознава memory snapshot-и с постоянни in-process CPU ONNX модели чрез HPDFCreateRapidOCRDLLOCREngine, с опционална класификация на ъглите и кооперативна отмяна в Delphi, C++Builder и Windows FPC/Lazarus компилации
RapidOCR адаптерът за локални модели също предлага претоварване с THPDFRapidOCROptions за изрични ONNX модельни пътища, опционална класификация на ъглите, локални речници със символи и шрифтове, лимити на CPU нишки и бюджет на входните пиксели в Delphi, C++Builder и FPC/Lazarus компилации
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;
Декларацията е в HPDFRapidOCRRecognition; осигурете Python с rapidocr и onnxruntime, доставения tools/OCR/rapidocr_tsv.py bridge и трите локални модела
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
Bridge-ът изисква и %WINDIR%\Fonts\arial.ttf за контейнера с резултати на RapidOCR, забранява автоматичните тегления и използва по един ONNX thread за конфигуриран execution pool; липсващи модели, пакети или локален шрифт карат разпознаването да се провали
Текущият bridge използва конфигурацията с опростен китайски модел и запазва разпознатата пунктуация без замяна между fullwidth и halfwidth знаци
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;
И двете фабрики валидират съществуващи пътища до изпълними файлове и данни и приемат timeout от 1 до 3,600,000 милисекунди, по подразбиране 60,000; невалидна конфигурация хвърля EArgumentException
Споделеният adapter стартира скрит локален процес с цитирани пътища и ограничени наследени handles, анкетира отмяна, timeout и размери на изхода на всеки 25 милисекунди и терминира процеса при неуспех, преди да почисти временните файлове
TSV изходът е ограничен до 64 MiB, а диагностичните файлове до 1 MiB, като върнатата диагностика се съкращава до 4,096 знака; разпознатите думи трябва също да се побират в бюджетите за думи и UTF-16 единици на заявката и в валидните bitmap граници
TSV изходът от разпознаването трябва да е валиден UTF-8 и да не съдържа NUL байтове или C0/C1 control знаци вътре в разпознатите думи; malformed изходът проваля цялата заявка за разпознаване, дори когато валидни думи предхождат грешката
Това са лимити за изход и заявка, а не твърд таван върху паметта на външния engine; отмяната и грешките на engine-а се връщат през статуса на текстовия слой, без да се публикуват частични страници
Доказателства и лимити на разпознаването
Локалната RapidOCR 3.8.4 база мина всичките 15 повторения на пет фиксирани китайски сканирани области: две чисти области при 300 DPI и три нискорезолюционни области под натоварване при 150 DPI, оценени срещу текущите еталонни транскрипции с character error rate най-много 5% и deletion rate най-много 2%
Всички повторения минаха проверки за ред на четене, общо 5,190 проверки на координати на думи или знаци и равенство на видимите пиксели при 72 DPI; двете чисти области имаха нула грешки в знаците срещу тези еталони
Два AI визуални прегледа се съгласяват за китайския текст и числата, но някои пунктуационни code points в растера остават нееднозначни и човешкото отсъждане е предстоящо; разликите в пунктуацията все пак се броят за грешки, а тези резултати са доказателство от corpus, не обща гаранция за точност
Геометрия и търсим текст
HotPDF обръща page transform-а на рендерера, така че базовите линии на думите остават подравнени на страници, завъртяти на 0, 90, 180 или 270 градуса
Всяка приета дума се записва с text rendering mode 3 Tr, нагоден хоризонтален text scale и ротационно-съобразна text матрица, оставяйки растера на страницата непроменен и запазвайки избираемия ред на съдържанието
Споделен Type 0 Identity-H шрифт заделя ограничени document-локални CID-и за Unicode скалари и записва пълна ToUnicode карта, включително UTF-16 surrogate цели за допълнителните знаци
Съседни латински и кирилски думи на една baseline получават изричен Unicode интервал, когато геометрията им сочи интервал между думи; съседни CJK думи запазват оригиналния си текст без вмъкнати интервали
Обработка на сканиран PDF
Конзолният пример Demo/Delphi/SearchableOCR/SearchableOCR.dpr зарежда сканиран PDF, изпълнява native RapidOCR с изричен локален езиков profile, публикува невидим Unicode текст на всички отговарящи на условията страници и записва нов PDF, без да отваря визуализатор
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
Използвайте --language ch за опростен китайски или --language chinese_cht за традиционен китайски; DLL-ът трябва да съответства на архитектурата на изпълнимия файл, а избраният локален модельен пакет трябва да е инсталиран
Примерът отказва да презапише съществуващ изходен файл и приема --replace-ocr при обновяване на маркиран HotPDF OCR layer
Windows FPC декодирането на JPEG сканирания рисува в крайния пикслов формат на bitmap-а преди разпознаването, така че LCL конверсията на формата запазва декодираното изображение
Обновяване на съществуващ OCR layer
Задайте THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer на True, за да замените преди това генерирани, маркирани HotPDF OCR потоци на разпознатите страници в същата транзакция като новия текст
Това заобикаля SkipPagesWithText само на маркирани страници и работи след запазване и презареждане; THPDFOCRTextLayerInfo.ReplacedPageCount докладва броя заменени страници
Провали на разпознаването и страници без приети думи запазват стария текстов layer; немаркирани потоци, включително OCR от трети страни и слоеве, генерирани от по-стари издания на HotPDF, се запазват
Замяната прекъсва връзката със старите OCR content stream-ове, но не премахва шрифтови ресурси или optional content групи, които все още могат да бъдат реферирани другаде; инкременталното запазване може да задържи изместени обекти от предишни ревизии
По подразбиране всяка страница с извличаем текст продължава да се прескача, включително номер на страница или header върху скан; изключването на SkipPagesWithText разпознава цялата страница и може да дублира съществуващ native текст, така че смесените страници изискват обработка, избрана от приложението
Граници, отмяна и атомарност
THPDFOCRTextLayerOptions.Default включва разпознаване при 300 DPI, прескача страници, които вече имат текст, и ограничава броя страници, пикселите, думите, UTF-16 единиците и генерираните content байтове
HotPDF валидира всеки резултат от engine-а и изгражда цялото съдържание на страниците, преди да стартира една copy-on-write транзакция на графа, така че грешки на engine-а, невалидна геометрия, изчерпани бюджети, отмяна или грешки при commit оставят заредения граф от обекти непроменен
Празен масив от индекси на страници избира всички заредени страници, а дублиращите се индекси се разпознават веднъж в реда на първата поява
MaxTotalWords брои всички получени думи, включително думи с ниска увереност или невалидни думи, отхвърлени по-късно, а всяка странична заявка получава само остатъка от allowance
Ако бюджетът за думи или UTF-16 единици е изчерпан и остава още една годна страница, обработката връща otlsBudgetExceeded, преди да рендира или разпознае тази страница, и не публикува нито един от планираните текстови слоеве; страниците, прескачени заради съществуващ текст, не изискват оставащ бюджет за разпознаване
Групиране в optional content
Задайте UseOptionalContentGroup, за да върже целия генериран текст за един именуван слой чрез речника Resources/Properties на всяка страница
Тази опция изисква PDF 1.5 и следва StrictVersionLock; по подразбиране невидимият текст стои извън optional content група за най-широка съвместимост
Бележка за съответствие
Генерираният търсим слой нарочно използва невграден синтетичен шрифт, защото rendering mode 3 никога не рисува глифи
Този API сам по себе си не произвежда PDF/A-съобразен OCR изход, така че PDF/A работен процес трябва да ползва път с вграден шрифт за текстовия слой и да изпълни исканата conformance валидация преди публикуване
Основни API
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Прогресивно рендиране и отмяна · ExtractLoadedPageText Method