Searchable OCR Text Layers
HotPDF kan rendera valda inlästa sidor för en applikationslevererad OCR-motor och atomärt lägga till sökbar, osynlig Unicode-text som ligger i linje med varje igenkänt ord
Konsoldemot SearchableOCR erbjuder ett körbart arbetsflöde: generera ett trensidigt exemple utan text med --create-sample, välj inbyggd OCR, RapidOCR eller Tesseract-DLL/CLI-igenkänning, välj sidor, konfigurera tillförlitlighets- och resursgränser och spara en sökbar kopia med konverteringsstatistik
Motorintegration
Implementera IHPDFOCREngine med vilken synkron OCR-leverantör som helst som finns tillgänglig för applikationen
Motorn tar emot en lånad TBitmap, begärd DPI, normaliserad sidrotation, media box-koordinater, kvarvarande ord- och UTF-16-budgetar samt den effektiva avbrytstoken via THPDFOCRRequest
Ordboxar och valfria baslinjer använder pixelkoordinater med origo uppe till vänster i bitmappen, och motorn får inte behålla eller frigöra den lånade bitmappen efter att Recognize har returnerat
Valfria lokala motorer
Version 2.754.0 lägger till explicita Tesseract- och RapidOCR-fabriker som returnerar IHPDFOCREngine på Windows; överbelastningen utan motor väljer fortfarande den befintliga inbyggda motorn
Installera och provisionera den valda motorn lokalt innan dess adapter skapas, och skicka sedan den adaptern till motoröverbelastningen av ApplyLoadedOCRTextLayer; körbara filer, Python-paket och OCR-modeller är valfria externa beroenden och följer inte med HotPDF
Tesseract
Den valfria nativa Tesseract-DLL-adaptern lägger till konfigurerbar sidsegmentering och motorlägen, flerspråkig igenkänning och nativa ordbaslinjer genom HPDFCreateTesseractDLLOCREngine och 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;
Deklarationen finns i HPDFTesseractRecognition; tillhandahåll en Tesseract-körbar fil som klarar TSV-utdata och en datakatalog som innehåller den begärda språkmodellen, till exempel chi_sim.traineddata för chi_sim
Options-överlagringen tar emot THPDFTesseractOptions.Default med explicit sidsegmentering, motorläge för igenkänningen, tidsgräns och pixelgräns för indata; välj tpsSingleLine, tpsSingleWord eller tpsSparseText för att matcha indatalayouten, som visas i Tesseract OCR-adaptrar
Det här exemplet förutsätter att den körbara filen och data redan har installerats på de visade sökvägarna och att PDF är en inläst THotPDF-instans
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
Den nativa RapidOCR DLL-adaptern igenkänner minnesavbildningar med beständiga CPU ONNX-modeller i processen genom HPDFCreateRapidOCRDLLOCREngine, med valfri vinkelklassificering och kooperativ avbrytning i Delphi-, C++Builder- och Windows FPC/Lazarus-byggen
Adaptern för lokala RapidOCR-modeller tillhandahåller också en THPDFRapidOCROptions-överlagring för explicita ONNX-modellsökvägar, valfri vinkelklassificering, lokala teckenordlistor och typsnitt, CPU-trådgränser och en pixelbudget för indata i Delphi-, C++Builder- och FPC/Lazarus-byggen
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;
Deklarationen finns i HPDFRapidOCRRecognition; provisionera Python med rapidocr och onnxruntime, den medföljande tools/OCR/rapidocr_tsv.py -bryggan och dessa tre lokala modeller
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
Bryggan kräver också %WINDIR%\Fonts\arial.ttf för RapidOCRs resultatbehållare, stänger av automatiska nedladdningar och använder en ONNX-tråd per konfigurerad exekveringspool; saknade modeller, paket eller det lokala typsnittet gör att igenkänningen misslyckas
Den nuvarande bryggan använder modellkonfigurationen för förenklad kinesiska och bevarar igenkända skiljetecken utan utbyte mot hel- eller halvbredd
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;
Båda fabrikerna validerar befintliga sökvägar för körbara filer och data och accepterar en timeout från 1 till 3 600 000 millisekunder, med 60 000 som standard; ogiltig konfiguration kastar EArgumentException
Den delade adaptern startar en dold lokal process med citatteckenomsvepta sökvägar och begränsade ärvda handtag, pollar avbrott, timeout och utdatastorlekar var 25:e millisekund och avslutar processen vid fel innan temporärfiler städas upp
TSV-utdata begränsas till 64 MiB och diagnostikfilutdata till 1 MiB, med returnerad diagnostik trunkerad till 4 096 tecken; igenkända ord måste dessutom rymmas inom begärans ord- och UTF-16-budgetar och giltiga bitmappsgränser
TSV-utdata från igenkänningen måste vara giltig UTF-8 och får inte innehålla NUL-byte eller C0/C1-kontrolltecken inuti igenkända ord; felaktig utdata misslyckar hela igenkänningsbegäran även när giltiga ord föregår felet
Detta är utdata- och begäransgränser, inte en hård tak för den externa motorns minnesanvändning; avbrott och motorfel returneras via textlagrets status utan att partiella sidor publiceras
Igenkänningsbevis och gränser
Det lokala RapidOCR 3.8.4-baselineet klarade alla 15 repetitioner över fem fasta kinesiska skanningsregioner: två tydliga regioner vid 300 DPI och tre lågupplösta påtryckningsregioner vid 150 DPI, utvärderade mot aktuella referenstranskriptioner med teckenfelfrekvens högst 5 % och raderingsfrekvens högst 2 %
Alla repetitioner klarade läsordningskontroller, totalt 5 190 koordinatkontroller av ord eller tecken och synlig-pixel-likhet vid 72 DPI; de två tydliga regionerna hade noll teckenfel mot de referenserna
Två visuella AI-granskningar är överens om den kinesiska texten och siffrorna, men vissa skiljeteckenkodpunkter i rastret förblir tvetydiga och mänsklig prövning pågår; skillnader i skiljetecken räknas fortfarande som fel och dessa resultat är korpusbevis, inte en allmän garanti för noggrannhet
Geometri och söktext
HotPDF inverterar renderarens sidtransform så att ordens baslinjer förblir i linje på sidor som roterats 0, 90, 180 eller 270 grader
Varje godkänt ord skrivs med textrenderingsläget 3 Tr, en anpassad horisontell textskala och en rotationsmedveten textmatris, vilket lämnar sidrastern oförändrad medan den valbara innehållsordningen bevaras
Ett delat Type 0 Identity-H-typsnitt tilldelar avgränsade dokumentlokala CIDs till Unicode-skalärer och skriver en fullständig ToUnicode-mappning, inklusive UTF-16-surrogatmål för supplerande tecken
Intilliggande latinska och kyrilliska ord på samma baslinje får ett explicit Unicode-mellanslag när deras geometri visar ett ordgap; intilliggande CJK-ord behåller sin ursprungliga text utan infogade mellanslag
Bearbetning av en skannad PDF
Konsolexemplet Demo/Delphi/SearchableOCR/SearchableOCR.dpr läser in en skannad PDF, kör nativ RapidOCR med en explicit lokal språkprofil, publicerar osynlig Unicode-text på alla berättigade sidor och sparar en ny PDF utan att öppna en visare
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
Använd --language ch för förenklad kinesiska eller --language chinese_cht för traditionell kinesiska; DLL:en måste matcha den körbara filens arkitektur och det valda lokala modellpaketet måste vara installerat
Exemplet vägrar skriva över en befintlig utdatafil och accepterar --replace-ocr när ett markerat HotPDF-OCR-lager uppdateras
JPEG-avkodning av skanningar i FPC i Windows ritar till den slutliga bitmapens pixelformat före igenkänningen, så att LCL:s formatkonvertering behåller den avkodade bilden
Uppdatering av ett befintligt OCR-lager
Sätt THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer till True för att ersätta tidigare genererade, markerade HotPDF-OCR-strömmar på igenkända sidor i samma transaktion som den nya texten
Det hoppar över SkipPagesWithText endast på markerade sidor och fungerar efter sparande och omläsning; THPDFOCRTextLayerInfo.ReplacedPageCount rapporterar antalet ersatta sidor
Igenkänningsfel och sidor utan godkända ord bevarar det gamla textlagret; omarkerade strömmar, inklusive tredjeparts-OCR och lager genererade av tidigare HotPDF-utgåvor, bevaras
Ersättning kopplar bort de gamla OCR-innehållsströmmarna men tar inte bort typsnittsresurser eller grupper för valfritt innehåll som fortfarande kan refereras någon annanstans; inkrementellt sparande kan behålla ersatta objekt från tidigare revisioner
Standarden förblir att hoppa över varje sida med extraherbar text, inklusive ett sidnummer eller en rubrik ovanför en skanning; att stänga av SkipPagesWithText känner igen hela sidan och kan duplicera befintlig nativ text, så blandade sidor kräver programsvald bearbetning
Gränser, avbrott och atomicitet
THPDFOCRTextLayerOptions.Default aktiverar igenkänning vid 300 DPI, hoppar över sidor som redan exponerar text och begränsar sidantal, pixlar, ord, UTF-16-enheter och genererade innehållsbyte
HotPDF validerar varje motorresultat och bygger allt sidinnehåll innan en copy-on-write-graftransaktion startas, så motorfel, ogiltig geometri, uttömda budgetar, avbrott eller commit-fel lämnar den laddade objektgrafen oförändrad
En tom sidindexarray väljer alla laddade sidor, medan duplicerade sidindex känns igen en gång i den ordning de först sågs
MaxTotalWords räknar alla mottagna ord, inklusive ord med låg tillförlitlighet eller ogiltiga ord som senare kastas, och varje sidbegäran får bara den återstående tilldelningen
Om ord- eller UTF-16-budgeten tar slut och en annan berättigad sida återstår, returnerar bearbetningen otlsBudgetExceeded innan den sidan renderas eller känns igen och publicerar inga av de planerade textlagren; sidor som hoppas över på grund av befintlig text kräver ingen återstående igenkänningsbudget
Gruppering i valfritt innehåll
Ställ in UseOptionalContentGroup för att binda all genererad text till ett namngivet lager via varje sidas Resources/Properties-ordlista
Det här alternativet kräver PDF 1.5 och följer StrictVersionLock; standardvalet håller den osynliga texten utanför gruppen för valfritt innehåll, för bredast kompatibilitet
Notering om regelefterlevnad
Det genererade sökbara lagret använder medvetet ett icke-inbäddat syntetiskt typsnitt eftersom renderingsläge 3 aldrig målar några glyfer
Detta API ger inte av sig självt PDF/A-konform OCR-utdata, så ett PDF/A-arbetsflöde bör använda en textlagerväg med inbäddat typsnitt och köra den begärda regelefterlevnadsvalideringen innan publicering
Primära API:er
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Progressiv rendering och avbrott · ExtractLoadedPageText-metoden