Integrera PDFium VCL Component-flöden i Delphi- och C++Builder-applikationer, eller PDFium LCL Component-flöden i Lazarus/FPC, med källkodskomponenter för visning, rendering, formulär, utskrift, preflight-rapporter och standardinriktad validering.
Den här artikeln är skriven för developers building PDF data-entry viewers where users need to complete forms accurately. Den behandlar form-field navigation and viewer validation som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.
Den praktiska risken är att users can tab through a form and still submit incorrect or invisible data if field focus, required-state display, export values, and calculated fields are not coordinated. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.
Arkitekturbeslut
Make field navigation a first-class viewer feature. tab order, required-field markers, and skip rules for hidden or read-only fields / value conversion for checkboxes, radio groups, combo boxes, and date fields
- tab order, required-field markers, and skip rules for hidden or read-only fields
- value conversion for checkboxes, radio groups, combo boxes, and date fields
- calculation timing and whether scripts are supported, ignored, or blocked
- how invalid fields are highlighted, listed, and returned to the user
Implementeringsflöde
Build a form index before user interaction. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.
- scan fields and widgets into a navigation index when the document opens
- connect keyboard traversal, mouse selection, and side-panel selection to the same index
- validate current values before page changes, save, export, or submission
- show field-specific messages that reference the document location and rule
- record validation outcomes for support when users report submission failures
Valideringsbevis
Validation signals users and support can understand. Behåll dessa fält tillsammans med utdata eller supportunderlaget.
- field name, type, page, widget bounds, required flag, and current export value
- navigation order and skipped field reasons
- validation rule, failing value, message shown to the user, and time of check
- calculated-field dependencies and whether scripts were allowed
A field is not only a rectangle
A viewer-side form workflow needs field identity, widget geometry, page location, validation messages, current value, export value, and focus behavior. That model should drive both UI navigation and diagnostics.
Review questions before release
Before this reaches production, the team should be able to answer these questions without reading source code.
- Who owns tab order, required-field markers, and skip rules for hidden or read-only fields?
- What evidence proves field name, type, page, widget bounds, required flag, and current export value?
- What happens when radio button groups often share one field name across several widgets?
- Which regression file covers record validation outcomes for support when users report submission failures?
Tekniska granskningsnoteringar för form-field navigation and viewer 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: tab order, required-field markers, and skip rules for hidden or read-only fields. Implementeringspresspunkt: connect keyboard traversal, mouse selection, and side-panel selection to the same index. Acceptansbevis: validation rule, failing value, message shown to the user, and time of check. Regressionsutlösare: calculated values can become stale when editing jumps across pages
- Beslut: value conversion for checkboxes, radio groups, combo boxes, and date fields. Implementeringspresspunkt: validate current values before page changes, save, export, or submission. Acceptansbevis: calculated-field dependencies and whether scripts were allowed. Regressionsutlösare: radio button groups often share one field name across several widgets
Gränsfall
- radio button groups often share one field name across several widgets
- required fields hidden by logic still need a policy decision
- date and number formatting should match the document, not only the OS locale
- calculated values can become stale when editing jumps across pages
Delphi / C++Builder notes
PDFium 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 form field, tab order, widget, export value, validation, calculated field.
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 TFormHost.BuildFieldNavigation(const FileName: string);
begin
PdfView.LoadFromFile(FileName);
FFields := ExtractInteractiveFields(PdfView);
FFields.SortByPageAndBounds;
ValidateRequiredFieldNames(FFields);
FocusFirstEditableField;
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
Fler kodexempel
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;