Tehnični članak

Izhod PDF 2.0, PDF/A-4 in PDF/UA-2 s HotPDF v Delphiju

HotPDF iz Delphija in C++Builderja piše izvorne dokumente PDF 2.0, vključno s tremi arhivskimi profili PDF/A-4 in dostopnim izhodom PDF/UA-2 z imensko razdeljenimi elementi strukture. Njihova izbira je zadeva dveh lastnosti, toda standardi za njimi so se spremenili bolj, kot nakazuje številka različice: PDF/A-4 je opustil črke skladnosti, ki se jih je vsakdo naučil ob PDF/A-2, PDF/UA-2 pa je uvedel imenske prostore strukture, ki jih dokument dela 1 nikoli ni imel

Ta članek obravnava, kaj se dejansko spremeni v ustvarjeni datoteki in katere napake HotPDF ob EndDoc spremeni v izjemo namesto v dokument, ki pri stranki ne uspe pri validaciji

Kako se identifikacija PDF/A-4 razlikuje od delov 2 in 3

PDF/A-4 se identificira s številko dela in letom revizije, pri osnovnem delu brez črke skladnosti. Nastavite PDFACompliance na '4' in HotPDF izpiše pdfaid:part=4 z pdfaid:rev=2020 in brez vnosa pdfaid:conformance sploh. Črka ni izginila — del 4 nima stopenj A/B/U, ker so bile zahteve, ki so jih nekoč ločevale, zložene v osnovni del

Dve razširitvi obdržita črko. '4E' izbere PDF/A-4e za inženirske dokumente in izpiše skladnost E, ki dovoljuje poti opomb 3D in RichMedia, ki jih drugi profili prepovedujejo. '4F' izbere PDF/A-4f in izpiše skladnost F, ki dovoljuje vdelano datoteko kateregakoli formata. Vsi tri silijo glavo PDF 2.0, zahtevajo običajne preveritve namena izhoda PDF/A in metapodatkov ter prepovedujejo šifriranje — šifrirana arhivska datoteka je protislovje, ki ga standard ne obravnava

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 vdelata datoteko, zgradi njen FileSpec z /AFRelationship in jo registrira tako v polje /AF kataloga kot v drevo imen EmbeddedFiles. Obi registraciji sta zahtevani; datoteka, navedena le v eni od njiju, je najpogostejši posamični razlog, zakaj hibridni račun opravi hitro oko preverjanje in ne uspe pri resničnem validatorju. Niz razmerja sprejema Source, Data, Alternative, Supplement ali Unspecified, aktivni profil pa mora biti PDF/A-3, PDF/A-4e ali PDF/A-4f — osnovni profil dela 4 ne dopušča pridruženih datotek. Starejše ime AddPDFA3AssociatedFile za obstoječo kodo še vedno deluje

Kaj PDF/UA-2 zahteva, česar PDF/UA-1 ni

PDF/UA-2 vsili PDF 2.0 in izpiše pdfuaid:part=2 z pdfuaid:rev=2024, v drevo strukture pa vnese imenske prostore. Dokument dela 1 je imel eno ploščato besedišče standardnih vlog. Dokument dela 2 lahko nosi vloge po meri, dokler vsaka od njih pripada razglašenemu imenskemu prostoru, kar omogoča, da je domenam specifično označevanje za assistivno tehnologijo berljivo in ne ugibanje

To implementirata dve metodi. RegisterStructureNamespace ustvari ali ponovno uporabi posredni slovar /Type /Namespace in ga navede v StructTreeRoot /Namespaces, pri čemer vrne slovar, da ga lahko ponovno uporabite. AddStructureElementNS ustvari element strukture, katerega vnos /NS kaže na ta slovar, kar licencira ime vloge zunaj standardne množice. Ponovljeni klici z istim URI-jem ponovno uporabijo en slovar namesto kopičenja dvojnikov

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 tu ni okras. Označen dokument brez izjave naravnega jezika pusti bralnik zaslona, da ugiba o izgovorjavi, PDF/UA pa obravnava opustitev kot napako in ne preference

