Lewati ke konten
getnextpdf.com

Header, footer, dan dokumen multi-halaman

Satu halaman jarang cukup. Dalam tutorial ini Anda menulis dokumen yang tumbuh menjadi tiga halaman dengan sendirinya. Anda juga memberi setiap halaman header berulang dan footer yang menampilkan nomor halaman.

Anda akan menulis satu skrip, 01-multipage.php. Skrip ini menghasilkan jurnal perjalanan tiga halaman sebagai berkas PDF (Portable Document Format):

  • Entri jurnal mengalir dari halaman ke halaman secara otomatis. Anda tidak pernah menentukan di mana sebuah halaman berakhir; mesin yang memutuskan.
  • Header adalah bilah di bagian atas halaman yang berulang pada setiap halaman. Header Anda menampilkan judul dokumen.
  • Footer adalah bilah serupa di bagian bawah. Footer Anda menampilkan nomor halaman sebagai 1 / 3, 2 / 3, dan 3 / 3.

Semuanya berjalan hanya dengan paket nextpdf/core: tanpa berkas font, tanpa ekstensi tambahan, dan tanpa jaringan.

Dua gagasan melakukan seluruh pekerjaan dalam skrip ini.

Yang pertama adalah pemutus halaman otomatis (automatic page break). Saat mesin menulis teks, ia melacak sebuah kursor: titik pada halaman tempat baris berikutnya akan diletakkan. setAutoPageBreak(true, margin: 25) memberi tahu mesin untuk mengawasi kursor tersebut. Ketika kursor berada dalam jarak 25 poin (sekitar sepertiga inci) dari tepi bawah, mesin menutup halaman dan memulai halaman baru.

Yang kedua adalah perabot halaman: header dan footer. Anda menjelaskannya sekali saja, sebelum halaman pertama. setHeaderData() mencatat judul dan deskripsi singkat untuk bilah atas. Panggilan font dan margin memilih jenis huruf serta jarak dari tepi halaman. Mesin kemudian menggambar perabot ini pada setiap halaman yang dibuatnya, termasuk halaman yang ditambahkannya sendiri.

Buat 01-multipage.php di folder proyek Anda:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// Make sure the output folder exists next to this script.
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('NextPDF Travel Journal');
// Configure the header and footer BEFORE the first page.
// The engine repeats them on every page for you.
$document->setHeaderData(title: 'NextPDF Travel Journal', description: 'A multi-page tutorial document');
$document->setHeaderFont('helvetica', 10);
$document->setHeaderMargin(5);
$document->setFooterFont('helvetica', 8);
$document->setFooterMargin(10);
// Turn on automatic page breaks. When the text cursor gets within
// 25 points of the bottom edge, the engine starts a new page.
$document->setAutoPageBreak(true, margin: 25);
$document->addPage();
$document->setFont('helvetica', 'B', 18);
$document->cell(0, 12, 'Travel journal: three days on the coast', newLine: true);
$document->ln(5);
$days = [
1 => 'We followed the shoreline north and counted seventeen lighthouses.',
2 => 'Rain moved in before noon, so we sketched the harbor from a cafe window.',
3 => 'On the last morning the fog lifted and the whole bay turned silver.',
];
foreach ($days as $day => $highlight) {
$document->setFont('helvetica', 'B', 14);
$document->cell(0, 10, "Day {$day}", newLine: true);
$document->setFont('helvetica', '', 11);
for ($entry = 1; $entry <= 12; $entry++) {
$text = "Entry {$entry} of day {$day}. {$highlight} "
. 'The trail hugged the cliffs for most of the afternoon, and every '
. 'turn opened another view of the water. We stopped often to take '
. 'notes, compare maps, and argue happily about where to eat dinner. '
. 'By the time we reached the guesthouse, our boots were soaked and '
. 'our notebooks were full.';
$document->multiCell(0, 7, $text);
$document->ln(3);
}
$document->ln(5);
}
// Ask the engine how many pages the layout produced, then save.
$pages = $document->getNumPages();
$document->save(__DIR__ . '/out/travel-journal.pdf');
echo "Wrote out/travel-journal.pdf with {$pages} pages\n";

Jalankan dengan php 01-multipage.php. Skrip mencetak satu baris:

Wrote out/travel-journal.pdf with 3 pages

Buka out/travel-journal.pdf dan gulir untuk menelusurinya. Bilah judul berada di bagian atas ketiga halaman, dan nomor halaman bertambah di kanan bawah.

Loop penulisan tidak pernah menyebut halaman. Loop tersebut menulis setiap judul hari dengan cell(), yang menempatkan satu baris di dalam kotak tak terlihat. Loop menulis entri dengan multiCell(), yang membungkus teks panjang ke beberapa baris sesuai kebutuhan. Tiga puluh enam entri tidak muat dalam satu halaman, sehingga pemutus halaman otomatis dipicu dua kali. Begitulah jurnal ini menjadi tepat tiga halaman.

Header dan footer dikonfigurasi sebelum panggilan addPage() pertama. Urutan itu penting: halaman yang sudah digambar tidak diperbarui setelahnya. Konfigurasikan perabot terlebih dahulu, dan setiap halaman akan tampil konsisten.

Anda tidak pernah menggambar nomor halaman. Footer mencetaknya secara bawaan; Anda hanya memilih font dan jaraknya dari tepi halaman. Saat mesin menulis halaman, ia belum dapat mengetahui jumlah akhir. Jadi ia meninggalkan placeholder di setiap footer dan mengisi total yang sebenarnya ketika Anda menyimpan.

Dua detail kecil melengkapi skrip ini. @mkdir membuat folder out, dan tanda @ membuat PHP tetap diam ketika folder sudah ada. getNumPages() menanyakan kepada mesin berapa banyak halaman yang dihasilkan tata letak, sehingga pesan akhir dapat melaporkan jumlah yang sebenarnya.

  • Error “failed to open stream” pada baris require berarti skrip tidak dapat menemukan vendor/autoload.php. Jalankan di dalam folder proyek yang berisi vendor/.
  • Semuanya berada di satu halaman, dan bagian akhir teks terpotong? Berarti pemutus halaman otomatis dalam keadaan nonaktif. Pertahankan baris setAutoPageBreak(true, margin: 25), dan tempatkan di atas loop penulisan.
  • Nama font family yang salah ketik akan melempar eksepsi yang menyebutkan font yang tidak dapat ditemukan. Periksa ejaan helvetica, dan lihat Font dan penandaan untuk masalah font yang lebih dalam.
  • Untuk hal lainnya, pusat pemecahan masalah memetakan gejala ke penyebab, dan referensi error menjelaskan eksepsi umum mesin dan cara pulih dari masing-masing.

Dokumen Anda kini dapat tumbuh ke panjang berapa pun dan tetap tampak rapi. Dalam tutorial berikutnya Anda menulis konten dalam HTML (Hypertext Markup Language) dan membiarkan mesin mengubahnya menjadi halaman.

Ketika Anda menginginkan kendali yang lebih rinci atas topik hari ini, dua resep membahasnya lebih dalam: