Artikel Teknis

Contoh TextOut HotPDF Delphi: Font, Spasi, dan Ganti Halaman

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