HotPDF zapisuje natívne dokumenty PDF 2.0 z Delphi a C++Builder, vrátane troch archivačných profilov PDF/A-4 a prístupného výstupu PDF/UA-2 so štruktúrnymi elementmi v priestore názvov. Ich výber je vecou dvoch vlastností, no štandardy za týmito vlastnosťami sa zmenili viac, než naznačuje číslo verzie: PDF/A-4 zahodilo písmená zhody, ktoré sa všetci naučili s PDF/A-2, a PDF/UA-2 zaviedlo priestory názvov štruktúry, ktoré dokument časťi 1 nikdy nemal
Tento článok pokrýva, čo sa skutočne mení vo vygenerovanom súbore a ktoré chyby HotPDF mení na výnimku v EndDoc namiesto na dokument, ktorý zlyhá validáciou u zákazníka
Čím sa identifikácia PDF/A-4 líši od časti 2 a 3
PDF/A-4 sa identifikuje číslom časti a rokom revízie, bez písmena zhody pre základnú časť. Nastavte PDFACompliance na '4' a HotPDF emituje pdfaid:part=4 s pdfaid:rev=2020 a vôbec žiadnu položku pdfaid:conformance. Písmeno sa nestratilo — časť 4 nemá žiadne úrovne A/B/U, pretože požiadavky, ktoré ich kedysi oddeľovali, boli zlúčené do základnej časti
Dve rozšírenia si písmeno ponechávajú. '4E' vyberá PDF/A-4e pre inžinierske dokumenty a emituje zhodu E, ktorá povoľuje cesty 3D a RichMedia anotácií, ktoré ostatné profily zakazujú. '4F' vyberá PDF/A-4f a emituje zhodu F, ktorá povoľuje vložený súbor akéhokoľvek formátu. Všetky tri vynútia hlavičku PDF 2.0, vyžadujú si bežnú kontrolu výstupného zámeru a metadát PDF/A a zakazujú šifrovanie — šifrovaný archivačný súbor je rozpor, ktorý štandard nezvažuje
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ží súbor, postaví jeho FileSpec s /AFRelationship a zaregistruje ho v poli /AF katalógu aj v strome názvov EmbeddedFiles. Obe registrácie sú povinné; súbor uvedený iba v jednej z nich je najčastejšia príčina, prečo hybridná faktúra prejde rýchlou vizuálnou kontrolou a zlyhá skutočným validátorom. Reťazec vzťahu prijíma Source, Data, Alternative, Supplement alebo Unspecified a aktívny profil musí byť PDF/A-3, PDF/A-4e alebo PDF/A-4f — základný profil časti 4 neprípúšťa pridružené súbory. Starší názov AddPDFA3AssociatedFile stále funguje pre existujúci kód
Čo PDF/UA-2 vyžaduje a PDF/UA-1 nevyžadovalo
PDF/UA-2 vynúti PDF 2.0 a emituje pdfuaid:part=2 s pdfuaid:rev=2024 a zavádza priestory názvov do stromu štruktúry. Dokument časti 1 mal jednu plochú slovnú zásobu štandardných rolí. Dokument časti 2 môže niesť vlastné roly, pokiaľ každá z nich patrí do deklarovaného priestoru názvov, čo robí doménovo špecifické značenie zrozumiteľným pre asistívne technológie namiesto hádania
Dve metódy to implementujú. RegisterStructureNamespace vytvorí alebo zrecykluje nepriamy slovník /Type /Namespace a zaradí ho do StructTreeRoot /Namespaces, pričom vráti slovník, aby ste ho mohli znova použiť. AddStructureElementNS vytvorí štruktúrny element, ktorého položka /NS ukazuje na tento slovník, čo je to, čo povoľuje názov role mimo štandardnej množiny. Opakované volania s rovnakým URI znova použijú jeden slovník namiesto hromadenia duplikátov
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 nie je dekorácia. Značený dokument bez deklarovaného prirodzeného jazyka necháva čítačku obrazovky hádať výslovnosť a PDF/UA s tým zaobchádza ako s defektom a nie ako s voľbou
Ktoré chyby štruktúry zachytí EndDoc?
Štyri a každá zodpovedá dokumentu, ktorý by inak dorazil k validátoru poškodený. Koreň štruktúry musí obsahovať presne jeden element Document na najvyššej úrovni. Každý slovník priestoru názvov musí byť nepriamy, typovaný ako Namespace a nesie unikátne neprázdne URI. Každá referencia /NS štruktúrneho elementu musí vyriešiť na slovník skutočne uvedený v poli /Namespaces koreňa. A role bez priestoru názvov musí byť buď štandardnou rolou PDF 2.0, alebo sa vyriešiť cez RoleMap
Tieto sa spúšťajú v EndDoc, pretože to je posledný okamih, kedy existuje celý strom v pamäti, a prvý okamih, kedy je úplný. Ich zachytenie skôr by znamenalo odmietnutie platných medzistavov; ich zachytenie neskôr by znamenalo, že by sa nezachytili vôbec. Praktický dôsledok pre váš kód je, že chyba štruktúry sa objaví na konci generovania so správou pomenúvajúcou problém, namiesto toho, aby sa objavila o týždne neskôr ako veraPDF report, ktorý niekto prepošle od zákazníka
Role PDF 2.0, ktoré sa oplatí poznať
Typovaný enum rolí získava DocumentFragment, Aside, Title, FENote, Sub, Em, Strong a Artifact. Tri z nich menia spôsob, akým značíte bežné obchodné dokumenty. Aside konečne dáva bočným panelom a pull citátom domov, ktorý nie je zneužitým Sect. FENote označuje poznámky pod čiarou a koncové poznámky ako to, čím sú, takže čítačka ich môže ponúknuť namiesto toho, aby ich prelínala s telom textu. Em a Strong nahrádzajú sémantické hádanie, ktoré prichádzalo z tagovania dôrazu ako formátovania na úrovni span
Reťazcové preťaženie navyše prijíma otvorený tvar Hn, vrátane H7 a ďalej. PDF 1.7 sa zastavovalo pri H6, čo nútilo hlboké technické dokumenty sploštiť ich osnovu alebo znovu používať úrovne. Ak generujete štandardné dokumenty, právne kódexy alebo katalógy súčiastok, samotné to môže byť dôvod na presun výstupu na PDF 2.0
Čo skontrolovať pred prepnutím produkčného výstupu
PDF 2.0 je zmena hlavičky s dlhým chvostom. Staršie nástroje na archivačný ingest, niektoré tlačové RIP a prekvapivé množstvo biznis prehliadačov prijímajú iba do PDF 1.7 a zlyhávajú na hlavičke namiesto na čomkoľvek, čo ste urobili zle. Pred prepnutím potvrďte konzumujúce systémy a pamätajte, že výber profilu PDF/A-4 vyberá PDF 2.0 bez ohľadu na to, či ste o to stáli
Bezpečná postupnosť je ponechať PDF/A-3 pre dokumenty, ktoré smerujú von k neznámym čitateľom, použiť PDF/A-4f pre interné archívy, kde ovládate ingest, a prijať PDF/UA-2 iba tam, kde ho politika prístupnosti menovite uvádza. Ak sa najprv prebíjate archivačnou stránkou, návody k validácii PDF/A, PDF/X a PDF/UA a k hybridným faktúram ZUGFeRD a Factur-X na PDF/A-3 pokrývajú voľby profilu, na ktorých záleží skôr než na čísle verzie, a poznámky k automatizovanému preflight reportingu ukazujú, ako urobiť verdikt súčasťou vášho buildu namiesto manuálneho kroku
HotPDF dodáva celú autorizačnu plochu PDF 2.0 ako natívny VCL kód pre Delphi a C++Builder, takže výstup PDF/A-4 a PDF/UA-2 nepotrebuje žiadny externý engine ani redistribuovateľný balík — stránka HotPDF komponentu uvádza podporované profily a verzie RAD Studio