Lewati ke konten
getnextpdf.com

Teks, font, dan dasar-dasar halaman

Pada tutorial pertama, Anda merender sebuah halaman dengan satu baris teks. Kali ini Anda mengendalikan halaman itu sendiri beserta teks di dalamnya. Anda akan memilih ukuran halaman, menulis judul dan paragraf, lalu memberi gaya menggunakan font bawaan mesin.

Anda akan menulis dua skrip kecil. Masing-masing menghasilkan berkas Portable Document Format (PDF) satu halaman:

  • 01-text-basics.php merender halaman A4 potret dengan judul berwarna, paragraf yang dibungkus otomatis, dan tiga contoh perataan.
  • 02-fonts.php merender halaman contoh yang membandingkan dua keluarga font bawaan pada beberapa ukuran.

Semuanya berjalan hanya dengan paket nextpdf/core. Anda tidak memerlukan berkas font, ekstensi tambahan, maupun jaringan. Jika Anda belum menyiapkan proyek, ikuti tutorial pertama terlebih dahulu, lalu kembali ke sini.

Setiap halaman memiliki ukuran dan orientasi. A4 adalah ukuran kertas internasional yang umum, sedangkan Letter adalah padanannya di Amerika Serikat. Orientasi berupa potret (tegak) atau lanskap (menyamping). Anda meneruskan kedua pilihan itu ke addPage() saat memulai sebuah halaman.

Selanjutnya, tiga metode menangani penulisan. setFont() memilih jenis huruf dan ukuran untuk teks berikutnya. cell() menulis satu baris di dalam kotak tak terlihat. multiCell() membungkus teks yang lebih panjang ke sebanyak baris yang diperlukan. Pada kedua metode, lebar 0 berarti “gunakan seluruh ruang hingga margin kanan”.

Dua pemanggilan lain menangani tampilan. setTextColor() menerima nilai merah, hijau, dan biru dari 0 hingga 255, dan berlaku sampai Anda mengubahnya lagi. Enum Alignment, yaitu daftar pilihan bernama yang tetap, menyediakan Left, Center, Right, dan Justify.

Buat 01-text-basics.php di folder proyek Anda:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\Alignment;
use NextPDF\Contracts\Orientation;
use NextPDF\Core\Document;
use NextPDF\ValueObjects\PageSize;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('Text basics');
$document->addPage(PageSize::A4(), Orientation::Portrait);
// A colored heading. The values are red, green, and blue, each 0 to 255.
$document->setFont('helvetica', 'B', 20);
$document->setTextColor(30, 64, 175);
$document->cell(0, 14, 'Project kickoff notes', newLine: true);
$document->ln(4);
// Back to black for the body text.
$document->setTextColor(0, 0, 0);
$document->setFont('helvetica', '', 11);
$document->multiCell(
0,
7,
'Welcome to the second tutorial. This paragraph is written with '
. 'multiCell(), so the engine wraps the words onto as many lines '
. 'as the page width requires.',
);
$document->ln(4);
$document->multiCell(
0,
7,
'Justified text stretches the spaces so both edges line up. It is a '
. 'good fit for report bodies and other long passages.',
align: Alignment::Justify,
);
$document->ln(6);
// One line each: left, centered, and right.
$document->setFont('helvetica', 'I', 11);
$document->cell(0, 8, 'Left-aligned line', newLine: true, align: Alignment::Left);
$document->cell(0, 8, 'Centered line', newLine: true, align: Alignment::Center);
$document->cell(0, 8, 'Right-aligned line', newLine: true, align: Alignment::Right);
$document->save(__DIR__ . '/out/text-basics.pdf');
echo "Wrote out/text-basics.pdf\n";

Jalankan dengan php 01-text-basics.php. Skrip mencetak Wrote out/text-basics.pdf, dan berkasnya muncul di folder out/ yang baru.

addPage(PageSize::A4(), Orientation::Portrait) membuat halaman sebelum teks apa pun ditulis. Berikan Orientation::Landscape sebagai gantinya, maka halaman yang sama akan berputar menyamping. Ukuran bernama lain, seperti PageSize::A5() atau PageSize::Letter(), bekerja dengan cara yang sama.

setFont('helvetica', 'B', 20) memilih Helvetica tebal pada 20 poin. Poin (pt) adalah satuan cetak tradisional; 72 poin setara dengan satu inci. Judulnya berwarna biru karena setTextColor(30, 64, 175) sedang aktif ketika pemanggilan cell() menulisnya. setTextColor(0, 0, 0) berikutnya mengembalikan warna ke hitam untuk segala sesuatu setelahnya.

Kedua pemanggilan multiCell() membungkus paragrafnya secara otomatis. Yang rata kiri-kanan meregangkan jarak antarkata sehingga kedua sisi sejajar, kecuali pada baris terakhir paragraf. Di antara blok, ln() menggeser posisi tulis ke bawah untuk menambah ruang. Terakhir, save() menyusun berkas dan menuliskannya ke out/.

