Denne lokaliserede version går direkte ind i Delphi PDF Reports with HotPDF: TextOut, Fonts, and Images og bruger den opdaterede engelske artikel som teknisk reference for Delphi-, PDF- og dokumentsoftwareteams
Siden omsætter den opdaterede basisartikel til konkrete kontrolpunkter for planlægning, implementering og validering
Hvad der blev synkroniseret fra den engelske artikel
Den engelske basisartikel er blevet udvidet med mere praktisk kontekst, konkrete beslutningspunkter og eksempler, så denne side skal læses som en arbejdsguide frem for en kort oversigt
Vigtige afsnit i den opdaterede basisartikel:
- Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
- Hold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil
Praktiske valg i implementationen
Start med den konkrete filtype, det ønskede output og den fejltilstand brugeren skal se. Bind derefter hvert API-kald til et kontrollerbart resultat, så validering, logning og support kan gentage kundens scenarie
- Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
- Hold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil
Kode og API-punkter
Kodeeksemplerne er bevaret uændret, fordi udviklere skal kunne sammenligne dem direkte med Delphi-, C++Builder- og Lazarus/FPC-projekter
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;Kontrol før udgivelse
Gennemgå outputfilen med samme værktøjer, som kunden eller arkivet bruger. Notér komponentversion, testdata, validatorversion og observeret resultat, så en senere regression kan spores præcist
Supplerende teknisk gennemgang
Denne udvidede sektion knytter an til artiklen Delphi PDF Reports with HotPDF: TextOut, Fonts, Images på dansk og uddyber den samme arbejdsgang fra et teams perspektiv, hvor beslutninger i generatoren, i valideringen og i den efterfølgende logning skal kunne spores senere. Den engelske kilde på den tilhørende side via hreflang viser, hvorfor det ikke er nok blot at oversætte overskrifterne; pointen er at forklare, hvorfor dokumentet først er færdigt, når regler, output og kontrolspor faktisk hænger sammen
I implementeringsartikler er det nyttigt at skille design fra verifikation. Først fastlægges filtypen, det forventede resultat og den fejltilstand, brugeren skal se, og derefter bindes hvert API-kald til et resultat, der kan afprøves i samme scenarie igen. Det gælder både PDF-arbejdsgange og regnearksfunktioner: kodeeksemplerne forbliver uændrede, men brødteksten skal forklare, hvorfor komponentversion, skabelon-id, inputdata og valideringsstatus bør logges sammen
Det er også vigtigt at bevare produktnavne, API-navne, filnavne og literalværdier præcist som i den engelske kilde. Det holder den fælles reference ramme for udvikling, support og kvalitetssikring og mindsker risikoen for, at den lokale version bare bliver en løs parafrase uden konkret teknisk substans. Hvis artiklen indeholder kode, skal kommentarerne og tokenerne stå urørte, fordi det netop er dem, der forbinder teksten med det virkelige projekt
Når siden læses efter publicering, hjælper det at tænke på den som en del af en sporbar kæde. En god valideringsnote beskriver, hvad der blev testet, hvilket værktøj der vurderede resultatet, hvilke versioner der var involveret, og hvor beviset for et match eller et afslag er gemt. Når en regression opstår senere, er det arkiverede rapportmateriale og den tilhørende inputfil langt mere værd end mindet om, at "det gik dengang"
For denne lokaliserede gren gælder derfor en enkel regel: behold de centrale beslutninger, verifikationspunkterne og kodekonteksten samlet, så artiklen ikke kun kan læses første gang, men også bruges ved senere fejlsøgning, audit og versionssammenligning. Det er forskellen mellem et kort sammendrag og et arbejdsdokument, der stadig har værdi efter flere udgivelser.
- Brug først små reproducerbare inputfiler
- Behold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem komponentversion, validatorresultat og inputdata sammen
- Bevar kodeblokke og kommentarer præcist som i kilden
Relateret læsning
- our article on complex script text shaping with HotPDF
- the HotPDF PDF/A, PDF/X, and PDF/UA guide
- HotPDF Component
Flere kodeeksempler
// 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;