Kolme kirjastoa. Kolme erilaista tehtävää. Väärän valitseminen maksaa sinulle viikkoja kiertoteiden parissa, ja kaikkien kolmen valitseminen silloin, kun tarvitset vain yhden, aiheuttaa ylläpitokustannuksia, joita et budjetoinut. Tässä on suora kuvaus siitä, mitä kukin losLab PDF -kirjasto todellisuudessa tekee, mihin se sopii, ja missä se luovuttaa vastuun sisaruksilleen
HotPDF: PDF:n kirjoittaminen tyhjästä Delphissä
HotPDF on natiivi VCL-komponentti PDF-asiakirjojen tuottamiseen (generating). Sen malli (model) on imperatiivinen (imperative) ja sivukeskeinen (page-centric): rakennat (construct) THotPDF-instanssin, asetat (set) asiakirjan ominaisuudet, kutsut BeginDoc, piirrät CurrentPage-ominaisuuteen, lisäät sivuja tarpeen mukaan ja suljet EndDoc-kutsulla. Järjestyksellä on merkitystä, koska BeginDoc vahvistaa (commits) salaus- (encryption) ja pakkausasetukset (compression) sillä hetkellä, kun se suoritetaan; mikään (anything) sen jälkeen (after that point) määritetty (assigned) sivuutetaan hiljaisesti, eikä sitä sovelleta (applied) takautuvasti
Piirtopinta (drawing surface) kattaa koko PDF-operaattorijoukon (operator set) Delphi-tasolla: TextOut sijoitetulle Unicode-tekstille, SetFont TrueType-upotuksella (embedding), vektoriprimitiivit (viivat, Bezier-käyrät, ellipsit, suorakulmiot), kuvien (image) sijoittelu (placement) tiedostosta tai muistista sekä viivakoodien luonti. Koordinaatit ovat pisteinä (points) alavasemmasta kulmasta, Y:n kasvaessa ylöspäin (upward), mikä (which) yllättää kaikki kerran. Fontin tila (Font state) ei selviä AddPage-kutsusta, joten SetFont on kutsuttava jokaisen sivunvaihdon (page break) jälkeen
AcroForm-kentät ovat ensiluokkaisia kansalaisia (first-class citizens). Voit lisätä tekstikenttiä, valintaruutuja (checkboxes), valintanapeja (radio buttons), yhdistelmäruutuja (combo boxes), luetteloruutuja (list boxes) ja painikkeita (push buttons) suoraan sivuobjektiin yhdellä (single) kutsulla (call) kutakin (each) varten. HotPDF voi myös ladata (load) olemassa olevan PDF-tiedoston LoadFromFile-kutsulla ja täyttää (fill) tai lukea kenttien arvoja, mikä (which) tekee siitä (makes it) hyödyllisen kahdessa (two) erillisessä (separate) työnkulussa (workflows): lomakkeiden rakentamisessa ja niiden täytön automatisoinnissa (automating their population)
Salaus käsitellään myös asiakirjatasolla. CryptKeyLength valitsee järjestelmän (40-bittisestä RC4:stä AES-256:een), ActivateProtection aktivoi sen (arms it) ja ProtectOptions asettaa ISO-oikeusliput (permission flags). Kaksi AES-256 -revisiotilaa (R5 ja R6, joita ohjataan UseAES256R6-ominaisuudella) ovat olemassa, koska revisio 6 korjaa revisiossa 5 olevan tunnetun heikkouden (weakness), mutta vaatii PDF 2.0 -yhteensopivan katseluohjelman; niiden välillä valitseminen on yhteensopivuuspäätös (compatibility decision), ei mukavuuspäätös (convenience one)
Digitaalisen allekirjoituksen (Digital signature) tuki HotPDF:ssä kattaa PAdES-perusprofiilit (baseline profiles), joten se sopii työnkulkuihin, joissa allekirjoituksen on täytettävä (must meet) ETSI EN 319 142 -vaatimukset. Jos tarvitset vain tulosteen (output) tuottamista (generating), HotPDF on kirjasto, johon (to) kannattaa turvautua ensimmäisenä
PDFium Component: olemassa olevien PDF-tiedostojen renderöinti, katselu ja lukeminen
PDFium Component käärii Googlen PDFium-moottorin VCL-komponentiksi, mikä antaa sille pohjimmiltaan erilaisen roolin kuin HotPDF:llä. Siinä missä HotPDF kirjoittaa, PDFium Component lukee ja renderöi. Ydinobjekti (core object) on TPdf, asiakirjahallitsija (document manager), joka avaa tiedoston asettamalla FileName-ominaisuuden ja sen jälkeen Active := True. Latauksen epäonnistumiset (Load failures) eivät aiheuta (are not raised as) poikkeuksia (exceptions); Active pysyy yksinkertaisesti (simply stays) arvossa False, joten sen tarkistaminen (checking it) määrityksen (assignment) jälkeen ei ole (is not) valinnaista
Renderöinti (Rendering) tapahtuu TPdfView-komponentin kautta, joka on visuaalinen komponentti, jonka pudotat (drop) lomakkeelle (form) ja linkität (link) TPdf-instanssiin komennolla PdfView.Pdf := Pdf. Zoomaus (Zoom) ja sovitustila (fit mode) ovat (live on the) näkymässä (view), eivät (not on the) asiakirjassa (document). Yksi yksityiskohta (subtlety), johon ihmiset kompastuvat: Pdf.PageNumber ja PdfView.PageNumber ovat itsenäisiä (independent) ominaisuuksia. Toisen (one) asettaminen ei päivitä (does not update) toista, ja näkymään perustuvat (view-based) poiminnan (extraction) API:t (sanan laatikot (word boxes), lukuyksiköt (reading units)) käyttävät näkymän (view's) nykyistä sivua, eivät (not the) asiakirjan (document's)
Tekstin poiminta (Text extraction) on alue, jossa PDFium Componentilla ei ole suoraa kilpailijaa losLabin valikoimassa. ReadablePageContent palauttaa jäsennellyn tekstin (structured text) lukujärjestyksen (reading-order) huomioiden (awareness), PageWordBoxes antaa sanatason (word-level) rajaavat suorakulmiot (bounding rectangles), ja DocumentReadingUnits käy läpi (walks) koko asiakirjan. Saavutettavuustyötä (accessibility work) varten IsTagged kertoo (tells you), onko rakennepuu (structure tree) olemassa (present), ja ValidatePdfUa suorittaa UA-vaatimustenmukaisuustarkistuksen (conformance check). Nämä API:t tekevät PDFium Componentista luonnollisen valinnan kaikkiin työnkulkuihin, joissa on ymmärrettävä (needs to understand), mitä olemassa olevan PDF:n sisällä (inside) on, uuden (new one) tuottamisen sijaan (rather than)
Lomakkeiden täyttö (Form filling) toimii myös PDFium-puolella (side) saman AcroForm-kerroksen (layer) kautta, jonka (that the) taustalla oleva (underlying) moottori (engine) paljastaa (exposes). Se on tarkoituksenmukaista (appropriate), kun lähdeasiakirja (source document) on jo (already) olemassa (exists) ja olet automatisoimassa sen täyttämistä (completion) sen sijaan, että (rather than) rakentaisit lomakekenttiä itse (yourself)
PDFlibPas: manipulointi, vaatimustenmukainen allekirjoittaminen ja suora tiedostoyhteys (direct-file access)
PDFlibPas (versio 3.73.0) istuu monimutkaisuusasteikon (complexity spectrum) toisessa päässä. Se paljastaa (exposes) kolme API-kerrosta saman asiakirjamallin (document model) päälle (on top of the): litteän (flat) kahvapohjaisen (handle-based) julkisivun (facade) (TPDFlib), joka on yhteensopiva Quick-PDF-kutsukäytännön (calling convention) kanssa, täyden (full) objektipuukerroksen (object-tree layer) (TPDFDocument), ja virtaavan (streaming) jäsentimen (parser) (TSmartPDFReader / TSmartPDFWriter), joka operoi suoraan tiedoston (file) tavuilla (bytes) lataamatta (without loading the) koko (complete) objektiverkkoa (object graph)
Virtaava (streaming) kerros (layer) tekee PDFlibPas:sta oikean (right) valinnan (choice for) suurille (large) asiakirjoille. TSmartPDFWriter voi lisätä (append an) inkrementaalisen päivityksen levyllä (disk) olevaan tiedostoon rakentamatta (without reconstructing) koko ristiviittaustaulukkoa (cross-reference table) uudelleen, mikä on mekanismi sekä (underlying both) tehokkaan uudelleentallennuksen (efficient resaving) että PAdES pitkäaikaisen (long-term) validoinnin (validation) leimojen (stamps) taustalla. Vaatimustenmukaista (compliance-grade) allekirjoittamista (signing) vaativiin työnkulkuihin (workflows where the), joissa allekirjoitetun tiivisteen (signed hash) on katettava (must cover a) tietty (specific) tavualue (byte range) ja allekirjoitus sovelletaan (applied) kirjoittamatta (without rewriting) asiakirjaa uudelleen, tämä kerros (layer) on ainoa varteenotettava (viable) polku
Asiakirjojen manipulointi (manipulation at the) TPDFDocument -tasolla sisältää yhdistämisen (merging with) Merge-kutsulla, valikoivan sivujen kopioinnin CopyPagesFromDoc-kutsulla ja alueen (range) määrittelevällä merkkijonolla (string), sekä (and) version hallinnan (governance through) SetMinimumVersion- ja LockSaveVersion-kutsulla. Versiolukko (version lock) nostaa (raises) virheen 602, jos (if you) yrität (attempt to) tallentaa ominaisuuden (feature), joka (that would) työntäisi tulosteen (push the output) lukitun (locked) version yli (above the); tämä on hyödyllistä, kun (when you) sinun on taattava (guarantee that), että (output) tuloste pysyy (stays within a) tietyn PDF-revision sisällä arkistoinnin vaatimustenmukaisuutta (archival compliance) varten
PDF/A-tuki (ISO 19005) on PDFlibPas:n vaatimustenmukaisuuden (conformance) työpöydällä (workbench). Huomaa, että (Note that) salaus ja PDF/A poissulkevat toisensa spesifikaation (specification) mukaan: et voi (cannot) saada (have) molempia samassa (one) tiedostossa (file). Työnkulut (Workflows), jotka tarvitsevat (that need an) salatun jakelukopion (distribution copy) ja (and a) PDF/A-arkistokopion (archive copy), on (must) tuotettava kaksi erillistä (separate) artefaktia (artifacts)
Valinta niiden välillä
Tyypillinen päätöspuu on lyhyt. Jos olet tuottamassa (generating a) uutta (new) asiakirjaa datasta (data), käytä (use) HotPDF:ää. Jos renderöit tai poimit tekstiä olemassa (existing) olevasta asiakirjasta Delphi VCL -sovelluksessa, käytä PDFium Componentia. Jos (If you are) manipuloit, yhdistät (merging) tai teet (compliance-signing) vaatimustenmukaisia (compliance-signing) allekirjoituksia (existing) olemassa oleviin PDF-tiedostoihin suuressa mittakaavassa (at scale) tai (or with) inkrementaalisen tallennuksen (incremental-save) semantiikalla, käytä (use) PDFlibPas:ta. Monet (Many) tuotantojärjestelmät käyttävät kahta (two of the) näistä (three): HotPDF:ää tulosteen (output) tuottamiseen (generate) ja (and) PDFlibPas:ta pitkäaikaisen validoinnin (long-term validation) leiman (stamp to it) soveltamiseen (apply a) ennen arkistointia, esimerkiksi, tai (or) PDFium Componentia sen (what) esikatseluun (preview), mitä HotPDF (HotPDF produced) tuotti (produced) ennen sen (it) lähettämistä (sending) eteenpäin (downstream)
Kaikki kolme (All three) toimitetaan (ship as) natiivina (native) Pascal-lähdekoodina Delphille ja C++Builderille, ilman (with no) ajonaikaisia (runtime) riippuvuuksia (dependencies) VCL:n ulkopuolella (beyond the VCL). PDFium Component sisältää (bundles) lisäksi PDFium-DLL:n, joka (which) kattaa (covers the) moottorin (engine's) renderöinnin (rendering) ja jäsennyksen (parsing work). Jokaisen kirjaston tuotesivulta (product page) löytyy (carries its) sen koko (full) API-viite (API reference) ja nykyinen (current) versiohistoria (version history)
Yksityiskohtia (Details on the) yksittäisistä (individual) kirjastoista (libraries): HotPDF Component, PDFium Component ja PDFlibPas