Teknisk artikel

HotPDF Component: automated PDF preflight reports in 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 need repeatable PDF intake, release gates, or customer-support diagnostics. Den behandlar automated PDF preflight reports som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.

Den praktiska risken är att manual visual checks are inconsistent and do not create machine-readable evidence for operators, CI jobs, or support engineers. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.

Arkitekturbeslut

Turn preflight into a policy service. profiles for intake, release, archive, print, and accessibility checks / severity thresholds, waiver rules, and customer-specific exceptions

  • profiles for intake, release, archive, print, and accessibility checks
  • severity thresholds, waiver rules, and customer-specific exceptions
  • report formats for humans, CI logs, dashboards, and support bundles
  • time limits, maximum file size, and quarantine behavior for damaged input

Implementeringsflöde

Classify findings before deciding pass or fail. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.

  1. identify the business purpose before selecting the preflight profile
  2. run validation in an isolated step before editing or distributing the document
  3. normalize findings into stable codes, severities, locations, and remediation hints
  4. apply waiver policy after findings are classified, not before validation
  5. store the report beside the output or ticket that depends on it

Valideringsbevis

Report fields that make findings actionable. Behåll dessa fält tillsammans med utdata eller supportunderlaget.

  • profile version, input hash, validator version, elapsed time, and pass or fail result
  • finding code, severity, page, object reference, and operator-facing message
  • waiver identifier, reviewer, expiry, and affected issue codes
  • machine-readable summary for CI plus an HTML or text report for support

A report is only useful when it drives a decision

Preflight automation should map low-level PDF findings to product decisions. Operators need to know what failed, why it matters, whether retry is useful, and where the affected page or object can be inspected.

Decision table for automated PDF preflight reports

A decision table keeps product ownership visible when the same workflow is reused by a desktop tool, service job, and support utility.

DecisionEngineering reasonEvidence
profiles for intake, release, archive, print, and accessibility checksidentify the business purpose before selecting the preflight profileprofile version, input hash, validator version, elapsed time, and pass or fail result
severity thresholds, waiver rules, and customer-specific exceptionsrun validation in an isolated step before editing or distributing the documentfinding code, severity, page, object reference, and operator-facing message
report formats for humans, CI logs, dashboards, and support bundlesnormalize findings into stable codes, severities, locations, and remediation hintswaiver identifier, reviewer, expiry, and affected issue codes

Tekniska granskningsnoteringar för automated PDF preflight reports

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: profiles for intake, release, archive, print, and accessibility checks. Implementeringspresspunkt: run validation in an isolated step before editing or distributing the document. Acceptansbevis: waiver identifier, reviewer, expiry, and affected issue codes. Regressionsutlösare: support staff need stable issue codes rather than parser exception text
  • Beslut: severity thresholds, waiver rules, and customer-specific exceptions. Implementeringspresspunkt: normalize findings into stable codes, severities, locations, and remediation hints. Acceptansbevis: machine-readable summary for CI plus an HTML or text report for support. Regressionsutlösare: warnings can become release blockers when the target channel changes
  • Beslut: report formats for humans, CI logs, dashboards, and support bundles. Implementeringspresspunkt: apply waiver policy after findings are classified, not before validation. Acceptansbevis: profile version, input hash, validator version, elapsed time, and pass or fail result. Regressionsutlösare: batch preflight should limit memory and CPU per file to protect queues

Gränsfall

  • warnings can become release blockers when the target channel changes
  • batch preflight should limit memory and CPU per file to protect queues
  • repairing input before preflight can hide the original customer issue
  • support staff need stable issue codes rather than parser exception text

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 preflight, validation profile, report automation, severity, waiver, CI gate.

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 RunPreflightBatch(const InputFile, ReportFile: string);
var
  Pdf: THotPDF;
  Profile: THPDFPreflightProfile;
  Report: string;
begin
  Pdf := THotPDF.Create(nil);
  try
    Profile := Pdf.GetBuiltInPreflightProfile('strict');
    Report := Pdf.CreatePreflightReportWithProfile(InputFile, Profile);
    TFile.WriteAllText(ReportFile, Report, TEncoding.UTF8);
    RaiseIfBlockingFindings(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

function TriagePdf(Pdf: THotPDF; const FileName: string): Boolean;
var
  Handle, Pages: Integer;
begin
  Result := False;
  Handle := Pdf.DAOpenFileReadOnly(FileName, '');
  if Handle <= 0 then
    Exit;  // structurally unreadable: quarantine, do not validate
  try
    Pages := Pdf.DAGetPageCount(Handle);
    Result := Pages > 0;
  finally
    Pdf.DACloseFile(Handle);
  end;
end;
function RunVeraPdf(const PdfFile, ReportFile: string): Cardinal;
var
  Cmd: string;
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  Cmd := Format('cmd /c verapdf.bat --format xml "%s" > "%s"',
    [PdfFile, ReportFile]);
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  if not CreateProcess(nil, PChar(Cmd), nil, nil, False,
      CREATE_NO_WINDOW, nil, nil, SI, PI) then
    RaiseLastOSError;
  try
    WaitForSingleObject(PI.hProcess, 120000);  // bound the wait per file
    GetExitCodeProcess(PI.hProcess, Result);
  finally
    CloseHandle(PI.hThread);
    CloseHandle(PI.hProcess);
  end;
end;