每一套 PDF 函式庫都會提供一個 "hello world",而 HotPDF 的版本值得您放慢腳步來了解,因為這個最簡單、總算做了些事情的程式,已經迫使您做出兩個在往後每份文件中都會重複的決定:要設定哪種字型,以及文字要落在頁面上的哪個位置。把這兩件事弄對了,這組 API 剩下的部分不過都是這個主題的變奏。以下是完整程式碼,這是一支主控台 (console) 程式,它寫出了一個單一頁面,並以將近一打的語言向讀者問候:
program HelloWorld;
{$APPTYPE CONSOLE}
uses
Winapi.Windows, // 為了 DEFAULT_CHARSET;在 XE2 之前的 Delphi 請使用原生的 Windows
HPDFDoc; // HotPDF 主 unit
procedure CreateHelloWorld(const FileName: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.Compression := cmFlateDecode; // 縮小內容串流
Pdf.FontEmbedding := True; // 內嵌字體以使其在任何地方都能正常渲染
Pdf.BeginDoc;
// 單一字體涵蓋多種文字系統。第四個引數是 Windows 字元集;
// DEFAULT_CHARSET 讓系統針對每個字串去挑選字符。
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);
// TextOut 測量點從左下角開始,單位為點 (points),Y 軸向上遞增。
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.

這就是整個範例。THotPDF.Create(nil) 配上 try/finally ... Free 是標準的 Delphi 擁有權模式,在 PDF 裡也沒有改變。值得注意的是中間的四步主幹:設定屬性、BeginDoc、繪製、EndDoc。這個順序是不可互換的
在 BeginDoc 前設定文件屬性
BeginDoc 是 HotPDF 提交文件結構的時刻,所以任何影響整個檔案的設定都必須在它之前設定好。Compression := cmFlateDecode 會開啟內容串流的 FlateDecode 壓縮,這決定了檔案會是輕巧的,還是無謂肥大的。FontEmbedding := True 會將您繪製用的字型打包進檔案中,讓它在一台從未安裝過 Arial Unicode MS 的機器上,看起來跟在您的機器上一模一樣。如果您在 BeginDoc 之後才指派這兩者的任何一個,它會對已經開始建立的文件毫無作用,也不會發出任何錯誤警告
SetFont,接著 TextOut,並注意原點
關於繪製呼叫有兩件事會讓每個人在第一頁時卡關。第一件是順序:SetFont 必須在任何依賴它的 TextOut 之前執行,且在每次 AddPage 之後都必須重複,因為目前的字型不會在分頁後延續。第二件是座標系統。TextOut 是從頁面的左下角開始測量,而非左上角,並隨著向上移動而增加 Y 值,單位為點 (1/72 英寸)。這就是為什麼這裡的行是從 760 向下排列,每一行都在上一行的下方 30 點處。任何熟悉螢幕繪圖的人,都會有相反的假設,而把第一行直接寫到了下邊界之外
單一字型,多種文字系統
單一的 SetFont 能夠在同一頁承載拉丁語系、西里爾語系、日語與中文,原因就在於字體本身:Arial Unicode MS 把幾乎每一種文字系統的字符都打包進了一個檔案。SetFont 的第四個引數是 Windows 字元集,傳入 DEFAULT_CHARSET 可以讓系統針對每個字串去挑選字符,而不是將一切釘死在一個舊版的字碼頁 (code page) 上。伴隨這種便利性而來的是兩個注意事項。該字型必須存在於建立 PDF 的機器上,因為 HotPDF 會內嵌作業系統對該名稱所解析出的任何東西;如果遺失了 Arial Unicode MS,Windows 會默默換上替代品,而您的 CJK 文字可能會變成空心方塊。而且它無法平等地涵蓋所有文字系統:對於像阿拉伯文與希伯來文這類由右至左書寫的文字,或是任何需要複雜成形 (complex shaping) 的文字,您會需要使用透過 RegisterUnicodeTTF 載入專門的字型搭配由右至左的文字呼叫,而這又是另一個主題了
執行它後,您會在工作目錄下得到 HelloWorld.pdf:只有一頁、幾行多語系文字,經過壓縮,且字型已內嵌。明顯的下一步是為這些文字加上大小、樣式和旋轉,並刻意放置不只一個區塊的文字,而 TextOut 範例 探討了這兩個部分。當您想繪製線條、方塊和圖片,而不僅僅是文字時,同一個頁面物件也持有那些呼叫
此處展示的 TextOut、SetFont 與文件呼叫皆是 HotPDF 元件(適用於 Delphi 與 C++Builder)的一部分