Technický článek

Výstup PDF 2.0, PDF/A-4 a PDF/UA-2 s HotPDF v Delphi

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