Teknisk artikel

PDFlibPas: multi-engine PDF rendering in Delphi

losLab PDF Library ger Delphi- och C++Builder-team en PDF-motor med tillgänglig källkod för skrivbord, server, DLL, ActiveX och Dylib, med inbyggda PDF/A- och PDF/UA-kontroller, PAdES-signering och valbara renderare utan extern PDF-tjänst.

Den här artikeln är skriven för developers who need preview, printing, raster export, or fallback rendering across different document types. Den behandlar multi-engine PDF rendering som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.

Den praktiska risken är att multiple rendering engines can improve coverage, but without a selection policy they create inconsistent output and support disputes. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.

Arkitekturbeslut

Choose the renderer for a documented reason. primary and fallback engines for preview, print, thumbnail, and image export / DPI, antialiasing, color management, transparency, and annotation policy

  • primary and fallback engines for preview, print, thumbnail, and image export
  • DPI, antialiasing, color management, transparency, and annotation policy
  • how to compare engine output for support and regression testing
  • what to do when an engine fails on a damaged or unsupported page

Implementeringsflöde

Normalize rendering options across engines. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.

  1. select an engine based on operation type and document capability checks
  2. normalize page size, rotation, DPI, and annotation visibility before rendering
  3. capture engine-specific warnings and fallback reasons
  4. compare critical pages against reference images when output quality matters
  5. include renderer details in logs and support bundles

Valideringsbevis

Rendering evidence that explains differences. Behåll dessa fält tillsammans med utdata eller supportunderlaget.

  • engine name, version, operation type, page number, DPI, and render options
  • fallback reason, warnings, and page features that influenced selection
  • visual comparison metrics or reference-image approval for critical workflows
  • output dimensions, color mode, and elapsed render time

Fallback rendering should be visible

A multi-engine renderer should not silently switch behavior. The application should expose which engine rendered each page, why a fallback happened, and which options controlled DPI, annotations, transparency, and color.

Profile ownership and versioning

A named, versioned profile is easier to review than options scattered across forms, scripts, and batch parameters. It also makes support reports readable when customers use older templates or policies.

  • primary and fallback engines for preview, print, thumbnail, and image export
  • DPI, antialiasing, color management, transparency, and annotation policy
  • how to compare engine output for support and regression testing
  • what to do when an engine fails on a damaged or unsupported page
  • engine name, version, operation type, page number, DPI, and render options
  • fallback reason, warnings, and page features that influenced selection

Tekniska granskningsnoteringar för multi-engine PDF rendering

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: primary and fallback engines for preview, print, thumbnail, and image export. Implementeringspresspunkt: normalize page size, rotation, DPI, and annotation visibility before rendering. Acceptansbevis: visual comparison metrics or reference-image approval for critical workflows. Regressionsutlösare: visual differences need classification as acceptable, warning, or defect
  • Beslut: DPI, antialiasing, color management, transparency, and annotation policy. Implementeringspresspunkt: capture engine-specific warnings and fallback reasons. Acceptansbevis: output dimensions, color mode, and elapsed render time. Regressionsutlösare: annotations may render differently depending on engine and options

Gränsfall

  • annotations may render differently depending on engine and options
  • transparency and overprint behavior can affect print workflows
  • engine fallback should not bypass security or permission policy
  • visual differences need classification as acceptable, warning, or defect

Delphi / C++Builder notes

PDFlibPas 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 rendering engine, DPI, thumbnail, print preview, fallback, visual comparison.

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 RenderWithFallback(const InputFile, OutputPng: string; PageRef: Integer);
var
  Pdf: TPDFlib;
  FileHandle: Integer;
begin
  Pdf := TPDFlib.Create;
  try
    FileHandle := Pdf.DAOpenFileReadOnly(InputFile, '');
    try
      if Pdf.DARenderPageToFile(FileHandle, PageRef, 5, 300, OutputPng) <> 1 then
        RenderWithSecondaryEngine(InputFile, OutputPng, PageRef, Pdf.LastRenderError);
    finally
      Pdf.DACloseFile(FileHandle);
    end;
  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

PDFlibPas

Fler kodexempel

PDF.SetRenderScale(2.0);                    // every later render is doubled
PDF.RenderPageToFile(150, 1, 5, 'p1.png');  // effectively 300 DPI
PDF.SetRenderScale(1.0);                    // reset, or your thumbnails arrive huge
procedure RenderPageWithFallback(PDF: TPDFlib; Page: Integer; const OutFile: string);
begin
  PDF.SelectRenderer(1);                            // built-in first
  PDF.RenderPageToFile(200, Page, 5, OutFile);      // 5 = PNG
  if PDF.LastRenderError = '' then Exit;
  LogEngineFailure('built-in', Page, PDF.LastRenderError);
  if PDF.SelectRenderer(3) = 3 then                 // PDFium as the heavy fallback
  begin
    PDF.RenderPageToFile(200, Page, 5, OutFile);
    if PDF.LastRenderError = '' then Exit;
    LogEngineFailure('pdfium', Page, PDF.LastRenderError);
  end;
  raise Exception.CreateFmt('Page %d failed on all available engines', [Page]);
end;