Techninis straipsnis

losLab PDF bibliotekos Delphi aplinkai: HotPDF, PDFium Component ir PDFlibPas palyginimas

Trys bibliotekos. Trys skirtingi darbai. Pasirinkus netinkamą, prarasite savaites dėl apėjimų, o pasirinkus visas tris, kai reikia tik vienos, atsiras priežiūros išlaidų, kurių neplanavote. Čia pateikiama tiesioginė ataskaita apie tai, ką iš tikrųjų daro kiekviena losLab PDF biblioteka, kur ji tinka ir kur perduoda darbą savo broliams/seserims

HotPDF: PDF rašymas nuo nulio Delphi aplinkoje

HotPDF yra vietinis (native) VCL komponentas, skirtas generuoti PDF dokumentus. Jo modelis yra imperatyvus ir orientuotas į puslapius: jūs sukuriate THotPDF egzempliorių, nustatote dokumento ypatybes, iškviečiate BeginDoc, piešiate į CurrentPage, pagal poreikį pridedate puslapių ir uždarote su EndDoc. Eiliškumas yra svarbus, nes BeginDoc pritaiko šifravimo žodyną ir glaudinimo (compression) nustatymus tuo momentu, kai jis paleidžiamas; viskas, kas priskirta po šio momento, yra tyliai ignoruojama, o ne pritaikoma atgaline data

Piešimo paviršius Delphi lygmeniu apima visą PDF operatorių rinkinį: TextOut pozicionuotam Unicode tekstui, SetFont su TrueType įterpimu, vektoriniai primityvai (linijos, Bezier kreivės, elipsės, stačiakampiai), vaizdų patalpinimas iš failo ar atminties ir brūkšninių kodų generavimas. Koordinatės nurodytos taškais (points) nuo apatinio kairiojo kampo, kur Y didėja į viršų, o tai visus pagauna bent kartą. Šrifto būsena neišlieka po AddPage, todėl po kiekvieno puslapio lūžio (page break) būtina iškviesti SetFont

AcroForm laukai yra pirmos klasės piliečiai. Galite pridėti teksto laukus, žymės langelius (checkboxes), akutės mygtukus (radio buttons), išskleidžiamuosius sąrašus (combo boxes), sąrašų laukelius (list boxes) ir paspaudžiamus mygtukus tiesiai į puslapio objektą kiekvienam atlikdami po vieną iškvietimą. HotPDF taip pat gali įkelti esamą PDF failą per LoadFromFile ir užpildyti arba nuskaityti laukų reikšmes, o tai daro jį naudingą dviejose atskirose darbo eigose: kuriant formas ir automatizuojant jų užpildymą

Šifravimas taip pat tvarkomas dokumento lygmeniu. CryptKeyLength parenka schemą (nuo 40 bitų RC4 iki AES-256), ActivateProtection ją įjungia, o ProtectOptions nustato ISO leidimų vėliavėles (flags). Du AES-256 redakcijų režimai (R5 ir R6, valdomi UseAES256R6) egzistuoja, nes 6-oji redakcija ištaiso žinomą 5-osios redakcijos silpnumą, bet reikalauja PDF 2.0 palaikančios peržiūros programos; pasirinkimas tarp jų yra suderinamumo (compatibility) sprendimas, o ne patogumo

Skaitmeninių parašų palaikymas HotPDF apima PAdES bazinius profilius, todėl jis tinka darbo eigoms, kuriose parašas turi atitikti ETSI EN 319 142 reikalavimus. Jei jums reikia tik generuoti išvestį, HotPDF yra ta biblioteka, kurią pirmiausia turėtumėte rinktis

PDFium Component: esamų PDF failų atvaizdavimas, peržiūra ir skaitymas

PDFium Component apgaubia Google PDFium variklį kaip VCL komponentą, o tai suteikia jam iš esmės kitokį vaidmenį nei HotPDF. Kur HotPDF rašo, PDFium Component skaito ir atvaizduoja (renders). Pagrindinis objektas yra TPdf, dokumentų tvarkytuvė, kuri atidaro failą nustatydama FileName ir tada Active := True. Įkėlimo klaidos nėra iššaukiamos kaip išimtys; Active tiesiog lieka False, todėl jo patikrinimas po priskyrimo yra privalomas

Atvaizdavimas vyksta per TPdfView, vaizdinį komponentą, kurį numetate formoje ir susiejate su TPdf egzemplioriumi per PdfView.Pdf := Pdf. Mastelio keitimo (zoom) ir pritaikymo (fit) režimai gyvena rodinyje (view), o ne dokumente. Viena subtilybė, dėl kurios žmonės suklumpa: Pdf.PageNumber ir PdfView.PageNumber yra nepriklausomos ypatybės. Nustačius vieną, kita neatnaujinama, o rodiniu pagrįsti išgavimo (extraction) API (žodžių laukeliai, skaitymo vienetai) naudoja dabartinį rodinio puslapį, o ne dokumento

