Searchable OCR Text Layers

HotPDF gali atvaizduoti pasirinktuosius įkeltus puslapius programos pateiktam OCR varikliui ir atomiškai pridėti ieškomą nematomą Unicode tekstą, sulygiuotą su kiekvienu atpažintu žodžiu

SearchableOCR konsolės pavyzdinė programa pateikia veikiantį darbo srautą: sukurkite trijų puslapių tik iš vaizdų sudarytą pavyzdį su --create-sample, pasirinkite įtaisytąjį OCR, RapidOCR arba Tesseract DLL/CLI atpažinimą, išsirinkite puslapius, sukonfigūruokite pasitikėjimo ir išteklių ribas ir įrašykite ieškomą kopiją su konvertavimo statistika

Variklio integracija

Įgyvendinkite IHPDFOCREngine su bet kuriuo programai prieinamu sinchroniniu OCR teikėju

Variklis per THPDFOCRRequest gauna skolintąjį TBitmap, pageidaujamąją DPI, suvienodintąjį puslapio sukimą, media-box koordinates, likusias žodžių ir UTF-16 biologėtus bei efektyvųjį atšaukimo žetoną

Žodžių langai ir neprivalomosios apatinės linijos naudoja viršutinio kairiojo kampo taškų atvaizdo koordinates, o variklis po Recognize grąžinimo skolintojo atvaizdo negali nei pasilikti, nei atlaisvinti

Neprivalomosios vietinės varikliukės

Versija 2.754.0 papildo aiškiomis Tesseract ir RapidOCR gamyklomis, grąžinančiomis IHPDFOCREngine Windows aplinkoje; perkrava be variklio vis tiek pasirenka esamąjį įtaisytąjį variklį

Pasirinktąjį variklį įdiekite ir paruoškite vietoje dar prieš kurdami jo adapterį, tada tą adapterį perduokite ApplyLoadedOCRTextLayer variklinei perkravai; vykdomieji failai, Python paketai ir OCR modeliai yra neprivalomos išorinės priklausomybės ir nėra pridedami prie HotPDF

Tesseract

Neprivalomasis savųjų Tesseract DLL adapteris per HPDFCreateTesseractDLLOCREngine ir THPDFTesseractOptions prideda konfigūruojamąją puslapio segmentaciją ir variklio veiksenas, daugiakalbį atpažinimą bei savąsias žodžių pagrindo linijas

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Deklaracija yra HPDFTesseractRecognition; pateikite TSV išvestį gebantį Tesseract vykdomąjį failą ir duomenų aplanką su pageidaujamuoju kalbos modeliu, pavyzdžiui, chi_sim.traineddata skirtą chi_sim

Parinkčių perkrova priima THPDFTesseractOptions.Default su aiškia puslapio segmentacija, atpažinimo variklio veiksena, laiko limitu ir įvesties taškų riba; parenkite tpsSingleLine, tpsSingleWord arba tpsSparseText pagal įvesties išdėstymą, kaip parodyta Tesseract OCR Adapters puslapyje

Šis pavyzdys daro prielaidą, kad vykdomasis failas ir duomenys jau įdiegti nurodytaisias keliais, o PDF yra įkeltasis THotPDF egzempliorius

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

Savųjų RapidOCR DLL adapteris per HPDFCreateRapidOCRDLLOCREngine atpažįsta atminties momentines kopijas su nuolatiniais procese vykstančiais CPU ONNX modeliais, su papildomuoju kampų klasifikavimu ir bendradarbiavimu paremtu atšaukimu Delphi, C++Builder ir Windows FPC/Lazarus sudarymuose

RapidOCR vietinių modelių adapteris taip pat pateikia THPDFRapidOCROptions perkravą su aiškiaisiais ONNX modelių keliais, papildomuoju kampų klasifikavimu, vietiniais simbolių žodynais ir šriftais, CPU gijų ribomis bei įvesties taškų biudžetu Delphi, C++Builder ir FPC/Lazarus sudarymuose

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

Deklaracija yra HPDFRapidOCRRecognition; paruoškite Python su rapidocr ir onnxruntime, pateikiamąja tools/OCR/rapidocr_tsv.py sąsaja ir šiais trimis vietiniais modeliais

Sąsajai taip pat reikia %WINDIR%\Fonts\arial.ttf RapidOCR rezultatų konteineriui, ji išjungia automatinius atsisiuntimus ir naudoja po vieną ONNX giją kiekvienam nustatytajam vykdymo baseinui; trūkstamieji modeliai, paketai arba vietinis šriftas sukelia atpažinimo nesėkmę

