Teknisk artikel

HotPDF: XFA, AcroForm och beslut om utplaning 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 receiving mixed form documents that must be archived, reviewed, or converted by a Delphi workflow. Den behandlar XFA, AcroForm, and flattening decisions som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.

Den praktiska risken är att dynamic XFA, static XFA, and AcroForm fields behave differently, so a naive flattening step can lose values or preserve hidden state unexpectedly. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.

Arkitekturbeslut

Identify the form technology before changing it. how to classify AcroForm, static XFA, dynamic XFA, and hybrid forms / whether unsupported dynamic behavior blocks processing or creates a warning

  • how to classify AcroForm, static XFA, dynamic XFA, and hybrid forms
  • whether unsupported dynamic behavior blocks processing or creates a warning
  • appearance refresh policy for changed values and calculated fields
  • retention of original form data after a flattened archive copy is produced

Implementeringsflöde

Refresh visible appearances before flattening. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.

  1. inspect the document catalog and form dictionaries before loading values
  2. classify the form model and choose a profile that matches the business goal
  3. apply values, refresh appearances, and validate required fields
  4. flatten only the fields approved by policy and verify remaining interactivity
  5. save the classification and flattening result in the support report

Valideringsbevis

Flattening evidence for auditors and support. Behåll dessa fält tillsammans med utdata eller supportunderlaget.

  • form model classification, field count, XFA presence, and unsupported feature list
  • appearance refresh status for every field changed by the workflow
  • flattened field count, remaining interactive field count, and output hash
  • side-by-side viewer result for at least one customer-like form

Flattening is a finalization step

Flattening should happen only after the workflow knows which form model owns the value, which appearance is authoritative, and whether the resulting PDF must remain interactive or become a static record.

Regression files worth keeping

Keep more than successful samples. A useful XFA, AcroForm, and flattening decisions regression set contains normal files, boundary files, and intentional failure files so the behavior is stable across releases.

  • dynamic XFA forms may depend on behavior outside normal AcroForm processing
  • hidden fields can contain values that should not appear in a flattened copy
  • flattening invalid values can make correction impossible for downstream users
  • different viewers may choose different appearances when streams are stale
  • inspect the document catalog and form dictionaries before loading values
  • classify the form model and choose a profile that matches the business goal

Tekniska granskningsnoteringar för XFA, AcroForm, and flattening decisions

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: how to classify AcroForm, static XFA, dynamic XFA, and hybrid forms. Implementeringspresspunkt: classify the form model and choose a profile that matches the business goal. Acceptansbevis: flattened field count, remaining interactive field count, and output hash. Regressionsutlösare: different viewers may choose different appearances when streams are stale
  • Beslut: whether unsupported dynamic behavior blocks processing or creates a warning. Implementeringspresspunkt: apply values, refresh appearances, and validate required fields. Acceptansbevis: side-by-side viewer result for at least one customer-like form. Regressionsutlösare: dynamic XFA forms may depend on behavior outside normal AcroForm processing
  • Beslut: appearance refresh policy for changed values and calculated fields. Implementeringspresspunkt: flatten only the fields approved by policy and verify remaining interactivity. Acceptansbevis: form model classification, field count, XFA presence, and unsupported feature list. Regressionsutlösare: hidden fields can contain values that should not appear in a flattened copy
  • Beslut: retention of original form data after a flattened archive copy is produced. Implementeringspresspunkt: save the classification and flattening result in the support report. Acceptansbevis: appearance refresh status for every field changed by the workflow. Regressionsutlösare: flattening invalid values can make correction impossible for downstream users
  • Beslut: how to classify AcroForm, static XFA, dynamic XFA, and hybrid forms. Implementeringspresspunkt: inspect the document catalog and form dictionaries before loading values. Acceptansbevis: flattened field count, remaining interactive field count, and output hash. Regressionsutlösare: different viewers may choose different appearances when streams are stale

Gränsfall

  • dynamic XFA forms may depend on behavior outside normal AcroForm processing
  • hidden fields can contain values that should not appear in a flattened copy
  • flattening invalid values can make correction impossible for downstream users
  • different viewers may choose different appearances when streams are stale

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 XFA, AcroForm, flattening, appearance stream, field value, archive copy.

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 FlattenIncomingForm(const InputFile, OutputFile: string; const Policy: TFormPolicy);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    LoadCustomerForm(Pdf, InputFile);
    NormalizeXfaPackets(Pdf, Policy);
    FlattenVisibleAcroFormFields(Pdf);
    SaveFlattenedCopy(Pdf, OutputFile);
    VerifyNoEditableFields(OutputFile);
  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

XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
// Lock the value at field creation: read-only text field
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
  Rect(50, 700, 220, 720), 0, [ffReadOnly]);

// Belt and suspenders: restrict form filling document-wide
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// fill permission withheld: prFillAnnotations is absent from the set