Katere napake strukture ujame EndDoc?

Štiri in vsaka ustreza dokumentu, ki bi sicer prišel do validatorja zlomljen. Koren strukture mora vsebovati natanko en vrhnji element Document. Vsak slovar imenskega prostora mora biti posreden, tipiziran kot Namespace in nositi enoličen neprazen URI. Vsaka referenca /NS elementa strukture se mora razrešiti v slovar, dejansko naveden v korenskem polju /Namespaces. Neimensko-prostorna vloga pa mora biti standardna vloga PDF 2.0 ali se razrešiti skozi RoleMap

Ti se sprožijo ob EndDoc, ker je to zadnji trenutek, ko celotno drevo obstaja v pomnilniku, in prvi trenutek, ko je popolno. Ujetje prej bi pomenilo zavrnitev veljavnih vmesnih stanj; ujetje pozneje bi pomenilo, da jih sploh ne ujamemo. Praktična posledica za vašo kodo je, da se napaka strukture pokaže ob koncu generacije s sporočilom, ki poimenuje težavo, namesto da se pokaže tedne pozneje kot poročilo veraPDF, ki ga nekdo posreduje od stranke

Vloge PDF 2.0, ki se splača poznati

Naštevka tipiziranih vlog pridobi DocumentFragment, Aside, Title, FENote, Sub, Em, Strong in Artifact. Tri od teh spremenijo, kako označujete običajne poslovne dokumente. Aside končno da stranskim vrsticam in poudarjenim navedbam dom, ki ni zlorabljen Sect. FENote označi sprotna in končna opomba kot tisto, kar sta, tako ju bralec lahko ponudi namesto da ju prepleta s telesom besedila. Em in Strong nadomestita semantično ugibanje, ki je izhajalo iz označevanja poudarka kot oblikovanja na ravni razpona

Preobremenitev z nizom dodatno sprejme odprto obliko Hn, vključno z H7 in naprej. PDF 1.7 se je ustavil pri H6, kar je prisililo globoke tehnične dokumente, da so sploščili svojo orisno strukturo ali ponovno uporabljali ravni. Če generirate standarde, pravne kodekse ali kataloge delov, je lahko to sam po sebi razlog za premik izhoda na PDF 2.0

Kaj preveriti pred preklopom proizvodnega izhoda

PDF 2.0 je sprememba glave z dolgim repom. Starejša orodja za arhivski uvoz, nekateri RIP-i tiska in presenetljivo veliko poslovnih bralnikov sprejemajo le do PDF 1.7 in odpovejo pri glavi in ne pri čemer, kar ste naredili narobe. Pred preklopom potrdite uvozne sisteme in pomnite, da izbira profila PDF/A-4 izbere PDF 2.0, ne glede na to, ali ste to zahtevali ali ne

Varno zaporedje je obdržati PDF/A-3 za dokumente, ki gredo navzven neznanim bralcem, uporabiti PDF/A-4f za notranje arhive, kjer nadzirate uvoz, in sprejeti PDF/UA-2 le tam, kjer ga politika dostopnosti poimenuje. Če najprej obdelujete arhivsko stran, vodniki po validaciji PDF/A, PDF/X in PDF/UA in po hibridnih računih ZUGFeRD in Factur-X na PDF/A-3 obravnavajo izbire profilov, ki štejejo pred številko različice, zapiski o avtomatiziranem poročanju predleta pa kažejo, kako verdikt narediti del gradnje in ne ročnega koraka

HotPDF ladji celotno avtorsko ploskev PDF 2.0 kot izvorna koda VCL za Delphi in C++Builder, tako da izhod PDF/A-4 in PDF/UA-2 ne potrebuje zunanjega pogona ali redistribucijske datoteke — stran komponente HotPDF našteva podprte profile in različice RAD Studio