Teknisk artikkel

losLab PDF-biblioteker for Delphi: HotPDF, PDFium Component og PDFlibPas Sammenlignet

Tre biblioteker. Tre distinkte jobber. Å velge feil vil koste deg uker med omveier, og å velge alle tre når du bare trenger ett koster deg vedlikeholdsarbeid du ikke hadde budsjettert for. Her er en direkte redegjørelse for hva hvert losLab PDF-bibliotek faktisk gjør, hvor det passer, og hvor det overlater ansvaret til sine søsken

HotPDF: skrive PDF fra bunnen av i Delphi

HotPDF er en opprinnelig VCL-komponent for å generere PDF-dokumenter. Modellen dens er imperativ og side-sentrert: du konstruerer en THotPDF-instans, angir dokumentegenskaper, kaller BeginDoc, tegner til CurrentPage, legger til sider etter behov, og avslutter med EndDoc. Rekkefølgen betyr noe, fordi BeginDoc binder (commits) krypteringsordboken og komprimeringsinnstillinger i det øyeblikket det kjører; alt som blir tilordnet etter det punktet ignoreres i stillhet, i stedet for å bli brukt med tilbakevirkende kraft

Tegneflaten dekker hele PDF-operatørsettet på Delphi-nivået: TextOut for posisjonert Unicode-tekst, SetFont med TrueType-innbygging, vektorprimitiver (linjer, Bezier-kurver, ellipser, rektangler), bildeplassering fra fil eller minne, og strekkodegenerering. Koordinater er i punkter (points) fra nedre venstre hjørne, der Y øker oppover, noe som fanger alle første gang. Skrifttypetilstanden overlever ikke AddPage, så et kall til SetFont kreves etter hvert sideskift

AcroForm-felt er førsteklasses borgere. Du kan legge til tekstfelt, avkrysningsbokser (checkboxes), radioknapper, kombinasjonsbokser (combo boxes), listebokser og trykknapper direkte i et side-objekt med ett enkelt kall for hver av dem. HotPDF kan også laste inn en eksisterende PDF gjennom LoadFromFile, og fylle ut eller lese feltverdier, noe som gjør det nyttig i to separate arbeidsflyter: bygging av skjemaer og automatisering av deres utfylling

Kryptering håndteres også på dokumentnivå. CryptKeyLength velger ordningen (fra 40-bits RC4 til AES-256), ActivateProtection aktiverer den, og ProtectOptions angir ISO-tillatelsesflaggene. De to AES-256-revisjonsmodusene (R5 og R6, kontrollert av UseAES256R6) eksisterer fordi revisjon 6 fikser en kjent svakhet i revisjon 5, men krever en seer (viewer) som støtter PDF 2.0; valget mellom dem er en kompatibilitetsbeslutning, ikke et spørsmål om bekvemmelighet

Digital signaturstøtte i HotPDF dekker de grunnleggende PAdES-profilene (baseline profiles), så det egner seg for arbeidsflyter der signaturen må oppfylle kravene i ETSI EN 319 142. Hvis du kun har behov for å generere utdata, er HotPDF biblioteket du bør gripe etter først

PDFium Component: gjengi, vise og lese eksisterende PDF-er

PDFium Component pakker inn Googles PDFium-motor som en VCL-komponent, noe som gir det en fundamentalt annerledes rolle enn HotPDF. Der HotPDF skriver, leser og gjengir PDFium Component. Kjerneobjektet er TPdf, en dokumentbehandler (document manager) som åpner en fil ved å sette FileName, og deretter Active := True. Feil ved innlasting reises ikke som unntak (exceptions); Active forblir rett og slett False, så å sjekke det etter tildelingen er ikke valgfritt

Gjengivelse (rendering) kjører gjennom TPdfView, en visuell komponent du drar inn på et skjema og kobler til en TPdf-instans via PdfView.Pdf := Pdf. Zoom og pass-modus (fit mode) ligger på view-et, ikke på dokumentet. En spissfindighet som snubler mange: Pdf.PageNumber og PdfView.PageNumber er uavhengige egenskaper. Å endre det ene oppdaterer ikke det andre, og de visningsbaserte uttrekks-API-ene (ordbokser, leseenheter) bruker visningens nåværende side, ikke dokumentets

