Technisch artikel

HotPDF: report output with fonts and images in Delphi

Deze gelokaliseerde versie behandelt Delphi PDF Reports with HotPDF: TextOut, Fonts, and Images 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

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-0001.pdf';
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [fsBold], 16);
    Pdf.CurrentPage.TextOut(50, 792 - 50, 0, 'INVOICE');       // 50pt from top of Letter
    Pdf.CurrentPage.SetFont('Arial', [], 10);
    Pdf.CurrentPage.TextOut(50, 792 - 70, 0, 'Date: 2026-06-11');
    Pdf.CurrentPage.TextOut(300, 400, 45, 'COPY');              // rotated stamp
    Pdf.AddPage;                                                // CurrentPage now points here
    Pdf.CurrentPage.SetFont('Arial', [], 10);                   // font state does not carry over
    Pdf.CurrentPage.TextOut(50, 742, 0, 'Page 2 detail rows');
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;
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;

Controle vóór publicatie

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

Aanvullende codevoorbeelden

// 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;