ส่วนหัว ส่วนท้าย และเอกสารหลายหน้า
หน้าเดียวมักไม่เพียงพอ ในบทเรียนนี้จะเขียนเอกสารที่ขยายเป็นสามหน้าได้ด้วย ตัวเอง อีกทั้งยังใส่ส่วนหัวที่ปรากฏซ้ำในทุกหน้า และใส่ส่วนท้ายที่แสดงเลขหน้า
สิ่งที่จะสร้าง
หัวข้อที่มีชื่อว่า “สิ่งที่จะสร้าง”จะเขียนสคริปต์หนึ่งไฟล์คือ 01-multipage.php ซึ่งจะสร้างบันทึกการเดินทางสาม
หน้าเป็นไฟล์ PDF (Portable Document Format):
- บันทึกในสมุดจะไหลจากหน้าหนึ่งไปยังอีกหน้าโดยอัตโนมัติ โดยไม่ต้องระบุว่า หน้าหนึ่งสิ้นสุดที่ใด เอนจินเป็นผู้ตัดสินใจเอง
- ส่วนหัว คือแถบด้านบนสุดของหน้าที่ปรากฏซ้ำในทุกหน้า ในที่นี้จะแสดง ชื่อเอกสาร
- ส่วนท้าย คือแถบคู่กันที่อยู่ด้านล่าง ในที่นี้จะแสดงเลขหน้าเป็น
1 / 3,2 / 3และ3 / 3
ทุกอย่างทำงานด้วยแพ็กเกจ nextpdf/core เพียงอย่างเดียว ไม่ต้องมีไฟล์ฟอนต์
ไม่ต้องมีส่วนขยายเพิ่มเติม และไม่ต้องใช้เครือข่าย
ขั้นที่ 1: สร้างสมุดบันทึกสามหน้า
หัวข้อที่มีชื่อว่า “ขั้นที่ 1: สร้างสมุดบันทึกสามหน้า”แนวคิดสองอย่างขับเคลื่อนการทำงานทั้งหมดในสคริปต์นี้
อย่างแรกคือการขึ้นหน้าใหม่อัตโนมัติ ขณะที่เอนจินเขียนข้อความ จะติดตาม
เคอร์เซอร์ คือจุดบนหน้าที่บรรทัดถัดไปจะไปปรากฏ
setAutoPageBreak(true, margin: 25) สั่งให้เอนจินคอยเฝ้าเคอร์เซอร์นั้น
เมื่อเข้าใกล้ขอบล่างในระยะ 25 points (ประมาณหนึ่งในสามของนิ้ว) เอนจินจะปิด
หน้านั้นและเริ่มหน้าใหม่
อย่างที่สองคือองค์ประกอบประจำหน้า ได้แก่ ส่วนหัวและส่วนท้าย โดยอธิบายไว้เพียง
ครั้งเดียวก่อนหน้าแรก setHeaderData() จะบันทึกชื่อเรื่องและคำอธิบายสั้น ๆ
สำหรับแถบด้านบน ส่วนการเรียกตั้งค่าฟอนต์และระยะขอบจะเลือกตัวอักษรและระยะห่าง
จากขอบหน้า จากนั้นเอนจินจะวาดองค์ประกอบเหล่านี้ในทุกหน้าที่สร้างขึ้น รวมถึง
หน้าที่เพิ่มเข้ามาเอง
สร้าง 01-multipage.php ในโฟลเดอร์โปรเจกต์ของคุณ:
<?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";รันด้วย php 01-multipage.php สคริปต์จะพิมพ์ออกมาหนึ่งบรรทัด:
Wrote out/travel-journal.pdf with 3 pagesเปิด out/travel-journal.pdf แล้วเลื่อนดู แถบชื่อเรื่องอยู่ด้านบนของทั้งสาม
หน้า และเลขหน้าจะนับเพิ่มขึ้นที่มุมล่างขวา
เกิดอะไรขึ้น
หัวข้อที่มีชื่อว่า “เกิดอะไรขึ้น”ลูปสำหรับเขียนไม่ได้กล่าวถึงหน้าเลย โดยเขียนหัวข้อของแต่ละวันด้วย cell()
ซึ่งวางข้อความหนึ่งบรรทัดในกล่องที่มองไม่เห็น และเขียนบันทึกด้วย multiCell()
ซึ่งตัดข้อความยาวลงเป็นหลายบรรทัดตามที่ต้องการ บันทึกสามสิบหกรายการไม่พอดีใน
หน้าเดียว การขึ้นหน้าใหม่อัตโนมัติจึงทำงานสองครั้ง นั่นคือเหตุผลที่สมุดบันทึก
กลายเป็นสามหน้าพอดี
ส่วนหัวและส่วนท้ายถูกตั้งค่าก่อนการเรียก addPage() ครั้งแรก ลำดับนี้สำคัญ
หน้าที่วาดไปแล้วจะไม่อัปเดตในภายหลัง ให้ตั้งค่าองค์ประกอบประจำหน้าก่อน แล้ว
ทุกหน้าจะออกมาสอดคล้องกัน
ไม่ได้วาดเลขหน้าเลย ส่วนท้ายพิมพ์เลขหน้าให้โดยค่าเริ่มต้น เพียงแค่เลือกฟอนต์ และระยะห่างจากขอบหน้าของส่วนท้าย ในระหว่างที่เอนจินเขียนหน้าต่าง ๆ ยังไม่สามารถ รู้จำนวนหน้าสุดท้ายได้ จึงทิ้งตัวยึดตำแหน่งไว้ในแต่ละส่วนท้าย แล้วเติมยอดรวม ที่แท้จริงเมื่อบันทึก
รายละเอียดเล็ก ๆ สองอย่างช่วยเก็บงานสคริปต์ให้เรียบร้อย @mkdir สร้างโฟลเดอร์
out และเครื่องหมาย @ ทำให้ PHP ไม่แจ้งเตือนเมื่อโฟลเดอร์นั้นมีอยู่แล้ว
getNumPages() สอบถามเอนจินว่าเลย์เอาต์สร้างหน้าออกมากี่หน้า เพื่อให้ข้อความ
สุดท้ายรายงานจำนวนที่แท้จริงได้
หากมีบางอย่างผิดพลาด
หัวข้อที่มีชื่อว่า “หากมีบางอย่างผิดพลาด”- ข้อผิดพลาด “failed to open stream” ที่บรรทัด
requireหมายความว่าสคริปต์หาvendor/autoload.phpไม่พบ ให้รันภายในโฟลเดอร์โปรเจกต์ที่มีvendor/ - ทุกอย่างอยู่บนหน้าเดียว และปลายข้อความถูกตัดหายไปใช่ไหม แสดงว่าการขึ้น
หน้าใหม่อัตโนมัติปิดอยู่ ให้คงบรรทัด
setAutoPageBreak(true, margin: 25)ไว้ และวางไว้เหนือลูปสำหรับเขียน - การพิมพ์ชื่อตระกูลฟอนต์ผิดจะโยนข้อยกเว้นที่ระบุชื่อฟอนต์ที่หาไม่พบ ให้
ตรวจสอบการสะกด
helveticaและดู ฟอนต์และการติดแท็ก สำหรับ ปัญหาฟอนต์ที่ซับซ้อนกว่านี้ - สำหรับกรณีอื่น ๆ ศูนย์แก้ปัญหา จะจับคู่อาการกับ สาเหตุ และ เอกสารอ้างอิงข้อผิดพลาด จะอธิบายข้อยกเว้นทั่วไปของเอนจินและวิธีกู้คืนจากแต่ละกรณี
ตอนนี้เอกสารของคุณสามารถขยายได้ทุกความยาวและยังดูเรียบร้อยสมบูรณ์ ใน บทเรียนถัดไป จะเขียนเนื้อหา ด้วย HTML (Hypertext Markup Language) แล้วให้เอนจินแปลงเป็นหน้าต่าง ๆ
เมื่อต้องการควบคุมหัวข้อที่กล่าวถึงในวันนี้ได้ละเอียดขึ้น มีสูตรสองรายการที่ลงลึกกว่านี้:
- สร้างเอกสารหลายหน้า ครอบคลุมการ ขึ้นหน้าใหม่อย่างละเอียด รวมถึงกรณีขอบเขต
- เพิ่มส่วนหัวและส่วนท้ายที่ทำซ้ำในแต่ละหน้า พาไล่ดูการตั้งค่าส่วนหัวและส่วนท้ายทุกรายการ รวมถึงการปิดใช้งาน