Пошукові шари тексту OCR
HotPDF може відмальовувати вибрані завантажені сторінки для керованого застосунком рушія OCR та атомарно додавати пошуковий невидимий текст Unicode, вирівняний за кожним розпізнаним словом
Консольний приклад SearchableOCR надає робочий сценарій: створіть тристорінковий зразок із самих лише зображень через --create-sample, оберіть вбудований OCR, RapidOCR чи розпізнавання через Tesseract DLL/CLI, виберіть сторінки, налаштуйте достовірність і межі ресурсів та збережіть пошукову копію зі статистикою конвертації
Інтеграція рушія
Реалізуйте IHPDFOCREngine з будь-яким синхронним постачальником OCR, доступним застосунку
Рушій отримує позичений TBitmap, запитаний DPI, нормалізоване обертання сторінки, координати медіа-рамки, решту бюджетів слів і UTF-16 та ефективний токен скасування через THPDFOCRRequest
Рамки слів і необов'язкові базові лінії використовують координати пікселів растрового зображення від лівого верхнього кута, а рушій не повинен утримувати або звільняти позичений растровий образ після повернення з Recognize
Необов'язкові локальні рушії
Версія 2.754.0 додає явні фабрики Tesseract і RapidOCR, що повертають IHPDFOCREngine у Windows; перевантаження без рушія досі обирає наявний вбудований рушій
Встановіть і підготуйте обраний рушій локально до створення його адаптера, а потім передайте цей адаптер у перевантаження ApplyLoadedOCRTextLayer, що приймає рушій; виконувані файли, пакети Python і моделі OCR — це опційні зовнішні залежності, які не постачаються в комплекті з HotPDF
Tesseract
Опційний нативний DLL-адаптер Tesseract додає налаштовувані режими сегментації сторінок і рушія, багатомовне розпізнавання та нативні базові лінії слів через 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, і каталог даних, що містить потрібну мовну модель, як-от chi_sim.traineddata для chi_sim
Перевантаження з опціями приймає THPDFTesseractOptions.Default з явною сегментацією сторінок, режимом рушія розпізнавання, таймаутом і лімітом вхідних пікселів; обирайте tpsSingleLine, tpsSingleWord чи tpsSparseText відповідно до макета входу, як показано в Tesseract OCR Adapters
Цей приклад припускає, що виконуваний файл і дані вже встановлено за показаними шляхами, а 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
Нативний DLL-адаптер RapidOCR розпізнає знімки пам'яті з постійними внутрішньопроцесними процесорними ONNX-моделями через HPDFCreateRapidOCRDLLOCREngine, з опційною класифікацією кутів та кооперативним скасуванням у збірках Delphi, C++Builder і Windows FPC/Lazarus
Адаптер локальних моделей RapidOCR також надає перевантаження з THPDFRapidOCROptions для явних шляхів ONNX-моделей, опційної класифікації кутів, локальних символьних словників і шрифтів, лімітів процесорних потоків та бюджету пікселів входу в збірках 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 і ці три локальні моделі
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
Міст також вимагає %WINDIR%\Fonts\arial.ttf для контейнера результатів RapidOCR, вимикає автоматичні завантаження та використовує один потік ONNX на налаштований пул виконання; відсутні моделі, пакети чи локальний шрифт призводять до невдачі розпізнавання
Поточний міст використовує конфігурацію моделі спрощеної китайської та зберігає розпізнану пунктуацію без заміни повноширинних чи вузьких символів
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;
Обидві фабрики перевіряють наявні шляхи виконуваних файлів і даних та приймають таймаут від 1 до 3 600 000 мілісекунд, типово 60 000; недійсна конфігурація викликає EArgumentException
Спільний адаптер запускає прихований локальний процес із цитуваннями шляхів і обмеженими успадкованими дескрипторами, опитує скасування, таймаут і розміри виводу кожні 25 мілісекунд і завершує процес у разі невдачі перед очищенням тимчасових файлів
Вивід TSV обмежений 64 МіБ, а вивід діагностичних файлів — 1 МіБ, із повернутими діагностиками, обрізаними до 4 096 символів; розпізнані слова також мають вміщуватися в бюджети слів і UTF-16 запиту та чинні межі бітмапа
Вивід розпізнавання TSV має бути чинним UTF-8 і не містити байтів NUL чи керуючих символів C0/C1 усередині розпізнаних слів; пошкоджений вивід робить невдалим увесь запит розпізнавання, навіть якщо перед помилкою трапляються чинні слова
Це межі виводу та запиту, а не жорсткий ліміт використання пам'яті зовнішнього рушія; скасування та невдачі рушія повертаються через статус текстового шару без публікації часткових сторінок
Докази та межі розпізнавання
Локальна базова лінія RapidOCR 3.8.4 пройшла всі 15 повторень на п'яти фіксованих китайських регіонах сканування: два чисті регіони при 300 DPI і три регіони низької роздільності при 150 DPI, оцінені проти поточних еталонних транскриптів із рівнем помилок символів щонайбільше 5% і рівнем видалень щонайбільше 2%
Усі повторення пройшли перевірки порядку читання, загалом 5 190 перевірок координат слів чи символів і перевірку рівності видимих пікселів при 72 DPI; два чисті регіони мали нуль помилок символів проти цих еталонів
Два AI-огляди візуального змісту збігаються щодо китайського тексту та чисел, але деякі кодові точки пунктуації на растрі залишаються неоднозначними, і людське розглядання триває; розбіжності пунктуації все ще зараховуються як помилки, і ці результати є доказом для корпусу, а не загальною гарантією точності
Геометрія та текст пошуку
HotPDF інвертує перетворення сторінки рендерера, тому базові лінії слів залишаються вирівняними на сторінках, повернутих на 0, 90, 180 або 270 градусів
Кожне прийняте слово записується з режимом рендерингу тексту 3 Tr, припасованим горизонтальним масштабом тексту та матрицею тексту з урахуванням обертання, залишаючи растровий образ сторінки незмінним і зберігаючи порядок вибору вмісту
Спільний шрифт Type 0 Identity-H призначає обмежені локальні для документа CID скалярним значенням Unicode і записує повну карту ToUnicode, включно з сурогатними цілями UTF-16 для додаткових символів
Сусідні латинські та кириличні слова на одній базовій лінії отримують явний пробіл Unicode, коли їхня геометрія вказує на міжсловний проміжок; сусідні CJK-слова зберігають свій початковий текст без вставлених пробілів
Обробка відсканованого PDF
Консольний приклад Demo/Delphi/SearchableOCR/SearchableOCR.dpr завантажує відсканований PDF, запускає нативний RapidOCR з явним локальним мовним профілем, публікує невидимий текст 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 під час оновлення позначеного шару OCR HotPDF
Декодування JPEG-сканів у Windows FPC малює у фінальний формат пікселів бітмапа перед розпізнаванням, тож конвертація форматів LCL зберігає декодоване зображення
Оновлення наявного шару OCR
Встановіть THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer у True, щоб замінювати раніше згенеровані позначені потоки OCR HotPDF на розпізнаних сторінках в одній транзакції з новим текстом
Це обходить SkipPagesWithText лише на позначених сторінках і працює після збереження та перезавантаження; THPDFOCRTextLayerInfo.ReplacedPageCount повідомляє кількість замінених сторінок
Збої розпізнавання та сторінки без прийнятих слів зберігають старий текстовий шар; непозначені потоки, зокрема сторонні OCR і шари, згенеровані ранніми випусками HotPDF, зберігаються
Заміна від'єднує старі потоки вмісту OCR, але не прибирає ресурси шрифтів чи групи необов'язкового вмісту, на які ще можуть бути посилання в інших місцях; інкрементне збереження може утримувати замінені об'єкти з попередніх редакцій
Типовою поведінкою залишається пропуск будь-якої сторінки з витягуваним текстом, зокрема номера сторінки чи колонтитула над сканом; вимкнення SkipPagesWithText розпізнає всю сторінку і може задублювати наявний нативний текст, тож змішані сторінки вимагають обраного застосунком опрацювання
Межі, скасування та атомарність
THPDFOCRTextLayerOptions.Default вмикає розпізнавання 300 DPI, пропускає сторінки, які вже мають текст, і обмежує кількість сторінок, пікселів, слів, одиниць UTF-16 та згенерованих байтів вмісту
HotPDF перевіряє кожен результат рушія та будує весь вміст сторінки перед початком однієї транзакції графа з копіюванням-записом, тому збої рушія, недійсна геометрія, вичерпані бюджети, скасування чи помилки фіксації залишають завантажений граф об'єктів незмінним
Порожній масив індексів сторінок обирає кожну завантажену сторінку, тоді як дубльовані індекси сторінок розпізнаються один раз у порядку першого появи
MaxTotalWords підраховує всі отримані слова, зокрема слова з низькою достовірністю чи недійсні слова, які згодом відкидаються, а кожен запит сторінки отримує лише решту залишкового дозволу
Якщо бюджет слів чи UTF-16 вичерпано, а інша відповідна сторінка залишається, опрацювання повертає otlsBudgetExceeded до відмальовування чи розпізнавання цієї сторінки та не публікує жодного із запланованих текстових шарів; сторінкам, пропущеним через наявний текст, решта бюджету розпізнавання не потрібна
Групування за необов'язковим вмістом
Встановіть UseOptionalContentGroup, щоб зв'язати весь згенерований текст з одним іменованим шаром через словник Resources/Properties кожної сторінки
Ця опція вимагає PDF 1.5 і слідує StrictVersionLock; типово невидимий текст зберігається поза групою необов'язкового вмісту для найширшої сумісності
Примітка щодо конформності
Згенерований пошуковий шар навмисно використовує невбудований синтетичний шрифт, оскільки режим рендерингу 3 ніколи не малює гліфи
Цей API сам по собі не виробляє конформний PDF/A-вихід OCR, тому робочий процес PDF/A має використати шлях шару тексту з вбудованим шрифтом та запустити запитану перевірку конформності перед публікацією
Основні API
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Прогресивний рендеринг і скасування · Метод ExtractLoadedPageText