Tehnički članak

PDF 2.0, PDF/A-4 i PDF/UA-2 izlaz sa HotPDF u Delphi

HotPDF piše nativne PDF 2.0 dokumente iz Delphi i C++Buildera, uključujući tri PDF/A-4 arhivska profila i PDF/UA-2 pristupačni izlaz sa imenovanim prostorima elemenata strukture. Biranje ih je pitanje dva svojstva, ali standardi iza tih svojstava promenili su se više nego što broj verzije sugeriše: PDF/A-4 je odbacio slova usklađenosti koja je svako naučio uz PDF/A-2, a PDF/UA-2 je uveo prostore imena strukture koje dokument dela 1 nikada nije imao

Ovaj članak pokriva šta se zapravo menja u generisanom fajlu, i koje greške HotPDF pretvara u izuzetak pri EndDoc umesto u dokument koji pada na validaciji kod klijenta

Kako se PDF/A-4 identifikacija razlikuje od dela 2 i 3

PDF/A-4 se identifikuje po broju dela i godini revizije, bez slova usklađenosti za osnovni deo. Postavite PDFACompliance na '4' i HotPDF emituje pdfaid:part=4 sa pdfaid:rev=2020 i bez pdfaid:conformance unosa uopšte. Slovo nije nestalo — deo 4 nema A/B/U nivoe, jer su zahtevi koji su ih nekada razdvajali ulivene u osnovni deo

Dva proširenja zadržavaju slovo. '4E' bira PDF/A-4e za inženjerske dokumente i emituje usklađenost E, koja dozvoljava 3D i RichMedia putanje anotacija koje drugi profili zabranjuju. '4F' bira PDF/A-4f i emituje usklađenost F, koja dozvoljava ugrađeni fajl bilo kog formata. Sva tri nameću PDF 2.0 zaglavlje, zahtevaju uobičajene PDF/A provere namere izlaza i metapodataka, i zabranjuju šifrovanje — šifrovani arhivski fajl je kontradikcija koju standard ne podnosi

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-archive.pdf';
    Pdf.PDFACompliance := '4F';   // PDF/A-4f: associated files of any format
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Invoice 2026-0731');
    Pdf.AddPDFAssociatedFile('invoice.xml', 'text/xml',
      'Structured invoice data', 'Data', LoadInvoiceBytes);
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

AddPDFAssociatedFile ugrađuje fajl, gradi njegov FileSpec sa /AFRelationship, i registruje ga i u /AF nizu Kataloga i u stablu imena EmbeddedFiles. Obe registracije su obavezne; fajl naveden samo u jednoj od njih je najčešći razlog što hibridna faktura prolazi brzu proveru okom i pada na pravom validatoru. Niska odnosa prihvata Source, Data, Alternative, Supplement ili Unspecified, a aktivni profil mora biti PDF/A-3, PDF/A-4e ili PDF/A-4f — osnovni profil dela 4 ne prima pridružene fajlove. Starije ime AddPDFA3AssociatedFile i dalje radi za postojeći kod

Šta PDF/UA-2 zahteva što PDF/UA-1 nije

PDF/UA-2 nameće PDF 2.0 i emituje pdfuaid:part=2 sa pdfuaid:rev=2024, i uvodi prostore imena u stablo strukture. Dokument dela 1 imao je jedan ravan rečnik standardnih uloga. Dokument dela 2 može nositi prilagođene uloge sve dok svaka pripada deklarisanom prostoru imena, što je ono što čini domenski specifično označavanje čitljivim za asistivnu tehnologiju umesto pogađanjem

Dve metode ovo implementiraju. RegisterStructureNamespace kreira ili ponovo koristi indirektni /Type /Namespace rečnik i navodi ga u StructTreeRoot /Namespaces, vraćajući rečnik tako da ga možete ponovo koristiti. AddStructureElementNS kreira element strukture čiji /NS unos pokazuje na taj rečnik, što je ono što licencira ime uloge van standardnog skupa. Ponovljeni pozivi sa istim URI-jem ponovo koriste jedan rečnik umesto da gomilaju duplikate

var
  Root: THPDFDictionaryObject;
