Kahdessa lomakkeessa voi olla samat kentät, ja silti ne käyttäytyvät täysin eri tavalla. AcroForm pitää sen kentät tavallisina PDF-objekteina jotka sijaitsevat todellisen sivun sisällön päällä, joten jokainen vaatimukset täyttävä lukija piirtää sen. Dynaaminen XFA-lomake ei pidä juuri mitään PDF-muodossa: kentät, asettelu ja jopa sivun geometria elävät XML-paketissa, ja näkyvät sivut tuotetaan aukioloaikana asettelukoneella, jonka vain Adobe on koskaan toimittanut laajemmin. Syötä kyseinen tiedosto web-katseluohjelmaan, arkiston hahmonnäjään tai tekstinpurkaimeen, niin et saa lomaketta laisinkaan. Saat yhden harmaan sivun, jossa lukee "Odota... Jos tätä viestiä ei lopulta korvata asiakirjan asianmukaisella sisällöllä, PDF-katseluohjelmasi ei ehkä pysty näyttämään tämäntyyppistä asiakirjaa." Jokainen, joka on ottanut vastaan hallituksen tai vakuutusalan papereita, tietää tämän heti nähdessään
Paikkamerkki ei ole korruptio. Se on juuri sitä, mitä muotoilijan mukaan pitäisi tapahtua, kun XFA-prosessoria ei ole läsnä, ja vuodesta 2026 lähtien tämä koskee lähes kaikkia katsojia desktop Acrobatin ulkopuolella. Joten käytännöllinen toimenpide on muuntaa dynaaminen lomake pelkäksi AcroFormiksi ennen kuin se saavuttaa mitään alavirtaa. HotPDF, Delphi- ja C++Builder -kielten losLab PDF-kirjasto suorittaa tämän muunnoksen koodina rakentamalla XML-muodon uudelleen natiivikentiksi alkuperäisille sivuille
Miksi nämä kaksi mallia eivät voi elää rinnakkain
AcroForm on määritelty ISO 32000-1 §12.7:ssä. Jokainen kenttä on PDF-objekti, jossa on widget-huomautus ja ulkoasuvirta, sivu on aitoa PDF-sisältöä ja sen päällä datamatkat. XFA kääntää asian toisinpäin: lomake on XML-dokumentti, XDP-paketti, joka on tallennettu AcroForm-sanakirjan /XFA -merkintään, ja dynaamisen lomakkeen PDF-sivuilla on "Odota" -paikkamerkki eikä mitään muuta, koska todellista sisältöä ei koskaan sarjoitettu PDF-muodossa. Lukija käsittelee tiedostoa jompana kumpana mallina. Ohita merkintä /XFA ja näet tyhjän kuoren; kunnioita sitä ilman XFA-moottoria ja näet varoituksen. ISO 32000-2 päätti keskustelun poistamalla XFA:n PDF 2.0:sta, mikä on pääasiallinen syy "muunnetaampa vielä kun voimme" on muuttunut reunan tapauksesta rutiininomaiseksi sisäänotto-politiikaksi
Ennen kuin muunnat mitään, luokittele se, sillä jokainen XFA-tiedosto ei näytä paikkamerkkiä. Staattiset XFA-lomakkeet toimitetaan valmiiksi piirretyillä PDF-sivuilla XML:n vieressä, joten ne näkyvät kaikkialla ja toimivat väärin vain kun ne on täytetty. Dynaamiset lomakkeet toimittavat vain paikkamerkin, ja niitä ei voi käyttää ennen kuin ne on muunnettu. Asia, johon kannattaa luottaa on asiakirja, ei koskaan sen laajennus tai lähettäjä. Tiedosto, joka hahmontaa todellista sisältöä ei-Adobe-katseluohjelmassa, mutta sisältää silti /XFA -merkinnän on joko staattinen tai hybridi; tiedosto joka näyttää varoitussivun on dynaaminen. Merkitse mihin laatikkoon kukin syöttötiedosto päätyi. Nämä kaksi lajia hajoavat myöhemmin eri tavoin, ja tyhjää arkistoitua lomaketta koskeva pyyntö (ticket) sulkeutuu sekunneissa, kun käyttölokissa (intake log) lukee jo "dynaaminen XFA, muunnettu, 47 kartoitettua kenttää, 2 varoitusta"
Ladatun XFA-asiakirjan muuntaminen alkuperäisiksi kentiksi
Muunnos suoritetaan jo muistissa olevaa dokumenttia vastaan. FlattenLoadedXFA jäsentää XFA-mallin ja sen tietopaketit, esittelee lomakkeen ja rakentaa sen uudelleen AcroForm-kentiksi todellisille PDF-sivuille:
var
Pdf: THotPDF;
MappedCount, I: Integer;
Warnings: TStrings;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.LoadFromFile('dynamic_xfa.pdf');
MappedCount := Pdf.FlattenLoadedXFA(True); // Tosi = kentät pysyvät muokattavissa
Warnings := Pdf.XFAFlattenWarnings;
for I := 0 to Warnings.Count - 1 do
Log('XFA flatten warning: ' + Warnings[I]); // kartoittamattomat elementit
Pdf.SaveLoadedDocument('native_acroform.pdf');
Log(Format('Mapped %d fields', [MappedCount]));
finally
Pdf.Free;
end;
end;
Palautusarvo ja varoitusluettelo ovat tulosteita, eivätkä ylivuodettua häiriöääntä (debug noise), joten säilytä ne molemmat. Muuntaminen menettää tietoja luonteensa vuoksi: XFA-komentosarjalla, lasketuilla kentillä ja dynaamisella alilomakkeen toiminnalla ei ole AcroForm-vastinetta, ja XFAFlattenWarnings nimeää jokaisen mallielementin joka ei kartoittunut. Arkistoi muunnettu tiedosto ilman sen varoitusluetteloa, ja jonain päivänä tuijotat tyhjää summaa arkistoidussa kopiossa ilman, että saat selville miksi näin on tapahtunut. Editable lippu ohjaa, pysyvätkö uudet kentät täytettävinä. Hyväksy True, kun ihmiset jatkavat työtä lomakkeen parissa, ja lukitse arvot, kun tavoitteena on jähmettynyt ennätys (frozen record)
Muunnoksen tarkistaminen on osittain visuaalista ja osittain rakenteellista ja tarvitset molemmat puolet. Rakenteellinen puolikas on helppo: vahvista, että kenttien määrä vastaa MappedCountia. Visuaalinen puolisko on se, joka nappaa todellisen vaurion kiinni. Avaa lähdelomake työpöydän Acrobatissa (joka on edelleen ainoa XFA-moottoria pyörittävä katseluohjelma) tavallisessa lukijassa olevan muunnetun tiedoston vieressä, ja vertaa arvoja sekä asettelua ainakin yhden täytetyn otteen osalta mallia kohden. Päivämäärä, jonka XFA-moottori näyttää muotoa 2026-06-11, voi päätyä AcroForm-kopioon raakana, alustamattomana arvona, ja vain sinun omat silmäsi voivat saada sen kiinni
Kun syöte on XDP-paketti
Jokainen työ ei ala PDF-tiedostolla. Joskus saat XDP-paketin itsenäisesti (viety lomakesuunnittelutyökalusta tai siirretty yhteistyöjärjestelmästä). ApplyXFAAsAcroForm ohittaa latausvaiheen ja asettaa paketin suoraan nykyiseen dokumenttiin:
XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
Sama puheluryhmä kulkee myös toiseen suuntaan siinä harvinaisemmassa tapauksessa, että joudut lähettämään XFA:n sen kulutuksen sijaan. AddXFAPacket liittää yksittäisiä nimettyjä paketteja, kuten 'xdp' tai 'config'. SetXFADocument asentaa täydellisen yhden virran hyötykuorman yhdessä puhelussa. ClearXFAPackets pyyhkii rekisteröinnin, jotta voit aloittaa alusta, ja AddXFASignaturePacket upottaa XAdES-materiaalia työnkulkuihin, jotka allekirjoittavat XML-lomaketiedot suoraan. XFA:n tuottaminen vuonna 2026 on markkinarako, joka on melkein aina yhden perintökuluttajan pakottama, joka kieltäytyy ottamasta mistään muusta, mutta kun sopimuksessa se on nimettynä nämä puhelut pitävät sen pelkkänä kokoonpanovalintana erillisen työkalun sijaan
"Litistä" tai "Flatten" toinen merkitys
Sana "flatten" kaataa monet keskustelut, koska se nimeää täysin toisenlaisen operaation: AcroForm -kentän ulkoasujen polttamisen sivun sisältövirtaan, kunnes interaktiivisia objekteja ei ole enää jäljellä. HotPDF:ssä ei ole API-sovellusliittymää nykyään tähän asiaan, ja se asia on hyvä tietää nyt eikä vasta projektin puolivälissä. Kirjaston antama ominaisuus on lukitus kentän tasolla, kun kenttä luodaan dokumentin käyttöoikeuksien tukemana:
// Lukitse arvo kentän luomisen yhteydessä: vain luku -tekstikenttä
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
Rect(50, 700, 220, 720), 0, [ffReadOnly]);
// Vyö ja henkselit: rajoita lomakkeen täyttämistä asiakirjanlaajuisesti
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// täyttölupa evätty: prFillAnnotations puuttuu sarjasta
Ole selvillä siitä, mitä tuolla saa tehtyä ja mitä ei. Vain luku -kenttä on edelleen lomakeobjekti. Se näkyy katsojan kenttäpaneelissa, sen arvo on luettavissa lomakesovellusliittymän kautta, ja tiedoston uudelleenkirjoittava työkalu voi tyhjentää vain luku -lipun. Lupa-liput (Permission flags) nostavat rimaa, mutta riippuvat siitä, päättääkö katsoja kunnioittaa niitä, jota rajoitusta ISO 32000-1 kuvailee selkeästi. Kun sääntelijä vaatii, että arkistoitu tietue ei sisällä lainkaan lomakeobjekteja, rehellinen vastaus HotPDF:n avulla on dokumentin uudelleenrakentaminen: lukee arvot ja piirrä ne tavallisena TextOut -sisältönä uudelle sivulle sen sijaan, että pukisit vain luku -lippuja litistämiseksi (tasoitukseksi tai flatteningiksi). Yksi asia muistaa lupareitillä (permissions route) on se että, CryptKeyLength on asetettava ennen BeginDocia; loput selviää AES-256-salausta ja käyttöoikeuksia koskevasta artikkelistamme
Mitä XFA merkitsee arkiston vaatimustenmukaisuudelle
PDF/A ja PDF/X hylkäävät molemmat XFA:n suoraan. ISO 19005 -arkistoa ruokkivan putken (pipeline) on siksi muunnettava ensin asiat, eikä tilausta voida neuvotella: ladata, FlattenLoadedXFA, tallentaa ja sen jälkeen arkistoida se tai varmentaa AcroForm-tulos. Älä käsittele muuntamista todisteena noudattamisesta (compliance). Se korjaa lomakemallin ja jättää fontit, värit ja metatiedot juuri sellaisiksi kuin ne olivat, joten vahvista tulos veraPDF:llä ennen kuin luotat siihen. Kun lomake on AcroForm-puolella sen käyttäytyminen saa omat ohjaimet. JavaScript-triggerit, lähetystoiminnot ja vahvistusskriptit (validation scripts) on käsitelty HotPDF AcroForm -kentät ja -toiminnot -artikkelissa
Tässä esitetyt XFA-rekisteröinti-, muunnos- ja lomakesovellusliittymät toimitetaan HotPDF Componentin mukana Delphille ja C++Builderille, joiden dokumentaatio jäljittää XFA-ominaisuuksien joukkoa sen kasvaessa viimeaikaisten julkaisujen myötä