Dabartoji sąsaja naudoja supaprastintosios kinų kalbos modelio konfigūraciją ir išlaiko atpažintąją skyrybą be pilnojo arba pusinio pločio pakeitimų

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;

Abi gamyklos patikrina esamus vykdomojo failo ir duomenų kelius ir priima laiko limitą nuo 1 iki 3 600 000 milisekundžių, pagal numatymą 60 000; netinkama konfigūracija iškelia EArgumentException

Bendrąsis adapteris paleidžia paslėptąjį vietinį procesą su kabutėse rašytais keliais ir apribotomis paveldimąsiomis rankenomis, kas 25 milisekundes apklausia atšaukimą, laiko limitą ir išvesties dydžius, o nesėkmės atveju nutraukia procesą dar prieš valydama laikinuosius failus

TSV išvestis ribojama iki 64 MiB, o diagnostinio failo išvestis — iki 1 MiB, grąžinamoji diagnostika nukerpama iki 4 096 simbolių; atpažintieji žodžiai taip pat turi tilpti į užklausos žodžių ir UTF-16 biudžetus bei tinkamas bitmap ribas

TSV atpažinimo išvestis turi būti tinkama UTF-8 ir neįtraukti NUL baitų arba C0/C1 valdymo simbolių į atpažintuosius žodžius; netinkama išvestis žlugdo visą atpažinimo užklausą, net kai prieš klaidą buvo tinkamų žodžių

Tai išvesties ir užklausų ribos, o ne kietoji išorinio variklio atminties naudojimo lubos; atšaukimas ir variklio nesėkmės grąžinami per teksto sluoksnio būseną, neišdavus dalinių puslapių

Atpažinimo įrodymai ir ribos

Vietinė RapidOCR 3.8.4 atskaitinė konfigūracija praėjo visus 15 pakartojimų penkiose fiksuotose kinų nuskaitymo srityse: dvejose aiškiosiose srityse ties 300 DPI ir trijose mažos raiškos spaudimo srityse ties 150 DPI, vertinant pagal dabartąsias atskaitinąsias transkripcijas su simbolių klaidų dažniu ne didesniu kaip 5% ir ištrynimų dažniu ne didesniu kaip 2%

Visi pakartojimai praėjo skaitymo eiliškumo patikras, iš viso 5 190 žodžių arba simbolių koordinačių patikrų ir matomųjų taškų lygybę ties 72 DPI; dvejose aiškiosiose srityse nebuvo nė vienos simbolių klaidos pagal tas nuorodas

Dvi AI vaizdinės peržiūros sutampa dėl kinų teksto ir skaičių, tačiau kai kurie rastrinės atvaizdo skyrybos kodo taškai lieka dviprasmiški ir žmogaus vertinimas dar nelaukia; skyrybos skirtumai vis tiek skaičiuojami kaip klaidos, o šie rezultatai yra korpuso įrodymai, o ne bendroji tikslumo garantija

Geometrija ir paieškos tekstas

HotPDF apverčia atvaizduoklės puslapio transformaciją, tad žodžių pagrindo linijos lieka sulygiuotos puslapiuose, pasuktuose 0, 90, 180 arba 270 laipsnių

Kiekvienas priimtasis žodis rašomas teksto atvaizdavimo 3 Tr veiksena, pritaikytuoju horizontaliuoju teksto masteliu ir pasukimą atmenančia teksto matrica, nepaliekant puslapio rastra pakeisto, bet išlaikant atrankinį turinio eiliškumą

Bendrasis Type 0 Identity-H šriftas Unicode kodo taškams priskiria apribotus dokumento lokalios apimties CID ir rašo visą ToUnicode atvaizdą, įskaitant UTF-16 surrogatų tikslus papildomiesiems simboliams

Gretutiniai tos pačios pagrindo linijos lotynų ir kirilicos žodžiai, kai jų geometrija rodo žodžio tarpą, gauna aiškųjį Unicode tarpą; gretutinieji CJK žodžiai išlaiko pirminįjį tekstą be įterptųjų tarpų

Nuskaityto PDF apdorojimas

Demo/Delphi/SearchableOCR/SearchableOCR.dpr konsolės pavyzdys įkelia nuskaitytąjį PDF, vykdo savąjį RapidOCR su aiškiuoju vietiniu kalbos profiliu, visiems tinkamuosius puslapius paskelbia nematomuoju Unicode tekstu ir išsaugo naują PDF neatverdamas žiūryklės

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

Supaprastintajai kinų kalbai naudokite --language ch, tradicinei — --language chinese_cht; DLL turi atitikti vykdomojo failo architektūrą, o parinktasis vietinių modelių paketas turi būti įdiegtas