begin
  Pdf.PDFUACompliance := True;
  Pdf.PDFUAPart := 2;             // part 2 forces PDF 2.0
  Pdf.Lang := 'en-US';
  Pdf.BeginDoc;
  Root := Pdf.AddStructureElement('Document', nil);
  Pdf.AddStructureElementNS('WidgetGroup',
    'https://example.com/ns/widgets', Root);
  Pdf.EndDoc;
end;

Lang ovde nije ukras. Označeni dokument bez deklarisanih prirodnog jezika ostavlja čitač ekrana da pogađa izgovor, a PDF/UA tretira taj propust kao defekt, a ne kao preferencu

Koje greške strukture hvata EndDoc?

Četiri, i svaka odgovara dokumentu koji bi inače stigao do validatora slomljen. Koren strukture mora sadržati tačno jedan element Document na vrhu. Svaki rečnik prostora imena mora biti indirektan, otkucan kao Namespace, i nositi jedinstveni neprazni URI. Svaka /NS referenca elementa strukture mora razrešiti na rečnik koji je stvarno naveden u /Namespaces nizu korena. I neimenovana uloga mora biti standardna uloga PDF 2.0 ili razrešiti se kroz RoleMap

Ovo se aktivira pri EndDoc jer je to poslednji trenutak kad celo stablo postoji u memoriji i prvi trenutak kad je kompletno. Hvatanje ranije bi značilo odbacivanje valjanih intermedijalnih stanja; hvatanje kasnije bi značilo da se uopšte ne hvataju. Praktična posledica za vaš kod jeste da se greška strukture pojavljuje na kraju generisanja sa porukom koja imenuje problem, umesto da ispliva nedeljama kasnije kao veraPDF izveštaj koji neko prosledi od klijenta

PDF 2.0 uloge vredne poznavanja

Tipovani enum uloga dobija DocumentFragment, Aside, Title, FENote, Sub, Em, Strong i Artifact. Tri od njih menjaju kako označavate obične poslovne dokumente. Aside konačno daje bočnim trakama i izdvojenim citatima dom koji nije zloupotrebljeni Sect. FENote označava fusnote i endnote onakvima kakvi jesu, tako da čitač može nuditi ih umesto da ih ispreplće sa telo teksta. Em i Strong zamenjuju semantičko nagađanje koje je dolazilo od označavanja naglaska kao formatiranja na nivou raspona

Preopterećenje niskom dodatno prihvata otvoreni Hn oblik, uključujući H7 i dalje. PDF 1.7 se zaustavljao na H6, što je primoravalo duboke tehničke dokumente da spljnu svoj nacrt ili ponovo koriste nivoe. Ako generišete standardne dokumente, pravne kodove ili kataloge delova, ovo samo može biti razlog za prebacivanje izlaza na PDF 2.0

Šta proveriti pre prelaska na izlaz u proizvodnji

PDF 2.0 je promena zaglavlja sa dugim repom. Stariji alati za ingest arhive, neki RIP-ovi za štampu i iznenađujuće mnogo poslovnih pregledača prihvataju samo do PDF 1.7, i padaju na zaglavlju a ne na bilo čemu što ste pogrešili. Pre prelaska, potvrdite sisteme potrošače, i zapamtite da biranje PDF/A-4 profila bira PDF 2.0 bez obzira na to tražili li ili ne

Siguran redosled je zadržati PDF/A-3 za dokumente koji idu napolje ka nepoznatim čitačima, koristiti PDF/A-4f za interne arhive gde kontrolišete ingest, i usvojiti PDF/UA-2 samo tamo gde politika pristupačnosti imenuje ga. Ako prvo radite kroz arhivsku stranu, vodiči kroz validaciju PDF/A, PDF/X i PDF/UA i kroz ZUGFeRD i Factur-X hibridne fakture na PDF/A-3 pokrivaju izbore profila koji su važni pre broja verzije, a beleške o automatizovanom preflight izveštavanju pokazuju kako učiniti verdikt delom vaše gradnje umesto ručnim korakom

HotPDF isporučuje celu autorsku površinu PDF 2.0 kao nativni VCL kod za Delphi i C++Builder, tako da PDF/A-4 i PDF/UA-2 izlaz ne trebaju eksterni motor ili redistributabilu — stranica HotPDF komponente navodi podržane profile i verzije RAD Studio-a