Technisch artikel

PDFium: form-field navigation and viewer validation

Deze gelokaliseerde versie behandelt PDF Form Field Navigation in Delphi (PDFium Component) en gebruikt het bijgewerkte Engelse basisartikel als technische referentie voor teams rond Delphi, PDF en documentsoftware

De pagina zet de bijgewerkte basis om in concrete controlepunten voor ontwerp, implementatie en validatie

Wat uit de Engelse basis is gesynchroniseerd

Het basisartikel is uitgebreid met praktische context, technische keuzes en concrete voorbeelden, zodat deze pagina als werkgids dient en niet als korte samenvatting

Belangrijke punten in de bijgewerkte versie:

  • Gebruik eerst kleine reproduceerbare invoerbestanden
  • Laat productnamen, API-namen, bestandsnamen en literal waarden ongewijzigd
  • Bewaar validatoruitvoer en versiegegevens samen met het gegenereerde testbestand

Praktische implementatiekeuzes

Begin met het bestandstype, het verwachte resultaat en de foutstatus die de gebruiker moet zien. Koppel daarna elke API-aanroep aan een controleerbaar resultaat, zodat validatie, logging en support het klantenscenario kunnen reproduceren

  • Gebruik eerst kleine reproduceerbare invoerbestanden
  • Laat productnamen, API-namen, bestandsnamen en literal waarden ongewijzigd
  • Bewaar validatoruitvoer en versiegegevens samen met het gegenereerde testbestand

Code en API-punten

Codevoorbeelden blijven ongewijzigd zodat ontwikkelaars ze direct kunnen vergelijken met Delphi-, C++Builder- en Lazarus/FPC-projecten

Pdf.FileName := FormPath;
Pdf.FormFill := True;   // enable before Active; required for any field access
Pdf.Active := True;

case Pdf.FormType of
  ftNone:
    DisableFormPanel('This document has no interactive form');
  ftAcroForm:
    BuildFieldList;     // full field navigation and editing available
  ftXfaFull:
    ShowXfaNotice;      // XFA renders from its own XML template;
                        // treat field editing as limited
end;
procedure TFormViewer.HandleTabKey(Shift: TShiftState);
begin
  if ssShift in Shift then
    PdfView.FocusPreviousFormField
  else
    PdfView.FocusNextFormField;
  UpdateFieldStatus;  // e.g. "Field 4 of 17: InvoiceDate"
end;
procedure TFormViewer.FillAndSave(const Values: array of WString;
  const OutputPath: string);
var
  i: Integer;
begin
  for i := 0 to Pdf.FormFieldCount - 1 do
    Pdf.FormField[i] := Values[i];   // writes /V only

  // Rebuild the /AP appearance streams; without this the form
  // looks blank in Acrobat until each field is clicked
  Pdf.GenerateFormAppearances;

  Pdf.SaveAs(OutputPath);
end;

Controle vóór publicatie

Controleer het uitvoerbestand met dezelfde tools die de klant of het archief gebruikt. Noteer componentversie, testgegevens, validatorversie en waargenomen resultaat