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.
Yang akan Anda bangun
Bagian berjudul “Yang akan Anda bangun”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, dan3 / 3.
Semuanya berjalan hanya dengan paket nextpdf/core: tanpa berkas font, tanpa
ekstensi tambahan, dan tanpa jaringan.
Langkah 1: Membangun jurnal tiga halaman
Bagian berjudul “Langkah 1: Membangun jurnal tiga halaman”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 pagesBuka out/travel-journal.pdf dan gulir untuk menelusurinya. Bilah judul berada di
bagian atas ketiga halaman, dan nomor halaman bertambah di kanan bawah.
Apa yang baru saja terjadi
Bagian berjudul “Apa yang baru saja terjadi”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.
Jika terjadi kesalahan
Bagian berjudul “Jika terjadi kesalahan”- Error “failed to open stream” pada baris
requireberarti skrip tidak dapat menemukanvendor/autoload.php. Jalankan di dalam folder proyek yang berisivendor/. - 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.
Selanjutnya
Bagian berjudul “Selanjutnya”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:
- Membangun dokumen multi-halaman membahas pemutusan halaman secara rinci, termasuk kasus-kasus tepinya.
- Menambahkan header dan footer halaman berulang memandu Anda melalui setiap pengaturan header dan footer, termasuk cara mematikannya.