Untuk setiap parameter yang diterima metode-metode ini, lihat Menyusun teks dengan font dan perataan.

Mesin ini menyertakan tiga keluarga teks bawaan: Helvetica, Times, dan Courier. Helvetica adalah jenis huruf sans-serif, artinya hurufnya tidak memiliki goresan ujung kecil (serif). Times adalah jenis huruf serif yang nyaman dibaca pada teks panjang bergaya cetakan. Courier memiliki lebar tetap, sehingga cocok untuk daftar kode dan struk. Karena keluarga ini bawaan, skrip Anda tidak memerlukan berkas font sama sekali.

Argumen gaya pada setFont() menggabungkan tanda satu huruf: 'B' untuk tebal, 'I' untuk miring, dan 'U' untuk garis bawah. String kosong berarti reguler, dan tanda-tanda dapat digabung, sehingga 'BI' menghasilkan tebal miring.

Keluarga bawaan mencakup teks berbasis Latin. Untuk sistem penulisan lain atau jenis huruf merek Anda sendiri, Anda mendaftarkan berkas font, sebagaimana ditunjukkan oleh resep Menyematkan dan membuat subset font (pembuatan subset hanya menyimpan karakter yang benar-benar Anda gunakan, sehingga berkas tetap kecil). Matriks dukungan font mencantumkan setiap format font yang diterima mesin.

Buat 02-fonts.php di samping skrip pertama:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('Font sampler');
$document->addPage();
$document->setFont('helvetica', 'B', 20);
$document->cell(0, 14, 'Built-in font sampler', newLine: true);
$document->ln(4);
// Helvetica: a sans-serif face, a solid default for labels and headings.
$document->setFont('helvetica', 'B', 14);
$document->cell(0, 10, 'Helvetica', newLine: true);
foreach ([10, 12, 16] as $size) {
$document->setFont('helvetica', '', (float) $size);
$document->cell(0, $size * 0.8, "Helvetica sample at {$size}pt.", newLine: true);
}
$document->setFont('helvetica', 'BI', 12);
$document->cell(0, 9, 'Helvetica bold italic for emphasis.', newLine: true);
$document->ln(6);
// Times: a serif face that suits long, print-like passages.
$document->setFont('times', 'B', 14);
$document->cell(0, 10, 'Times', newLine: true);
foreach ([10, 12, 16] as $size) {
$document->setFont('times', '', (float) $size);
$document->cell(0, $size * 0.8, "Times sample at {$size}pt.", newLine: true);
}
$document->setFont('times', 'I', 12);
$document->cell(0, 9, 'Times italic for quotations.', newLine: true);
$document->save(__DIR__ . '/out/font-sampler.pdf');
echo "Wrote out/font-sampler.pdf\n";

Jalankan dengan php 02-fonts.php lalu buka out/font-sampler.pdf. Anda akan melihat kalimat contoh yang sama berubah karakter di antara kedua keluarga font dan membesar melalui tiga ukuran.

addPage() tanpa argumen menggunakan pengaturan halaman bawaan dalam orientasi potret, sehingga tidak setiap skrip harus menyebutkan ukurannya secara eksplisit. Setiap pemanggilan setFont() mengganti keluarga, gaya, atau ukuran yang aktif di tengah halaman, dan sebuah font tetap aktif sampai pemanggilan setFont() berikutnya.

Perulangan mengonversi ukuran dengan (float) karena setFont() mengharapkan bilangan desimal. Tinggi baris mengikuti ukuran font ($size * 0.8), sehingga teks yang lebih besar memperoleh baris yang lebih tinggi dan tidak ada yang saling tumpang tindih. Coba ganti 'times' dengan 'courier' lalu jalankan skrip lagi untuk melihat keluarga font ketiga.

  • Kesalahan “class not found” atau autoload biasanya berarti skrip tidak menemukan vendor/autoload.php. Jalankan di dalam folder proyek yang memuat vendor/.
  • Nama keluarga font yang salah ketik akan melempar eksepsi yang menyebutkan font yang tidak dapat ditemukan. Periksa ejaannya: helvetica, times, courier.
  • Pusat pemecahan masalah mengumpulkan perbaikan umum, dan Font dan penandaan membahas masalah font secara mendalam.
  • Setiap eksepsi mesin didokumentasikan di rujukan kesalahan, lengkap dengan konteks yang dibawanya dan tindakan pemulihannya.

Kini Anda dapat membentuk halaman, memberi gaya teks, dan memilih font dengan sengaja. Pada tutorial berikutnya Anda menempatkan gambar pada halaman dan menata konten dengan tabel dan daftar.