Jede PDF-Bibliothek liefert ein "Hello World" aus, und bei HotPDF lohnt es sich, hier etwas zu verweilen, denn das kleinste Programm, das überhaupt etwas tut, erzwingt bereits zwei Entscheidungen, die Sie danach in jedem Dokument wiederholen werden: welche Schriftart festgelegt wird und wo auf der Seite der Text landet. Wenn Sie diese beiden Aspekte richtig hinbekommen, ist der Rest der API nur Variation desselben Themas. Hier ist das Ganze, ein Konsolenprogramm, das eine einzelne Seite schreibt und den Leser in fast einem Dutzend Sprachen begrüßt:
program HelloWorld;
{$APPTYPE CONSOLE}
uses
Winapi.Windows, // for DEFAULT_CHARSET; on pre-XE2 Delphi use plain Windows
HPDFDoc; // HotPDF main unit
procedure CreateHelloWorld(const FileName: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.Compression := cmFlateDecode; // shrink the content streams
Pdf.FontEmbedding := True; // embed the face so it renders anywhere
Pdf.BeginDoc;
// One face covering many scripts. The 4th argument is the Windows charset;
// DEFAULT_CHARSET lets the system pick glyphs per string.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);
// TextOut measures from the BOTTOM-LEFT corner, in points, Y growing upward.
Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!'); // English
Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!'); // Spanish
Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!'); // German
Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!'); // French
Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!'); // Italian
Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!'); // Portuguese
Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // Russian
Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!'); // Japanese
Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!'); // Turkish
Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界'); // Chinese
Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!'); // Korean
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
begin
CreateHelloWorld('HelloWorld.pdf');
Writeln('Wrote HelloWorld.pdf');
end.

Das ist das gesamte Beispiel. THotPDF.Create(nil) gepaart mit try/finally ... Free ist das gewöhnliche Delphi-Ownership-Muster, und PDF ändert daran nichts. Was Aufmerksamkeit verdient, ist der vierstufige Aufbau im Inneren: Eigenschaften setzen, BeginDoc, Zeichnen, EndDoc. Die Reihenfolge ist nicht austauschbar
Dokumenteigenschaften vor BeginDoc setzen
BeginDoc ist der Moment, in dem HotPDF die Struktur des Dokuments festschreibt. Alles, was sich auf die gesamte Datei auswirkt, muss also vorher festgelegt werden. Compression := cmFlateDecode aktiviert FlateDecode für die Inhaltsstreams, was den Unterschied zwischen einer kompakten und einer unnötig aufgeblähten Datei ausmacht. FontEmbedding := True packt die von Ihnen verwendete Schriftart in die Datei, sodass sie auf einem Rechner, auf dem Arial Unicode MS noch nie installiert war, genauso aussieht wie auf Ihrem. Wenn Sie einen dieser Werte nach BeginDoc zuweisen, hat dies stillschweigend keinerlei Auswirkungen auf das bereits in Arbeit befindliche Dokument, ohne dass ein Fehler Sie warnt
SetFont, dann TextOut, und auf den Ursprung achten
Zwei Dinge an den Zeichenaufrufen lassen bei der ersten Seite jeden stolpern. Das erste ist die Reihenfolge: SetFont muss vor jedem TextOut ausgeführt werden, das davon abhängt, und es muss nach jedem AddPage wiederholt werden, da die aktuelle Schriftart einen Seitenumbruch nicht übersteht. Das zweite ist das Koordinatensystem. TextOut misst von der unteren linken Ecke der Seite, nicht von der oberen linken, wobei Y in Punkt (1/72 Zoll) nach oben wächst. Aus diesem Grund verlaufen die Linien hier von 760 abwärts, wobei jede Linie 30 Punkt unter der letzten liegt. Jeder, der von der Bildschirmgrafik kommt, geht vom Gegenteil aus und schreibt die erste Zeile geradewegs über den unteren Rand hinaus
Eine Schriftart, viele Skripte
Der Grund dafür, dass ein einziges SetFont Latein, Kyrillisch, Japanisch und Chinesisch auf derselben Seite übertragen kann, ist die Schriftart selbst: Arial Unicode MS bündelt Glyphen für fast jedes Skript in einer Datei. Das vierte Argument für SetFont ist der Windows-Zeichensatz, und die Übergabe von DEFAULT_CHARSET lässt das System die Glyphen pro Zeichenfolge auswählen, anstatt alles an eine veraltete Codepage zu binden. Mit diesem Komfort gehen zwei Vorbehalte einher. Die Schriftart muss auf dem Rechner vorhanden sein, der das PDF erstellt, da HotPDF alles einbettet, worin das Betriebssystem den Namen auflöst; Wenn Arial Unicode MS fehlt, tauscht Windows stillschweigend einen Ersatz ein und Ihr CJK-Text kann als leere Kästchen herauskommen. Und sie deckt nicht jedes Skript gleichermaßen ab: Für von rechts nach links geschriebene Sprachen wie Arabisch und Hebräisch oder für alles, was ein komplexes Shaping (Zeichenformung) erfordert, greift man zu einer speziellen Schriftart, die mit RegisterUnicodeTTF und den Aufrufen für Text von rechts nach links geladen wird, was ein Thema für sich ist
Wenn Sie es ausführen, erhalten Sie HelloWorld.pdf im Arbeitsverzeichnis: eine Seite, ein paar Zeilen mehrsprachiger Text, komprimiert, mit eingebetteter Schriftart. Die offensichtlichen nächsten Schritte bestehen darin, diesem Text Größe, Stil und Drehung zu geben und mehr als einen Textblock gezielt zu platzieren, was beides das TextOut-Beispiel durchgeht. Wenn Sie Linien, Boxen und Bilder anstelle von nur Text zeichnen möchten, enthält dasselbe Seitenobjekt auch diese Aufrufe
Die hier gezeigten Aufrufe TextOut, SetFont und Dokumentaufrufe sind Teil der HotPDF-Komponente für Delphi und C++Builder