Tekstuttrekk er der PDFium Component ikke har noen direkte konkurrent i losLab-serien. ReadablePageContent returnerer strukturert tekst med leserekkefølge-bevissthet, PageWordBoxes gir omsluttende rektangler (bounding rectangles) på ordnivå, og DocumentReadingUnits går gjennom hele dokumentet. For tilgjengelighetsarbeid forteller IsTagged deg om det finnes et struktur-tre, og ValidatePdfUa kjører en UA-samsvarskontroll (conformance check). Disse API-ene gjør PDFium Component til det naturlige valget for enhver arbeidsflyt som trenger å forstå hva som er inni en eksisterende PDF, snarere enn å produsere en ny

Skjemautfylling fungerer også på PDFium-siden, gjennom det samme AcroForm-laget som den underliggende motoren eksponerer. Det er hensiktsmessig når kildedokumentet allerede eksisterer og du automatiserer utfyllingen, fremfor å konstruere skjemafeltene selv

PDFlibPas: manipulering, compliance-signering og direkte-fil-tilgang

PDFlibPas (versjon 3.73.0) befinner seg i den andre enden av kompleksitetsskalaen. Den eksponerer tre API-lag på toppen av den samme dokumentmodellen: en flat, håndtaksbasert fasade (TPDFlib) kompatibel med Quick-PDF kallekonvensjonen (calling convention), et fullt objekt-tre-lag (TPDFDocument), og en strømmende parser (TSmartPDFReader / TSmartPDFWriter) som opererer direkte på filens byts uten å laste den fullstendige objektgrafen

Det strømmende laget er det som gjør PDFlibPas til det riktige valget for store dokumenter. TSmartPDFWriter kan legge til en inkrementell oppdatering til en fil på disken uten å rekonstruere hele kryssreferansetabellen, noe som er mekanismen under både effektiv omlagring og langsiktige valideringsstempler for PAdES. For signeringsarbeidsflyter på compliance-nivå, der den signerte hashen må dekke et bestemt byte-område, og signaturen blir anvendt uten at dokumentet skrives om, er dette laget den eneste gangbare veien

Dokumentmanipulering på TPDFDocument-nivå inkluderer sammenslåing (merging) med Merge, selektiv kopiering av sider via CopyPagesFromDoc med en områdestreng, og versjonsstyring gjennom SetMinimumVersion og LockSaveVersion. Versjonslåsen (version lock) utløser feil 602 hvis du forsøker å lagre en funksjon som ville presse utdataene over den låste versjonen, noe som er nyttig når du må garantere at utdata forblir innenfor en spesifikk PDF-revisjon for arkiveringssamsvar

PDF/A-støtte (ISO 19005) sitter i PDFlibPas' compliance-arbeidsbenk. Merk at kryptering og PDF/A utelukker hverandre i henhold til spesifikasjonen: du kan ikke ha begge deler i én fil. Arbeidsflyter som trenger en kryptert distribusjonskopi og en PDF/A arkivkopi, må produsere to separate artefakter

Velge mellom dem

Det typiske beslutningstreet er kort. Hvis du genererer et nytt dokument fra data, bruk HotPDF. Hvis du gjengir eller trekker ut tekst fra et eksisterende dokument i en Delphi VCL-applikasjon, bruk PDFium Component. Hvis du manipulerer, slår sammen eller compliance-signerer eksisterende PDF-er i stor skala, eller med inkrementell lagringssemantikk, bruk PDFlibPas. Mange produksjonssystemer bruker to av tre: HotPDF for å generere utdata, og PDFlibPas for å anvende et langsiktig valideringsstempel før arkivering, for eksempel, eller PDFium Component for å forhåndsvise hva HotPDF produserte før det sendes videre i prosessen (downstream)

Alle tre leveres som opprinnelig Pascal-kildekode for Delphi og C++Builder, uten noen kjøretidsavhengigheter utover VCL. PDFium Component buntler i tillegg med PDFium DLL-en, som dekker motorens gjengivelses- og parsningsarbeid. Produktsiden til hvert bibliotek bærer dets fullstendige API-referanse og nåværende versjonshistorikk

Detaljer om de enkelte bibliotekene: HotPDF Component, PDFium Component og PDFlibPas