Header, footer, và tài liệu nhiều trang
Một trang thường là không đủ. Trong hướng dẫn này, bạn viết một tài liệu tự mở rộng thành ba trang. Bạn cũng thêm cho mọi trang một header lặp lại, và một footer hiển thị số trang.
Những gì bạn sẽ xây dựng
Phần tiêu đề “Những gì bạn sẽ xây dựng”Bạn sẽ viết một script, 01-multipage.php. Nó tạo ra một nhật ký du lịch ba
trang dưới dạng tệp PDF (Portable Document Format):
- Các mục nhật ký tự động tràn từ trang này sang trang khác. Bạn không bao giờ phải nói trang kết thúc ở đâu; engine quyết định điều đó.
- Header là một dải ở đầu trang, lặp lại trên mọi trang. Header của bạn hiển thị tiêu đề tài liệu.
- Footer là dải tương ứng ở cuối trang. Footer của bạn hiển thị số trang
dạng
1 / 3,2 / 3, và3 / 3.
Mọi thứ chạy chỉ với gói nextpdf/core: không cần tệp font, không cần extension
bổ sung, và không cần mạng.
Bước 1: Xây dựng nhật ký ba trang
Phần tiêu đề “Bước 1: Xây dựng nhật ký ba trang”Hai ý tưởng đảm nhận toàn bộ công việc trong script này.
Ý tưởng thứ nhất là ngắt trang tự động (automatic page break). Khi engine
viết văn bản, nó theo dõi một con trỏ (cursor): vị trí trên trang nơi dòng
tiếp theo sẽ rơi vào. setAutoPageBreak(true, margin: 25) bảo engine theo dõi
con trỏ đó. Khi nó tiến vào trong phạm vi 25 point (khoảng một phần ba inch)
tính từ cạnh dưới, engine đóng
trang lại và bắt đầu một trang mới.
Ý tưởng thứ hai là phần trang trí trang (page furniture): header và footer. Bạn
mô tả chúng một lần, trước trang đầu tiên. setHeaderData() ghi lại tiêu đề và
một mô tả ngắn cho dải trên cùng. Các lệnh gọi font và margin chọn kiểu chữ và
khoảng cách từ cạnh trang. Sau đó engine vẽ phần trang trí này trên mọi trang mà
nó tạo ra, bao gồm cả những trang nó tự thêm vào.
Tạo 01-multipage.php trong thư mục dự án của bạn:
<?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";Chạy nó bằng php 01-multipage.php. Script in ra một dòng:
Wrote out/travel-journal.pdf with 3 pagesMở out/travel-journal.pdf và cuộn qua nó. Dải tiêu đề nằm ở đầu cả ba trang,
và số trang đếm tăng dần ở góc dưới bên phải.
Điều vừa xảy ra
Phần tiêu đề “Điều vừa xảy ra”Vòng lặp ghi không bao giờ nhắc đến trang. Nó viết mỗi tiêu đề ngày bằng
cell(), lệnh này đặt một dòng vào một hộp vô hình. Nó viết các mục bằng
multiCell(), lệnh này ngắt văn bản dài thành bao nhiêu dòng tùy nhu cầu. Ba
mươi sáu mục không vừa trên một trang, nên ngắt trang tự động kích hoạt hai lần.
Đó là cách nhật ký trở thành đúng ba trang.
Header và footer đã được cấu hình trước lệnh gọi addPage() đầu tiên. Thứ tự đó
quan trọng: một trang đã được vẽ thì sau đó không cập nhật nữa. Hãy cấu hình phần
trang trí trước, và mọi trang sẽ ra đồng nhất.
Bạn không bao giờ vẽ số trang. Footer in nó theo mặc định; bạn chỉ chọn font và khoảng cách của nó từ cạnh trang. Trong khi engine viết các trang, nó chưa thể biết tổng số cuối cùng. Vì vậy nó để lại một placeholder trong mỗi footer và điền tổng số thật khi bạn lưu.
Hai chi tiết nhỏ hoàn thiện script. @mkdir tạo thư mục out, và ký hiệu @
giữ cho PHP im lặng khi thư mục đã tồn tại. getNumPages() hỏi engine xem bố cục
đã tạo ra bao nhiêu trang, để thông báo cuối cùng có thể báo cáo số lượng thật.
Nếu có gì đó sai sót
Phần tiêu đề “Nếu có gì đó sai sót”- Lỗi “failed to open stream” ở dòng
requirenghĩa là script không tìm thấyvendor/autoload.php. Hãy chạy nó bên trong thư mục dự án có chứavendor/. - Mọi thứ nằm gọn trên một trang, và phần cuối văn bản bị cắt cụt? Vậy thì ngắt
trang tự động đang tắt. Hãy giữ dòng
setAutoPageBreak(true, margin: 25), và giữ nó ở phía trên vòng lặp ghi. - Một họ font gõ sai sẽ ném ra một exception nêu tên font mà nó không tìm thấy.
Hãy kiểm tra chính tả của
helvetica, và xem Font và gắn thẻ để biết các vấn đề font sâu hơn. - Với bất kỳ vấn đề nào khác, trung tâm khắc phục sự cố đối chiếu triệu chứng với nguyên nhân, và tài liệu tham chiếu lỗi giải thích các exception chung của engine và cách khắc phục từng lỗi.
Tiếp theo
Phần tiêu đề “Tiếp theo”Tài liệu của bạn giờ có thể mở rộng đến độ dài bất kỳ mà vẫn trông hoàn chỉnh. Trong hướng dẫn tiếp theo, bạn viết nội dung bằng HTML (Hypertext Markup Language) và để engine biến nó thành các trang.
Khi bạn muốn kiểm soát chi tiết hơn các chủ đề hôm nay, hai công thức đi sâu hơn:
- Xây dựng tài liệu nhiều trang trình bày chi tiết về ngắt trang, bao gồm các trường hợp biên.
- Thêm header và footer trang lặp lại hướng dẫn qua mọi thiết lập header và footer, bao gồm cả cách tắt chúng.