Teknisk artikel

HotPDF: report output with fonts and images 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 developers generating invoices, statements, labels, and regulatory report packages from Delphi. Den behandlar report output with fonts and images som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.

Den praktiska risken är att reports often fail after deployment because fonts, image compression, DPI, pagination, and locale formatting differ from the developer machine. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.

Arkitekturbeslut

Make report assets part of the build contract. approved fonts, embedding mode, fallback policy, and license constraints / image scaling, compression, color profile, transparency, and DPI rules

  • approved fonts, embedding mode, fallback policy, and license constraints
  • image scaling, compression, color profile, transparency, and DPI rules
  • page size, margins, headers, footers, widow control, and overflow policy
  • locale-sensitive formatting for dates, numbers, currency, and addresses

Implementeringsflöde

Measure text and images with production resources. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.

  1. load template assets from a versioned location and validate availability first
  2. measure text with the same fonts that will be embedded in the final PDF
  3. normalize images before placing them so compression and DPI are predictable
  4. paginate with production margins and record overflow decisions
  5. compare representative output against approved reference PDFs

Valideringsbevis

Report diagnostics that reduce layout disputes. Behåll dessa fält tillsammans med utdata eller supportunderlaget.

  • template version, font list, embedded font status, image count, and compression mode
  • page count, overflow warnings, clipped object warnings, and fallback font usage
  • locale profile, currency format, and address layout used for the run
  • visual comparison result for high-value report templates

Template design and PDF generation must share assumptions

A reliable report pipeline owns its fonts, image processing, page boxes, number formats, and pagination rules. Treating those assets as external decoration makes the output unpredictable in service and customer environments.

Support package design

Once HotPDF Component is deployed, the most valuable support package is the one that explains the input, profile, output, and exact stage that failed.

  • template version, font list, embedded font status, image count, and compression mode
  • page count, overflow warnings, clipped object warnings, and fallback font usage
  • locale profile, currency format, and address layout used for the run
  • visual comparison result for high-value report templates
  • terminology snapshot: font embedding, image compression, DPI, pagination

Tekniska granskningsnoteringar för report output with fonts and images

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: approved fonts, embedding mode, fallback policy, and license constraints. Implementeringspresspunkt: measure text with the same fonts that will be embedded in the final PDF. Acceptansbevis: locale profile, currency format, and address layout used for the run. Regressionsutlösare: printer margins are not a reliable substitute for PDF page-box rules
  • Beslut: image scaling, compression, color profile, transparency, and DPI rules. Implementeringspresspunkt: normalize images before placing them so compression and DPI are predictable. Acceptansbevis: visual comparison result for high-value report templates. Regressionsutlösare: service accounts may not have the same fonts installed as developer desktops
  • Beslut: page size, margins, headers, footers, widow control, and overflow policy. Implementeringspresspunkt: paginate with production margins and record overflow decisions. Acceptansbevis: template version, font list, embedded font status, image count, and compression mode. Regressionsutlösare: transparent PNG assets can change file size or rendering across viewers
  • Beslut: locale-sensitive formatting for dates, numbers, currency, and addresses. Implementeringspresspunkt: compare representative output against approved reference PDFs. Acceptansbevis: page count, overflow warnings, clipped object warnings, and fallback font usage. Regressionsutlösare: long customer names and multilingual addresses expose measurement shortcuts

Gränsfall

  • service accounts may not have the same fonts installed as developer desktops
  • transparent PNG assets can change file size or rendering across viewers
  • long customer names and multilingual addresses expose measurement shortcuts
  • printer margins are not a reliable substitute for PDF page-box rules

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 font embedding, image compression, DPI, pagination, page box, report template.

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 RenderInvoicePdf(const OutputFile: string; const Invoice: TInvoice);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := OutputFile;
    Pdf.FontEmbedding := True;
    Pdf.BeginDoc;
    DrawInvoiceHeader(Pdf, Invoice);
    DrawLineItems(Pdf, Invoice.Items);
    DrawImageAssets(Pdf, Invoice.BrandAssets);
    Pdf.EndDoc;
  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

Pdf.RegisterUnicodeTTF('C:\ProgramData\MyApp\Fonts\NotoSans.ttf');
Pdf.CurrentPage.SetFont('NotoSans', [], 12);
Pdf.CurrentPage.TextOut(50, 700, 0, WideString('Łódź — Ünïcode test ✓'));
var
  Png: TPngImage;
  Logo: TBitmap;
  LogoIdx: Integer;
begin
  Png := TPngImage.Create;
  Logo := TBitmap.Create;
  try
    Png.LoadFromFile('brand-logo.png');
    Logo.Assign(Png);                       // decode PNG to a bitmap
    LogoIdx := Pdf.AddImage(Logo, icFlate); // lossless for flat-color art
  finally
    Logo.Free;
    Png.Free;
  end;
  // (Index, X, Y, Width, Height, Angle) — not (X1, Y1, X2, Y2)
  Pdf.CurrentPage.ShowImage(LogoIdx, 50, 700, 120, 40, 0);
end;
// Horizontal rule under the table header
Pdf.CurrentPage.SetLineWidth(0.75);
Pdf.CurrentPage.MoveTo(50, 660);
Pdf.CurrentPage.LineTo(545, 660);
Pdf.CurrentPage.Stroke;

// Shaded totals box: X, Y, width, height
Pdf.CurrentPage.SetRGBFillColor(RGB(235, 235, 235));
Pdf.CurrentPage.Rectangle(395, 120, 150, 40);
Pdf.CurrentPage.Fill;