Teksto išgavimas yra ta sritis, kurioje PDFium Component neturi tiesioginio konkurento losLab asortimente. ReadablePageContent grąžina struktūruotą tekstą atsižvelgdamas į skaitymo tvarką, PageWordBoxes pateikia žodžių lygio ribojančius stačiakampius, o DocumentReadingUnits pereina visą dokumentą. Prieinamumo (accessibility) darbams IsTagged parodo, ar yra struktūros medis, o ValidatePdfUa paleidžia UA atitikties patikrinimą. Dėl šių API PDFium Component tampa natūraliu pasirinkimu bet kokiai darbo eigai, kai reikia suprasti, kas yra esamo PDF viduje, o ne kurti naują

Formų užpildymas taip pat veikia iš PDFium pusės, naudojant tą patį AcroForm sluoksnį, kurį atskleidžia pagrindinis variklis. Tai tinka, kai šaltinio dokumentas jau egzistuoja ir jūs automatizuojate jo užpildymą, užuot patys konstrave formos laukus

PDFlibPas: manipuliavimas, atitikties pasirašymas ir tiesioginė prieiga prie failų

PDFlibPas (versija 3.73.0) sėdi kitame sudėtingumo spektro gale. Jis atskleidžia tris API sluoksnius tame pačiame dokumento modelyje: plokščią rankenomis (handles) paremtą fasadą (TPDFlib), suderinamą su Quick-PDF iškvietimo konvencija, visą objektų medžio sluoksnį (TPDFDocument) ir srautinį analizatorių (TSmartPDFReader / TSmartPDFWriter), kuris veikia tiesiogiai su failo baitais neįkeliant viso objektų grafo

Srautinis sluoksnis yra tai, kas daro PDFlibPas tinkamu pasirinkimu dideliems dokumentams. TSmartPDFWriter gali pridėti laipsnišką atnaujinimą (incremental update) į failą diske neperkonstruodamas visos kryžminių nuorodų lentelės (cross-reference table), o tai yra mechanizmas, kuriuo grindžiamas ir efektyvus perrašymas (resaving), ir PAdES ilgalaikio patvirtinimo (long-term validation) antspaudai. Atitikties (compliance) lygio pasirašymo darbo eigoms, kai pasirašyta maiša (hash) turi apimti tam tikrą baitų diapazoną ir parašas taikomas neperrašant dokumento, šis sluoksnis yra vienintelis įmanomas kelias

Dokumentų manipuliavimas TPDFDocument lygmeniu apima sujungimą naudojant Merge, atrankinį puslapių kopijavimą per CopyPagesFromDoc su diapazono eilute ir versijų valdymą (governance) per SetMinimumVersion bei LockSaveVersion. Versijos užraktas (version lock) sukelia klaidą 602, jei bandote išsaugoti funkciją, kuri išvestų viršijančią užrakintą versiją; tai naudinga, kai reikia garantuoti, kad išvestis liks tam tikroje PDF redakcijoje, kad atitiktų archyvavimo reikalavimus

PDF/A palaikymas (ISO 19005) yra PDFlibPas atitikties (conformance) darbo aplinkoje. Atkreipkite dėmesį, kad šifravimas ir PDF/A pagal specifikaciją tarpusavyje nesuderinami: negalite turėti abiejų viename faile. Darbo eigos, kurioms reikia užšifruotos platinimo kopijos ir PDF/A archyvo kopijos, turi sukurti du atskirus artefaktus

Pasirinkimas tarp jų

Tipiškas sprendimų medis yra trumpas. Jei generuojate naują dokumentą iš duomenų, naudokite HotPDF. Jei atvaizduojate arba išgaunate tekstą iš esamo dokumento Delphi VCL programoje, naudokite PDFium Component. Jei manipuliuojate, sujungiate ar pasirašote (atitikties tikslais) esamus PDF masiškai arba naudodami laipsniško išsaugojimo semantiką, naudokite PDFlibPas. Daugelis gamybinių (production) sistemų naudoja du iš trijų: pavyzdžiui, HotPDF išvesčiai generuoti ir PDFlibPas – ilgalaikio patvirtinimo antspaudui pritaikyti prieš archyvavimą, arba PDFium Component – norint peržiūrėti, ką sukūrė HotPDF, prieš siunčiant tai toliau

Visi trys pateikiami kaip vietinis (native) Pascal pirminis kodas, skirtas Delphi ir C++Builder, be jokių vykdymo laiko priklausomybių (runtime dependencies) už VCL ribų. PDFium Component papildomai prideda PDFium DLL, kuris apima variklio atvaizdavimo ir analizės (parsing) darbus. Kiekvienos bibliotekos produkto puslapyje yra visa jos API nuoroda (reference) ir dabartinė versijų istorija

Išsami informacija apie atskiras bibliotekas: HotPDF Component, PDFium Component ir PDFlibPas