HotPDF rašo natyvius PDF 2.0 dokumentus iš Delphi ir C++Builder, įskaitant tris PDF/A-4 archyvavimo profilius ir PDF/UA-2 prieinamą išvestį su vardų erdvės struktūros elementais. Juos parinkti reiškia dvi savybes, bet standartai už tų savybių pasikeitė labiau, nei rodo versijos numeris: PDF/A-4 atmetė atitikties laiškus, kuriuos visi išmoko su PDF/A-2, o PDF/UA-2 įvedė struktūros vardų erdves, kurių 1 dalies dokumentas niekados neturėjo
Šis straipsnis padengia, kas tikrai pasikeičia sugeneruotame faile, ir kurias klaidas HotPDF paverčia išimtimi EndDoc metu, o ne dokumentu, kuris triksta tikrinimo pas kliento vietoje
Kuo PDF/A-4 identifikacija skiriasi nuo 2 ir 3 dalių
PDF/A-4 identifikuoja save pagal dalies numerį ir revizijos metus, be atitikties laiško bazinei daliai. Nustatykite PDFACompliance į '4', ir HotPDF išspausdina pdfaid:part=4 su pdfaid:rev=2020 be jokio pdfaid:conformance įrašo. Laiškas neišnyko — 4 dalis neturi A/B/U lygių, nes reikalavimai, anksčiau juos skyrę, buvo sujungti į bazinę dalį
Du plėtiniai išlaiko laišką. '4E' parenka PDF/A-4e inžineriniams dokumentams ir išspausdina atitikties E, kuri leidžia 3D ir RichMedia anotacijos kelius, kuriuos draudžia kiti profiliai. '4F' parenka PDF/A-4f ir išspausdina atitikties F, kuri leidžia įterptą failą bet kokiu formatu. Visi trys priverčia PDF 2.0 antraštę, reikalauja įprasto PDF/A išvesties intento ir metaduomenų tikrinimų bei draudžia šifravimą — šifruotas archyvinis failas yra prieštaravimas, kurio standartas neaptaria
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 įterpia failą, stato jo FileSpec su /AFRelationship ir registruoja jį tiek katalogo /AF masyve, tiek EmbeddedFiles pavadinimų medyje. Abi registracijos privalomos; failas, išvardintas tik vienoje iš jų, yra dažniausia priežastis, dėl kurios hibridinė sąskaita praeina greitą akies patikrinimą ir nepraeina realaus validatoriaus. Ryšio eilutė priima Source, Data, Alternative, Supplement arba Unspecified, o aktyvus profilis turi būti PDF/A-3, PDF/A-4e arba PDF/A-4f — bazinis 4 dalies profilis neleidžia susietų failų. Senesnis AddPDFA3AssociatedFile pavadinimas vis dar veikia esamam kodui
Ko PDF/UA-2 reikalauja, ko PDF/UA-1 nereikalavo
PDF/UA-2 priverčia PDF 2.0 ir išspausdina pdfuaid:part=2 su pdfuaid:rev=2024, ir jis įveda vardų erdves į struktūros medį. 1 dalies dokumentas turėjo vieną plokščią standartinių vaidmenų žodyną. 2 dalies dokumentas gali nešti pasirinktinius vaidmenis, jei tik kiekvienas priklauso deklaruotai vardų erdvei, ir būtent tai padaro srities-specifinį žymėjimą suprantamą pagalbinei technologijai, o ne spėliojimą
Du metodai tai įgyvendina. RegisterStructureNamespace sukuria arba pakartotinai panaudoja netiesioginį /Type /Namespace žodyną ir išvardija jį StructTreeRoot /Namespaces, grąžindamas žodyną, kad galėtumėte jį panaudoti iš naujo. AddStructureElementNS sukuria struktūros elementą, kurio /NS įrašas rodo į tą žodyną, kas ir suteikia teisę vaidmens vardui už standartinio rinkinio ribų. Pakartotiniai kvietimai su tuo pačiu URI panaudoja vieną žodyną, užuot sukrovę dublikatus
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 čia nėra dekoracija. Pažymėtas dokumentas be paskelbtos natūralios kallos palieka ekrano skaitytuvą spėliojant tarimą, o PDF/UA traktuoja tą praleidimą kaip defektą, o ne kaip pageidavimą
Kurias struktūros klaidas pagauna EndDoc?
Keturias, ir kiekviena atitinka dokumentą, kuris kitaip pasiektų validatorių sulaužytą. Struktūros šaknis turi turėti lygiai vieną aukščiausio lygio Document elementą. Kiekvienas vardų erdvės žodynas turi būti netiesioginis, su tipu Namespace ir nešti unikalų netuščią URI. Kiekviena struktūros elemento /NS nuoroda turi vesti į žodyną, iš tikrųjų išvardintą šaknies /Namespaces masyve. Ir vaidmuo be vardų erdvės turi būti PDF 2.0 standartinis vaidmuo arba išspręstas per RoleMap
Šie tikrinimai suveikia EndDoc metu, nes tai yra paskutinė akimirka, kai visas medis egzistuoja atmintyje, ir pirmoji, kai jis yra baigtas. Juos pagauti anksčiau reikštų atmesti teisėtas tarpines būsenas; vėliau — išvis nepagauti. Praktinė pasekmė jūsų kodui yra ta, kad struktūros riktas iškyla generavimo pabaigoje su pranešimu, nurodančiu problemą, užuot iškilęs po kelių savaičių kaip veraPDF ataskaita, kurią kas nors persiunčia iš kliento
PDF 2.0 vaidmenys, verti žinoti
Tipizuoto vaidmens išvardijimas įgyja DocumentFragment, Aside, Title, FENote, Sub, Em, Strong ir Artifact. Trys iš jų keičia, kaip žymite įprastus verslo dokumentus. Aside pagaliau duoda šoninėms juostoms ir ištraukiamoms citatoms namus, kurie nėra neteisingai panaudotas Sect. FENote pažymi išnašas ir galines išnašas kaip tai, kas jos yra, kad skaitytuvas galėtų jas pasiūlyti, užuot perskynęs su pagrindiniu tekstu. Em ir Strong pakeičia semantinį spėliojimą, kilusį iš paryškinimo žymėjimo kaip span lygio formatavimo
Eilutės perkrova papildomai priima atvirą Hn formą, įskaitant H7 ir toliau. PDF 1.7 sustojo ties H6, kas vertė gilius techninius dokumentus plokščinti savo planą ar pakartotinai naudoti lygius. Jei generuojate standartų dokumentus, teisės kodeksus ar dalių katalogus, tai vien gali būti priežastis perkelti išvestį į PDF 2.0
Ką patikrinti prieš perjungiant gamybos išvestį
PDF 2.0 yra antraštės pakeitimas su ilga uodega. Senesni archyvų įgars įrankiai, kai kurie spausdinimo RIP ir stebinantis skaičius verslo žiūryklių priima tik iki PDF 1.7, ir jos triksta ant antraštės, o ne ant ko nors, ką padarėte neteisingai. Prieš perjungdami patvirtinkite vartojančias sistemas ir atsiminkite, kad PDF/A-4 profilio parinkimas parenka PDF 2.0, nepaisant to, ar to prašėte
Saugu seka — laikyti PDF/A-3 dokumentams, kurie eina išorėn nežinomiems skaitytojams, naudoti PDF/A-4f vidiniams archyvams, kuriuose valdote įgarsą, ir taikyti PDF/UA-2 tik ten, kur prieinamumo politika jį įvardija. Jei pirmiausia dirbate su archyvavimo puse, PDF/A, PDF/X ir PDF/UA tikrinimo bei ZUGFeRD ir Factur-X hibridinių sąskaitų PDF/A-3 gidai padengia profilio parinktis, svarbias anksčiau už versijos numerį, o automatizuoto skrydžio prieš tai ataskaitų pastabos parodo, kaip verdiktą padaryti jūsų darbo eigos dalimi, o ne rankiniu žingsniu
HotPDF pristato visą PDF 2.0 autoravimo paviršių kaip natyvų VCL kodą, skirtą Delphi ir C++Builder, todėl PDF/A-4 ir PDF/UA-2 išvestis nereikalauja išorinio variklio ar perskirstomojo paketo — HotPDF komponento puslapyje išvardyti palaikomi profiliai ir RAD Studio versijos