Zoekbare OCR-tekstlagen

HotPDF kan geselecteerde geladen pagina's renderen voor een door de toepassing geleverde OCR-engine en atoomisch zoekbare, onzichtbare Unicode-tekst toevoegen die uitgelijnd is met elk herkend woord

Het SearchableOCR-consolevoorbeeld biedt een uitvoerbare workflow: genereer met --create-sample een sample van drie pagina's met alleen afbeeldingen, kies ingebouwde OCR, RapidOCR of Tesseract DLL/CLI-herkenning, selecteer pagina's, stel confidence- en resourcelimieten in en sla een doorzoekbare kopie op met conversiestatistieken

Engine integration

Implementeer IHPDFOCREngine met elke synchrone OCR-provider die voor de toepassing beschikbaar is

De engine ontvangt via THPDFOCRRequest een uitgeleende TBitmap, de gevraagde DPI, de genormaliseerde paginarotatie, media-box-coördinaten, de resterende woord- en UTF-16-budgetten en het effectieve cancellation token

Word-boxes en optionele baselines gebruiken bitmappixelcoördinaten vanaf linksboven, en de engine mag de uitgeleende bitmap na terugkeer van Recognize niet vasthouden of vrijgeven

Optionele lokale engines

Versie 2.754.0 voegt expliciete Tesseract- en RapidOCR-fabrieken toe die op Windows een IHPDFOCREngine teruggeven; de overload zonder engine kiest nog steeds de bestaande ingebouwde engine

Installeer de gekozen engine lokaal en richt die in voordat je de adapter aanmaakt, en geef die adapter daarna door aan de engine-overload van ApplyLoadedOCRTextLayer; executables, Python-packages en OCR-modellen zijn optionele externe afhankelijkheden en worden niet met HotPDF meegeleverd

Tesseract

De optionele native Tesseract-DLL-adapter voegt instelbare paginasegmentatie en engine-modi, meertalige herkenning en native woordbaselines toe via HPDFCreateTesseractDLLOCREngine en 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;

De declaratie staat in HPDFTesseractRecognition; lever een Tesseract-executable die TSV-uitvoer kan produceren en een datamap met het gevraagde taalmodel, zoals chi_sim.traineddata voor chi_sim

De options-overload accepteert THPDFTesseractOptions.Default met expliciete paginasegmentatie, engine-modus voor herkenning, timeout en invoerpixellimiet; kies tpsSingleLine, tpsSingleWord of tpsSparseText om bij de invoerlayout te passen, zoals getoond in Tesseract OCR-adapters

Dit voorbeeld veronderstelt dat de executable en data al op de getoonde paden zijn geïnstalleerd en dat PDF een geladen THotPDF-instantie is

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

De native RapidOCR-DLL-adapter herkent geheugensnapshots met persistente in-process CPU-ONNX-modellen via HPDFCreateRapidOCRDLLOCREngine, met optionele hoekclassificatie en coöperatieve annulering in Delphi-, C++Builder- en Windows FPC/Lazarus-builds

De RapidOCR-adapter voor lokale modellen biedt bovendien een THPDFRapidOCROptions-overload voor expliciete ONNX-modelpaden, optionele hoekclassificatie, lokale tekenwoordenboeken en fonts, CPU-threadlimieten en een invoerpixelbudget, in Delphi-, C++Builder- en FPC/Lazarus-builds

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript, ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;

De declaratie staat in HPDFRapidOCRRecognition; voorzie Python van rapidocr en onnxruntime, de meegeleverde brug tools/OCR/rapidocr_tsv.py en deze drie lokale modellen

De brug vereist ook %WINDIR%\Fonts\arial.ttf voor de resultatencontainer van RapidOCR, schakelt automatische downloads uit en gebruikt één ONNX-thread per geconfigureerde execution pool; ontbrekende modellen, packages of het lokale font laten de herkenning mislukken

