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

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

Progressiv rendering och avbrott · ExtractLoadedPageText-metoden