Търсими 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 и трите локални модела

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

Прогресивно рендиране и отмяна · ExtractLoadedPageText Method