Кожна бібліотека PDF постачається з прикладом "hello world", і на версії для HotPDF варто зупинитися детальніше. Навіть найменша програма, яка виконує бодай щось, вже змушує прийняти два рішення, які ви будете повторювати в кожному наступному документі: який шрифт встановити та де на сторінці розмістити текст. Зробіть ці дві речі правильно, і решта API стане лише варіаціями на ту саму тему. Ось повний приклад - консольна програма, яка записує одну сторінку, вітаючи читача майже дюжиною мов:
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.

Це і є весь приклад. Конструкція 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 дозволяє системі вибирати гліфи для кожного рядка замість того, щоб прив'язувати все до однієї застарілої кодової сторінки. Разом із цією зручністю є два застереження. Шрифт має бути присутнім на машині, яка створює PDF, оскільки HotPDF вбудовує те, що операційна система знаходить за назвою; якщо Arial Unicode MS відсутній, Windows тихо підставить замінник, і ваш CJK-текст може перетворитися на порожні квадратики. Крім того, він не охоплює всі системи письма однаково: для письма справа наліво, як-от арабського чи івриту, або будь-чого, що потребує складної форми символів, вам доведеться використати спеціалізований шрифт, завантажений через RegisterUnicodeTTF, та відповідні функції для тексту справа наліво, але це вже окрема тема
Запустіть програму, і ви отримаєте файл HelloWorld.pdf у робочому каталозі: одна сторінка, кілька рядків багатомовного тексту, стиснення та вбудований шрифт. Очевидні наступні кроки - це надання тексту розміру, стилю та обертання, а також свідоме розміщення більше ніж одного блоку тексту. Обидві ці теми розглядаються у прикладі TextOut. Коли вам потрібно малювати лінії, прямокутники та зображення, а не лише текст, той самий об'єкт сторінки містить і ці виклики
Виклики TextOut, SetFont та методи документа, показані тут, є частиною HotPDF Component для Delphi та C++Builder