De huidige brug gebruikt de modelconfiguratie voor Simplified Chinese en behoudt herkende punctie zonder vervanging door fullwidth- of halfwidth-vormen

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;

Beide fabrieken valideren bestaande executable- en datapaden en accepteren een timeout van 1 tot en met 3.600.000 milliseconden, met 60.000 als default; ongeldige configuratie geeft EArgumentException

De gedeelde adapter start een verborgen lokaal proces met gequote paden en beperkt overgeërfde handles, polst elke 25 milliseconden op annulering, timeout en uitvoergroottes en beëindigt het proces bij falen voordat de tijdelijke bestanden worden opgeruimd

TSV-uitvoer is beperkt tot 64 MiB en diagnostiekbestanduitvoer tot 1 MiB, met teruggegeven diagnostiek afgekapt op 4.096 tekens; herkende woorden moeten ook binnen de woord- en UTF-16-budgetten van het verzoek en binnen geldige bitmapgrenzen passen

TSV-herkenningsuitvoer moet geldige UTF-8 zijn en mag geen NUL-bytes of C0/C1-controltekens bevatten binnen herkende woorden; misvormde uitvoer laat het hele herkenningsverzoek falen, zelfs wanneer er geldige woorden aan de fout voorafgaan

Dit zijn uitvoer- en verzoeklimieten, geen harde grens voor het geheugengebruik van de externe engine; annulering en enginefalen komen terug via de tekstlaagstatus zonder dat partiële pagina's worden gepubliceerd

Onderbouwing en grenzen van de herkenning

De lokale RapidOCR 3.8.4-baseline doorliep alle 15 herhalingen over vijf vaste Chinese scanregio's: twee heldere regio's op 300 DPI en drie drukke regio's met lage resolutie op 150 DPI, beoordeeld tegen de huidige referentietranscripten met een character error rate van ten hoogste 5% en een deletion rate van ten hoogste 2%

Alle herhalingen doorstonden de leesvolgordecontroles, in totaal 5.190 woord- of tekencoördinatencontroles en zichtbare-pixelgelijkheid op 72 DPI; de twee heldere regio's hadden nul tekensfouten tegen die referenties

Twee AI-visuele reviews zijn het over de Chinese tekst en cijfers eens, maar sommige punctiecodepoints in het raster blijven dubbelzinnig en menselijke beoordeling is nog gaande; punctieverschillen tellen nog steeds als fouten en deze resultaten zijn corpusonderbouwing, geen algemene nauwkeurigheidsgarantie

Geometrie en zoektekst

HotPDF inverseert de paginatransformatie van de renderer zodat woordbaselines uitgelijnd blijven op pagina's gedraaid over 0, 90, 180 of 270 graden

Elk geaccepteerd woord wordt geschreven met text rendering mode 3 Tr, een passende horizontale textschaal en een rotatiebewuste tekstmatrix, waarbij het paginaraster ongewijzigd blijft en de selecteerbare inhoudsvolgorde bewaard blijft

Een gedeeld Type 0 Identity-H-font wijst begrensde documentlokale CID's toe aan Unicode-scalaren en schrijft een volledige ToUnicode-map, inclusief UTF-16-surrogaatdoelen voor aanvullende tekens

Aanpalende Latijnse en Cyrillische woorden op dezelfde baseline krijgen een expliciete Unicode-spatie wanneer hun geometrie op een woordgat wijst; aanpalende CJK-woorden behouden hun originele tekst zonder ingevoegde spaties

Een gescande PDF verwerken

Het consolevoorbeeld Demo/Delphi/SearchableOCR/SearchableOCR.dpr laadt een gescande PDF, draait native RapidOCR met een expliciet lokaal taalprofiel, publiceert onzichtbare Unicode-tekst op alle in aanmerking komende pagina's en slaat een nieuwe PDF op zonder een viewer te openen

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

