Teknisk artikel

HotPDF: PDF/A-, PDF/X- och PDF/UA-validering i Delphi

HotPDF är ett nativt VCL PDF-bibliotek för Delphi- och C++Builder-program som behöver direkt PDF-skapande och redigering, formulär, annoteringar, kryptering, digitala signaturer, Unicode-teckensnitt, standardmedveten utdata och preflight-rapporter utan extern PDF-runtime

Den här artikeln är skriven för teams that deliver archival, print, or accessibility-sensitive PDF output from Delphi applications. Den behandlar PDF/A, PDF/X, and PDF/UA validation som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop

Den praktiska risken är att a document can pass a visual review while missing fonts, output intents, tagged structure, metadata, or accessibility semantics required by the target standard. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler

Arkitekturbeslut

Select the standard before generating pages. target profile and conformance level for each output channel / font embedding, color profile, metadata, and transparency policy

  • target profile and conformance level for each output channel
  • font embedding, color profile, metadata, and transparency policy
  • tagging, reading order, alternate text, and artifact treatment
  • whether validation warnings block release or require documented waivers

Implementeringsflöde

Use preflight findings as engineering requirements. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team

  1. select the compliance profile before creating the first page object
  2. configure fonts, images, color spaces, metadata, and tagging around that profile
  3. run preflight after generation and parse findings into actionable categories
  4. fix the document source instead of patching the PDF when the issue is template-owned
  5. save the validation report with the output package or support evidence

Valideringsbevis

Validation artifacts for release and support. Behåll dessa fält tillsammans med utdata eller supportunderlaget

  • profile name, validator version, pass or fail status, and issue severity counts
  • font, color, metadata, tag-structure, and annotation findings
  • waiver owner and business reason for every accepted warning
  • sample output opened in the target archive, print, or accessibility workflow

Compliance choices affect layout and content

PDF/A, PDF/X, and PDF/UA optimize for different guarantees. A single document may not satisfy every profile without tradeoffs in color management, interactivity, transparency, tagging, or embedded content

Operational metrics to watch

The first release should expose enough metrics to prove the workflow is healthy under real files, not only under curated samples

  • count and rate for profile name, validator version, pass or fail status, and issue severity counts
  • warning trend for interactive forms and JavaScript may conflict with archival profiles
  • latency of the stage that must select the compliance profile before creating the first page object
  • profile usage for target profile and conformance level for each output channel

Tekniska granskningsnoteringar för PDF/A, PDF/X, and PDF/UA validation

Använd dessa granskningsnoteringar för att säkerställa att funktionen har passerat demo-nivån och kan försvaras under leverans, support och kundeskalering

  • Beslut: target profile and conformance level for each output channel. Implementeringspresspunkt: configure fonts, images, color spaces, metadata, and tagging around that profile. Acceptansbevis: waiver owner and business reason for every accepted warning. Regressionsutlösare: third-party template assets often introduce fonts or transparency outside policy
  • Beslut: font embedding, color profile, metadata, and transparency policy. Implementeringspresspunkt: run preflight after generation and parse findings into actionable categories. Acceptansbevis: sample output opened in the target archive, print, or accessibility workflow. Regressionsutlösare: interactive forms and JavaScript may conflict with archival profiles

Gränsfall

  • interactive forms and JavaScript may conflict with archival profiles
  • print-ready color requirements do not automatically satisfy accessibility needs
  • tagged PDF repair late in the process is expensive and error-prone
  • third-party template assets often introduce fonts or transparency outside policy

Delphi / C++Builder notes

HotPDF Component should sit behind a small service boundary that receives files, streams, profiles, and credentials, then returns output paths, warnings, metrics, and validation status. Important terms include PDF/A, PDF/X, PDF/UA, preflight, output intent, tagged PDF

Delphi-kodexempel

Följande Delphi-skiss visar en praktisk servicegräns för detta ämne. Håll policykontroller, loggning och validering utanför det smala produktanropet så att arbetsflödet går att testa

procedure ExportStandardsAwarePdf(const OutputFile: string; const ProfileName: string);
var
  Pdf: THotPDF;
  Report: string;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := OutputFile;
    ConfigureStandardsProfile(Pdf, ProfileName);
    Pdf.BeginDoc;
    WriteTaggedContent(Pdf);
    Pdf.EndDoc;
    Report := Pdf.CreatePreflightReport(OutputFile);
    FailBuildOnPreflightErrors(Report);
  finally
    Pdf.Free;
  end;
end;

Produktionschecklista

  • Kör arbetsflödet på en tom fil, en normal kundfil och en värstafallfil
  • Öppna den genererade PDF-filen med rätt visare, validator, skrivare eller nedströmsapplikation
  • Logga produktversion, profilversion, inmatningshash, utdatasökväg, förfluten tid och antal varningar
  • Håll lösenord, certifikat, tillfälliga filer och kunddata under tydliga lagringsregler
  • Lägg till regressionsdokument när en kundfil avslöjar ett nytt gränsfall

Produktdokumentation

HotPDF Component

Fler kodexempel

Pdf.PDFXCompliance := 'X-1a';
Pdf.Trapped := 'Unknown';        // mandatory key under ISO 15930
ICC := TFileStream.Create('FOGRA39.icc', fmOpenRead);
try
  Pdf.AddPDFXOutputIntent('FOGRA39 (ISO 12647-2:2004)', '', ICC, 4, 'DeviceCMYK');
finally
  ICC.Free;
end;
Pdf.BeginDoc;
// draw with CMYK-safe colors, no transparency, no encryption
Pdf.EndDoc;
Pdf.PDFUACompliance := True;     // auto-enables tagged PDF
Pdf.Lang := 'en-US';             // set explicitly; empty falls back to 'en'
Pdf.BeginDoc;

Root := Pdf.AddStructureElement(sstDocument, nil);
H1 := Pdf.EmitTaggedHeading(1, Root, 50, 700, 'Quarterly Report');
Para := Pdf.BeginTaggedContent('P', Root);
Pdf.CurrentPage.TextOut(50, 650, 0, 'Revenue grew in all regions.');
Pdf.EndTaggedContent;

Pdf.EndDoc;