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
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
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
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Progressieve rendering en annulering · ExtractLoadedPageText Method