Prosedur TextOut di HotPDF adalah cara paling langsung untuk menempatkan teks di halaman PDF. Tidak seperti penggambaran teks layar GDI di mana Anda memberikan titik kiri-atas glif, HotPDF mengukur dari sudut kiri-bawah halaman, dengan Y bertambah ke atas. Tanda tangan penuhnya adalah:
procedure TextOut(
X, Y: Double; // kiri-bawah dari baseline teks
Angle: Double; // rotasi dalam derajat (searah jarum jam)
const Text: string
);
Signature yang perlu diingat adalah X dan Y bertipe Single dalam satuan poin, angle bertipe Extended dalam derajat, dan Text bertipe WideString. Overload dengan PWORD serta panjang eksplisit berguna ketika data glyph sudah diterima dari API lain
Contoh dasar
PDF.BeginDoc;
PDF.CurrentPage.SetFont('Times New Roman', [fsBold], 14);
PDF.CurrentPage.TextOut(72, 700, 0, 'Laporan Penjualan Q3');
PDF.CurrentPage.SetFont('Arial', [], 11);
PDF.CurrentPage.TextOut(72, 680, 0, 'Dibuat: 15 Juli 2026');
PDF.EndDoc;
Koordinat 72, 700 menempatkan teks satu inci dari kiri dan kira-kira satu inci dari atas pada halaman letter 8,5 × 11 inci (612 × 792 poin)
SetFont
SetFont menerima nama font, set style, dan ukuran dalam poin. Set style adalah himpunan TFontStyle: fsBold, fsItalic, fsUnderline, fsStrikeOut. Set kosong [] berarti regular. Pemanggilan SetFont berlaku untuk semua panggilan TextOut berikutnya pada halaman yang sama hingga SetFont berikutnya dipanggil
PDF.CurrentPage.SetFont('Arial', [fsBold, fsItalic], 12);
Teks rotasi
Parameter ketiga TextOut memutar teks searah jarum jam dalam derajat. 0 adalah horizontal. 90 adalah vertikal dari bawah ke atas. 270 adalah vertikal dari atas ke bawah:
// Header kolom vertikal
PDF.CurrentPage.SetFont('Arial', [fsBold], 9);
PDF.CurrentPage.TextOut(30, 500, 90, 'Pendapatan (juta IDR)');
Spasi karakter dan kata
SetCharacterSpacing menambahkan ruang ekstra antara setiap pasangan glif dalam poin. Nilai positif meregangkan teks; nilai negatif memampatkannya. Berguna untuk header label sempit atau teks yang perlu mengisi lebar kolom yang tetap:
PDF.CurrentPage.SetCharacterSpacing(1.5);
PDF.CurrentPage.TextOut(72, 650, 0, 'JUDUL BAGIAN');
PDF.CurrentPage.SetCharacterSpacing(0); // reset
SetWordSpacing bekerja secara analog tetapi hanya memengaruhi karakter spasi. Berguna untuk justifikasi baris individu pada dokumen yang tata letaknya ditentukan kode:
PDF.CurrentPage.SetWordSpacing(4.0);
PDF.CurrentPage.TextOut(72, 600, 0, 'Baris teks yang tersebar rata di lebar kolom');
PDF.CurrentPage.SetWordSpacing(0);
Penanganan ganti halaman
HotPDF tidak melakukan word-wrap atau flow teks secara otomatis. Anda melacak Y saat ini dan menambahkan halaman ketika posisi jatuh di bawah batas bawah yang Anda tentukan:
const
MarginBottom = 72; // 1 inci dari bawah
LineHeight = 14; // dalam poin
MarginLeft = 72;
MarginTop = 720; // mulai di sini
var
CurY: Double;
I: Integer;
Lines: TStringList;
begin
CurY := MarginTop;
PDF.BeginDoc;
PDF.CurrentPage.SetFont('Arial', [], 11);
for I := 0 to Lines.Count - 1 do
begin
if CurY < MarginBottom then
begin
PDF.AddPage;
PDF.CurrentPage.SetFont('Arial', [], 11);
CurY := MarginTop;
end;
PDF.CurrentPage.TextOut(MarginLeft, CurY, 0, Lines[I]);
CurY := CurY - LineHeight;
end;
PDF.EndDoc;
end;
Pola ini mudah diperluas: tambahkan tinggi baris berbeda untuk paragraf berbeda, sisipkan tanda baca halaman, atau ubah font mid-loop dengan memanggil SetFont kembali sebelum TextOut. State font tidak terbawa secara otomatis ke halaman baru, itulah mengapa panggilan SetFont di dalam blok halaman baru diperlukan
Mengukur lebar teks
Untuk meratakan kanan atau menempatkan teks secara horizontal berdasarkan lebarnya, gunakan GetTextWidth sebelum memanggil TextOut:
var
TW: Double;
begin
PDF.CurrentPage.SetFont('Arial', [fsBold], 12);
TW := PDF.CurrentPage.GetTextWidth('Total: 1.250.000');
// rata kanan di kolom yang berakhir di X=540
PDF.CurrentPage.TextOut(540 - TW, CurY, 0, 'Total: 1.250.000');
end;
GetTextWidth mengembalikan lebar dalam poin untuk font dan ukuran yang saat ini aktif, termasuk setiap spasi karakter yang ditetapkan melalui SetCharacterSpacing