HotPDF zapisuje z Delphi a C++Builder nativní dokumenty PDF 2.0, včetně tří archivačních profilů PDF/A-4 a přístupného výstupu PDF/UA-2 se jmennými prostory prvků struktury. Vybrat je záležitost dvou vlastností, ale standardy za těmito vlastnostmi se změnily víc, než číslo verze napovídá: PDF/A-4 upustilo shodová písmena, která se všichni naučili u PDF/A-2, a PDF/UA-2 zavedlo jmenné prostory struktury, které dokument části 1 nikdy neměl
Tento článek rozebírá, co se ve výsledném souboru skutečně mění a které chyby HotPDF promění ve výjimku při EndDoc místo aby z nich udělal dokument, který selže v validaci až u zákazníka
V čem se identifikace PDF/A-4 liší od části 2 a 3
PDF/A-4 se identifikuje číslem části a rokem revize, bez shodového písmene pro základní část. Nastavte PDFACompliance na '4' a HotPDF emituje pdfaid:part=4 s pdfaid:rev=2020 a bez jakékoliv položky pdfaid:conformance. Písmeno se neztratilo — část 4 nemá úrovně A/B/U, protože požadavky, které je dříve oddělovaly, byly vtěleny do základní části
Dvě rozšíření si písmeno ponechávají. '4E' vybírá PDF/A-4e pro inženýrské dokumenty a emituje shodu E, která povoluje cesty 3D a RichMedia anotací, jež ostatní profily zakazují. '4F' vybírá PDF/A-4f a emituje shodu F, která povoluje vložený soubor libovolného formátu. Všechny tři vynucují hlavičku PDF 2.0, vyžadují obvyklé kontroly output intent a metadat PDF/A a zakazují šifrování — šifrovaný archivační soubor je rozpor, který standard nepřipouští
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 vloží soubor, postaví jeho FileSpec s /AFRelationship a zaregistruje ho jak v poli /AF katalogu, tak ve stromu jmen EmbeddedFiles. Obě registrace jsou povinné; soubor uvedený jen v jedné z nich je nejčastější jedinou příčinou toho, že hybridní faktura projde rychlým okem a selhá u skutečného validátoru. Řetězec vztahu přijímá Source, Data, Alternative, Supplement nebo Unspecified a aktivní profil musí být PDF/A-3, PDF/A-4e nebo PDF/A-4f — základní profil části 4 asociované soubory nepřipouští. Starší název AddPDFA3AssociatedFile stále funguje pro existující kód
Co PDF/UA-2 vyžaduje a PDF/UA-1 ne
PDF/UA-2 vynucuje PDF 2.0 a emituje pdfuaid:part=2 s pdfuaid:rev=2024 a zavádí jmenné prostory do stromu struktury. Dokument části 1 měl jednu plochou slovní zásobu standardních rolí. Dokument části 2 může nést vlastní role, pokud každá patří do deklarovaného jmenného prostoru, což dělá doménově specifické značkování srozumitelným pro asistivní technologie místo hádání
Implementují to dvě metody. RegisterStructureNamespace vytváří nebo znovuvyužívá nepřímý slovník /Type /Namespace a uvádí ho v StructTreeRoot /Namespaces, přičemž vrací slovník, abyste ho mohli použít znovu. AddStructureElementNS vytváří prvek struktury, jehož položka /NS ukazuje na tento slovník, což je to, co licencuje název role mimo standardní sadu. Opakované volání se stejným URI znovuvyužívá jeden slovník místo aby hromadilo duplicity
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 zde není dekorace. Značkovaný dokument bez deklarovaného přirozeného jazyka nechává screen reader hádat výslovnost a PDF/UA s touto výpustí zachází jako s vadou, nikoli s preferencí
Které chyby struktury EndDoc zachytí?
Čtyři a každá odpovídá dokumentu, který by jinak dorazil k validátoru rozbitý. Kořen struktury musí obsahovat přesně jeden top-level prvek Document. Každý slovník jmenného prostoru musí být nepřímý, typován jako Namespace a nést unikátní neprázdné URI. Každý odkaz /NS prvku struktury musí vyústit ke slovníku skutečně uvedenému v poli /Namespaces kořene. A role bez jmenného prostoru musí být standardní rolí PDF 2.0 nebo vyřešena přes RoleMap
Tyto kontroly běží při EndDoc, protože to je poslední okamžik, kdy celý strom existuje v paměti, a první, kdy je úplný. Zachytit je dříve by znamenalo odmítnout platné mezistavy; zachytit je později by znamenalo nezachytit je vůbec. Praktický důsledek pro váš kód je, že se chyba struktury objeví na konci generování se zprávou, která pojmenuje problém, místo aby se objevila o týdny později jako veraPDF report, který někdo přepošle od zákazníka
Role PDF 2.0, které stojí za to znát
Typový enum rolí získává DocumentFragment, Aside, Title, FENote, Sub, Em, Strong a Artifact. Tři z nich mění způsob, jakým značkujete běžné obchodní dokumenty. Aside konečně dává postranním panelům a pull quotes domov, který není zneužitým Sect. FENote označuje poznámky pod čarou a koncové poznámky tak, jaké jsou, takže čtečka je může nabídnout místo aby je prokládala s tělem textu. Em a Strong nahrazují sémantické hádání, které pramenilo ze značkování důrazu jako formátování na úrovni span
Řetězcové přetížení navíc přijímá otevřenou formu Hn, včetně H7 a výše. PDF 1.7 končilo u H6, což nutilo hluboké technické dokumenty zploštit osnovu nebo znovupoužívat úrovně. Pokud generujete standardy, právní předpisy nebo katalogy dílů, může to být samo o sobě důvod k přechodu výstupu na PDF 2.0
Co zkontrolovat před přepnutím produkčního výstupu
PDF 2.0 je změna hlavičky s dlouhým ocasem. Starší nástroje pro ingest do archivu, některé tiskové RIPy a překvapivé množství line-of-business prohlížečů přijímají jen do PDF 1.7 a selžou na hlavičce spíše než na něčem, co jste udělali špatně. Před přepnutím ověřte konzumující systémy a pamatujte, že výběr profilu PDF/A-4 volí PDF 2.0 bez ohledu na to, jestli jste o to stáli
Bezpečné pořadí je: ponechat PDF/A-3 pro dokumenty, které míří ven k neznámým čtenářům, používat PDF/A-4f pro interní archivy, kde ingest řídíte vy, a přijmout PDF/UA-2 jen tam, kde to accessibility politika vyjmenuje. Pokud se nejprve prokousáváte archivační stranou, průvodci validací PDF/A, PDF/X a PDF/UA a hybridními fakturami ZUGFeRD a Factur-X na PDF/A-3 pokrývají volby profilu, na kterých záleží dříve než na čísle verze, a poznámky k automatizaci preflight reportingu ukazují, jak verdict udělat součástí buildu místo ručního kroku
HotPDF dodává celou authoring plochu PDF 2.0 jako nativní VCL kód pro Delphi a C++Builder, takže výstup PDF/A-4 a PDF/UA-2 nepotřebuje externí engine ani redistribuovatelný balíček — stránka komponenty HotPDF uvádí podporované profily a verze RAD Studio