Gebruik --language ch voor Simplified Chinese of --language chinese_cht voor Traditional Chinese; de DLL moet matchen met de architectuur van de executable en het gekozen lokale modelpackage moet geïnstalleerd zijn

Het voorbeeld weigert een bestaand uitvoerbestand te overschrijven en accepteert --replace-ocr wanneer een gemarkeerde HotPDF-OCR-laag wordt bijgewerkt

JPEG-scandecodering in FPC op Windows tekent vóór de herkenning naar het pixelformaat van de uiteindelijke bitmap, zodat de LCL-formaatconversie de gedecodeerde afbeelding behoudt

Een bestaande OCR-laag bijwerken

Zet THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer op True om eerder gegenereerde, gemarkeerde HotPDF-OCR-streams op herkende pagina's te vervangen in dezelfde transactie als de nieuwe tekst

Dit omzeilt SkipPagesWithText alleen op gemarkeerde pagina's en werkt na opslaan en opnieuw laden; THPDFOCRTextLayerInfo.ReplacedPageCount rapporteert het aantal vervangen pagina's

Herkenningsfouten en pagina's zonder geaccepteerde woorden behouden de oude tekstlaag; niet-gemarkeerde streams, waaronder OCR van derden en lagen die door eerdere HotPDF-releases zijn gegenereerd, worden behouden

Vervanging ontkoppelt de oude OCR-contentstreams maar verwijdert geen fontbronnen of optional-content-groepen die elders nog kunnen worden gerefereerd; incrementeel opslaan kan vervangen objecten uit eerdere revisies achterhouden

De default blijft elke pagina met extraheerbare tekst overslaan, inclusief een paginanummer of kop boven een scan; SkipPagesWithText uitzetten herkent de hele pagina en kan bestaande native tekst dupliceren, dus gemengde pagina's vragen om door de toepassing gekozen verwerking

Grenzen, annulering en atomiciteit

THPDFOCRTextLayerOptions.Default zet herkenning op 300 DPI aan, slaat pagina's die al tekst blootgeven over en beperkt het aantal pagina's, pixels, woorden, UTF-16-eenheden en gegenereerde contentbytes

HotPDF valideert elk engineresultaat en bouwt alle pagina-inhoud op voordat één copy-on-write-graatransactie start, zodat enginefalen, ongeldige geometrie, uitgeputte budgetten, annulering of commitfouten de geladen objectgraaf ongewijzigd laten

Een lege pagina-indexarray selecteert elke geladen pagina, terwijl duplicaatpagina-indexen eenmalig worden herkend in volgorde van eerste voorkomen

MaxTotalWords telt alle ontvangen woorden, inclusief woorden met lage confidence of ongeldige woorden die later worden weggegooid, en elk pagina-verzoek krijgt alleen de resterende toewijzing

Als het woord- of UTF-16-budget uitgeput raakt terwijl er nog een in aanmerking komende pagina over is, geeft de verwerking otlsBudgetExceeded terug voordat die pagina wordt gerenderd of herkend en publiceert geen enkele van de geplande tekstlagen; pagina's die vanwege bestaande tekst worden overgeslagen, vergen geen resterend herkenningsbudget

Optional-content-groepering

Zet UseOptionalContentGroup aan om alle gegenereerde tekst aan één benoemde laag te koppelen via het Resources/Properties-woordenboek van elke pagina

Deze optie vereist PDF 1.5 en volgt StrictVersionLock; de default houdt de onzichtbare tekst buiten een optional-content-groep voor de breedste compatibiliteit

Conformance-opmerking

De gegenereerde zoekbare laag gebruikt opzettelijk een niet-ingebed synthetisch font, want rendering mode 3 schildert nooit glyphs

Deze API produceert op zichzelf geen PDF/A-conforme OCR-uitvoer, dus een PDF/A-workflow gebruikt beter een tekstlaagpad met ingebed font en draait de gevraagde conformance-validatie vóór publicatie

Primaire API's

Progressieve rendering en annulering · ExtractLoadedPageText Method