Pavyzdys atsisako perrašyti esamąją išvesties bylą ir priima --replace-ocr, kai atnaujinama pažymėtoji HotPDF OCR sluoksnio atmaina

Windows FPC JPEG nuskaitytųjų vaizdų iškodavimas piešia į galutįjį bitmap taškų formatą dar prieš atpažinimą, tad LCL formato konversija išlaiko iškoduotąjį vaizdą

Esamos OCR sluoksnio atmainos atnaujinimas

Nustatykite THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer į True, kad anksčiau sugeneruotąsias, pažymėtąsias HotPDF OCR srautų atmainas atpažintuosiuose puslapiuose pakeistumėte toje pačioje transakcijoje kaip ir naujasis tekstas

Tai aplenkia SkipPagesWithText tik pažymėtuosiuose puslapiuose ir veikia po įrašymo bei pakartotinio įkėlimo; THPDFOCRTextLayerInfo.ReplacedPageCount praneša pakeistųjų puslapių skaičių

Atpažinimo nesėkmės ir puslapiai be priimtųjų žodžių išlaiko senąją teksto sluoksnio atmainą; nepažymėtosios srautų atmainos, įskaitant trečiųjų šalių OCR ir ankstesniųjų HotPDF laidų sukurtus sluoksnius, išlaikomos

Pakeitimas atjungia senąsias OCR turinio srautų atmainas, bet nepašalina šriftų išteklių ir papildomojo turinio grupių, į kurias gali būti nurodoma kitur; prieaugio įrašymas gali išlaikyti ankstesniųjų revizijų pakeistąsias objektų atmainas

Numatymas vis tiek praleidžia kiekvieną puslapį su ištraukiamuoju tekstu, įskaitant puslapio numerį arba antraštę ant nuskaitymo; išjungus SkipPagesWithText atpažįstamas visoks puslapis ir gali padubliuoti esamąjį savąjį tekstą, tad mišrieji puslapiai reikalauja programos parinktojo apdorojimo

Ribos, atšaukimas ir atomiškumas

THPDFOCRTextLayerOptions.Default įjungia 300 DPI atpažinimą, praleidžia puslapius, kurie jau atskleidžia tekstą, ir riboja puslapių skaičių, taškus, žodžius, UTF-16 vienetus ir sugeneruotojo turinio baitus

HotPDF patikrina kiekvieną variklio rezultatą ir sukuria visą puslapių turinį dar prieš pradėdamas vieną kopijavimo-rašymo grafo transakciją, tad variklio nesėkmės, netinkama geometrija, išsemtieji biudžetai, atšaukimas arba įteikimo klaidos įkeltąjį objektų grafą palieka nepakitę

Tuščiasis puslapių indeksų masyvas atrenka visus įkeltinguosius puslapius, o dubliutieji puslapių indeksai atpažįstami po kartą pirmojo pasirodymo tvarka

MaxTotalWords skaičiuoja visus gautuosius žodžius, įskaitant vėliau atmetamus mažo pasitikėjimo arba netinkamus žodžius, o kiekviena puslapio užklausa gauna tik likusįjį limitą

Kai žodžių arba UTF-16 biudžetas išsenka ir lieka dar vienas tinkamasis puslapis, apdorojimas grąžina otlsBudgetExceeded dar prieš atvaizduodamas ar atpažindamas tą puslapį ir neišduoda nė vieno planuotojo teksto sluoksnio; tekstą turintys praleistieji puslapiai likusio atpažinimo biudžeto nereikalauja

Pasirinktojo turinio grupavimas

Nustatykite UseOptionalContentGroup, kad visas sugeneruotasis tekstas per kiekvieno puslapio Resources/Properties žodyną būtų susietas su viena pavadintąja slidksniu

Ši parinktis reikalauja PDF 1.5 ir seka StrictVersionLock; numatymas nematomąjį tekstą laiko už pasirinktojo turinio grupės ribų, siekiant plačiausio suderinamumo

Atitikties pastaba

Sugeneruotasis paieškos sluoksnis tyčia naudoja neįterptąjį sintetinį šriftą, nes atvaizdavimo 3 veiksena niekada nepamargo glifų

Ši API pati savaime nesukuria PDF/A atitinkančios OCR išvesties, todėl PDF/A darbo eiga turėtų naudoti įterptųjų šriftų teksto sluoksnio kelią ir prieš išdavimą vykdyti pageidaujamąją atitikties patikrą

Pagrindinės API

Prieauginis atvaizdavimas ir atšaukimas · ExtractLoadedPageText metodas