ข้ามไปยังเนื้อหา
getnextpdf.com

ส่วนหัว ส่วนท้าย และเอกสารหลายหน้า

หน้าเดียวมักไม่เพียงพอ ในบทเรียนนี้จะเขียนเอกสารที่ขยายเป็นสามหน้าได้ด้วย ตัวเอง อีกทั้งยังใส่ส่วนหัวที่ปรากฏซ้ำในทุกหน้า และใส่ส่วนท้ายที่แสดงเลขหน้า

จะเขียนสคริปต์หนึ่งไฟล์คือ 01-multipage.php ซึ่งจะสร้างบันทึกการเดินทางสาม หน้าเป็นไฟล์ PDF (Portable Document Format):

  • บันทึกในสมุดจะไหลจากหน้าหนึ่งไปยังอีกหน้าโดยอัตโนมัติ โดยไม่ต้องระบุว่า หน้าหนึ่งสิ้นสุดที่ใด เอนจินเป็นผู้ตัดสินใจเอง
  • ส่วนหัว คือแถบด้านบนสุดของหน้าที่ปรากฏซ้ำในทุกหน้า ในที่นี้จะแสดง ชื่อเอกสาร
  • ส่วนท้าย คือแถบคู่กันที่อยู่ด้านล่าง ในที่นี้จะแสดงเลขหน้าเป็น 1 / 3, 2 / 3 และ 3 / 3

ทุกอย่างทำงานด้วยแพ็กเกจ nextpdf/core เพียงอย่างเดียว ไม่ต้องมีไฟล์ฟอนต์ ไม่ต้องมีส่วนขยายเพิ่มเติม และไม่ต้องใช้เครือข่าย

แนวคิดสองอย่างขับเคลื่อนการทำงานทั้งหมดในสคริปต์นี้

อย่างแรกคือการขึ้นหน้าใหม่อัตโนมัติ ขณะที่เอนจินเขียนข้อความ จะติดตาม เคอร์เซอร์ คือจุดบนหน้าที่บรรทัดถัดไปจะไปปรากฏ 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) แล้วให้เอนจินแปลงเป็นหน้าต่าง ๆ

เมื่อต้องการควบคุมหัวข้อที่กล่าวถึงในวันนี้ได้ละเอียดขึ้น มีสูตรสองรายการที่ลงลึกกว่านี้: