ข้อความ ฟอนต์ และพื้นฐานของหน้า
ในบทเรียนแรกได้เรนเดอร์หน้าที่มีข้อความเพียงบรรทัดเดียว ครั้งนี้จะเข้าควบคุมตัวหน้าและข้อความบนหน้าเอง โดยจะเลือกขนาดหน้า เขียนหัวเรื่องและย่อหน้า แล้วจัดรูปแบบด้วยฟอนต์ที่มีมาให้ในตัวของเอนจิน
สิ่งที่จะสร้าง
หัวข้อที่มีชื่อว่า “สิ่งที่จะสร้าง”จะเขียนสคริปต์ขนาดเล็กสองไฟล์ แต่ละไฟล์สร้างไฟล์ Portable Document Format (PDF) ความยาวหนึ่งหน้า
01-text-basics.phpเรนเดอร์หน้า A4 แนวตั้งพร้อมหัวเรื่องที่มีสี ย่อหน้าที่ตัดบรรทัดอัตโนมัติ และตัวอย่างการจัดแนวสามแบบ02-fonts.phpเรนเดอร์หน้าตัวอย่างที่เปรียบเทียบฟอนต์ที่มีมาให้ในตัวสองตระกูลในหลายขนาด
ทุกอย่างทำงานได้ด้วยแพ็กเกจ nextpdf/core เพียงอย่างเดียว ไม่ต้องใช้ไฟล์ฟอนต์ ส่วนขยายเพิ่มเติม หรือเครือข่ายใดๆ หากยังไม่ได้ตั้งค่าโปรเจกต์ไว้ ให้ทำตามบทเรียนแรกก่อนแล้วจึงกลับมา
ขั้นตอนที่ 1: จัดรูปแบบข้อความบนหน้า A4
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 1: จัดรูปแบบข้อความบนหน้า A4”ทุกหน้ามีขนาดและการวางแนว A4 เป็นขนาดกระดาษสากลที่ใช้กันทั่วไป ส่วน Letter เป็นขนาดที่ใช้ในสหรัฐอเมริกา การวางแนวมีทั้งแบบแนวตั้ง (ตั้งขึ้น) และแนวนอน (ตะแคงข้าง) โดยส่งทั้งสองตัวเลือกไปยัง addPage() เมื่อเริ่มหน้าใหม่
จากนั้นมีสามเมท็อดที่ทำหน้าที่เขียนข้อความ setFont() เลือกแบบอักษรและขนาดสำหรับข้อความที่ตามมา cell() เขียนข้อความหนึ่งบรรทัดภายในกล่องที่มองไม่เห็น multiCell() ตัดข้อความที่ยาวขึ้นเป็นหลายบรรทัดตามที่ต้องการ ในทั้งสองเมท็อด ความกว้างเท่ากับ 0 หมายถึง “ใช้พื้นที่ทั้งหมดจนถึงระยะขอบด้านขวา”
อีกสองการเรียกจัดการเรื่องรูปลักษณ์ setTextColor() รับค่าสีแดง เขียว และน้ำเงินตั้งแต่ 0 ถึง 255 และมีผลไปจนกว่าจะเปลี่ยนอีกครั้ง enum ชื่อ Alignment ซึ่งเป็นรายการตัวเลือกที่มีชื่อกำหนดไว้ตายตัว มีให้เลือกทั้ง Left, Center, Right และ Justify
สร้างไฟล์ 01-text-basics.php ในโฟลเดอร์โปรเจกต์
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\Alignment;use NextPDF\Contracts\Orientation;use NextPDF\Core\Document;use NextPDF\ValueObjects\PageSize;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();$document->setTitle('Text basics');$document->addPage(PageSize::A4(), Orientation::Portrait);
// A colored heading. The values are red, green, and blue, each 0 to 255.$document->setFont('helvetica', 'B', 20);$document->setTextColor(30, 64, 175);$document->cell(0, 14, 'Project kickoff notes', newLine: true);$document->ln(4);
// Back to black for the body text.$document->setTextColor(0, 0, 0);$document->setFont('helvetica', '', 11);$document->multiCell( 0, 7, 'Welcome to the second tutorial. This paragraph is written with ' . 'multiCell(), so the engine wraps the words onto as many lines ' . 'as the page width requires.',);$document->ln(4);
$document->multiCell( 0, 7, 'Justified text stretches the spaces so both edges line up. It is a ' . 'good fit for report bodies and other long passages.', align: Alignment::Justify,);$document->ln(6);
// One line each: left, centered, and right.$document->setFont('helvetica', 'I', 11);$document->cell(0, 8, 'Left-aligned line', newLine: true, align: Alignment::Left);$document->cell(0, 8, 'Centered line', newLine: true, align: Alignment::Center);$document->cell(0, 8, 'Right-aligned line', newLine: true, align: Alignment::Right);
$document->save(__DIR__ . '/out/text-basics.pdf');
echo "Wrote out/text-basics.pdf\n";รันด้วย php 01-text-basics.php สคริปต์จะพิมพ์ Wrote out/text-basics.pdf และไฟล์จะปรากฏในโฟลเดอร์ out/ ที่สร้างขึ้นใหม่
สิ่งที่เพิ่งเกิดขึ้น
หัวข้อที่มีชื่อว่า “สิ่งที่เพิ่งเกิดขึ้น”addPage(PageSize::A4(), Orientation::Portrait) สร้างหน้าขึ้นก่อนที่จะมีการเขียนข้อความใดๆ หากส่ง Orientation::Landscape แทน หน้าเดียวกันจะหมุนเป็นแนวนอน ขนาดที่มีชื่ออื่นๆ เช่น PageSize::A5() หรือ PageSize::Letter() ก็ทำงานในลักษณะเดียวกัน
setFont('helvetica', 'B', 20) เลือก Helvetica ตัวหนาขนาด 20 พอยต์ พอยต์ (pt) เป็นหน่วยการพิมพ์ดั้งเดิม โดย 72 พอยต์เท่ากับหนึ่งนิ้ว หัวเรื่องเป็นสีน้ำเงินเพราะ setTextColor(30, 64, 175) มีผลอยู่ในขณะที่การเรียก cell() เขียนหัวเรื่องนั้น จากนั้น setTextColor(0, 0, 0) ถัดมาสลับกลับเป็นสีดำสำหรับทุกอย่างที่ตามมา
การเรียก multiCell() ทั้งสองครั้งตัดบรรทัดย่อหน้าให้โดยอัตโนมัติ ครั้งที่จัดชิดขอบทั้งสองด้านจะยืดระยะห่างระหว่างคำให้ขอบทั้งสองด้านตรงเสมอกัน ยกเว้นบรรทัดสุดท้ายของย่อหน้า ระหว่างบล็อก ln() เลื่อนตำแหน่งการเขียนลงมาเพื่อเพิ่มช่องว่างให้ดูโปร่ง สุดท้าย save() สร้างไฟล์และเขียนลงในโฟลเดอร์ out/
สำหรับพารามิเตอร์ทุกตัวที่เมท็อดเหล่านี้รับ ดูที่การเรียบเรียงข้อความด้วยฟอนต์และการจัดแนว
ขั้นตอนที่ 2: เลือกจากฟอนต์ที่มีมาให้ในตัว
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 2: เลือกจากฟอนต์ที่มีมาให้ในตัว”เอนจินมาพร้อมฟอนต์ข้อความสามตระกูลในตัว ได้แก่ Helvetica, Times และ Courier Helvetica เป็นแบบอักษรแบบไม่มีเชิง หมายความว่าตัวอักษรไม่มีเส้นปลายเล็กๆ (เชิงอักษร) Times เป็นแบบอักษรแบบมีเชิงที่อ่านง่ายในเนื้อความยาวคล้ายงานพิมพ์ Courier มีความกว้างคงที่ จึงเหมาะกับการแสดงโค้ดและใบเสร็จ เนื่องจากฟอนต์ตระกูลเหล่านี้มีมาให้ในตัว สคริปต์จึงไม่จำเป็นต้องใช้ไฟล์ฟอนต์ใดๆ เลย
อาร์กิวเมนต์สไตล์ของ setFont() ผสมแฟล็กตัวอักษรเดี่ยว ได้แก่ 'B' สำหรับตัวหนา 'I' สำหรับตัวเอียง และ 'U' สำหรับขีดเส้นใต้ สตริงว่างหมายถึงตัวปกติ และแฟล็กสามารถผสมกันได้ ดังนั้น 'BI' จึงให้ตัวหนาเอียง
ฟอนต์ตระกูลที่มีมาให้ในตัวครอบคลุมข้อความที่ใช้อักษรละติน สำหรับระบบการเขียนอื่นหรือแบบอักษรประจำแบรนด์ของตนเอง สามารถลงทะเบียนไฟล์ฟอนต์ได้ ตามที่สูตรฝังและสร้างสับเซตของฟอนต์แสดงไว้ (การสร้างสับเซตจะเก็บไว้เฉพาะตัวอักษรที่ใช้งานจริง ไฟล์จึงมีขนาดเล็ก) ส่วนเมทริกซ์การรองรับฟอนต์แสดงรายการรูปแบบฟอนต์ทุกแบบที่เอนจินรองรับ
สร้างไฟล์ 02-fonts.php ไว้ข้างสคริปต์แรก
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();$document->setTitle('Font sampler');$document->addPage();
$document->setFont('helvetica', 'B', 20);$document->cell(0, 14, 'Built-in font sampler', newLine: true);$document->ln(4);
// Helvetica: a sans-serif face, a solid default for labels and headings.$document->setFont('helvetica', 'B', 14);$document->cell(0, 10, 'Helvetica', newLine: true);foreach ([10, 12, 16] as $size) { $document->setFont('helvetica', '', (float) $size); $document->cell(0, $size * 0.8, "Helvetica sample at {$size}pt.", newLine: true);}$document->setFont('helvetica', 'BI', 12);$document->cell(0, 9, 'Helvetica bold italic for emphasis.', newLine: true);$document->ln(6);
// Times: a serif face that suits long, print-like passages.$document->setFont('times', 'B', 14);$document->cell(0, 10, 'Times', newLine: true);foreach ([10, 12, 16] as $size) { $document->setFont('times', '', (float) $size); $document->cell(0, $size * 0.8, "Times sample at {$size}pt.", newLine: true);}$document->setFont('times', 'I', 12);$document->cell(0, 9, 'Times italic for quotations.', newLine: true);
$document->save(__DIR__ . '/out/font-sampler.pdf');
echo "Wrote out/font-sampler.pdf\n";รันด้วย php 02-fonts.php แล้วเปิด out/font-sampler.pdf จะเห็นประโยคตัวอย่างเดียวกันเปลี่ยนลักษณะระหว่างฟอนต์สองตระกูลและใหญ่ขึ้นตามสามขนาด
สิ่งที่เพิ่งเกิดขึ้น
หัวข้อที่มีชื่อว่า “สิ่งที่เพิ่งเกิดขึ้น”addPage() ที่ไม่มีอาร์กิวเมนต์ใช้การตั้งค่าหน้าเริ่มต้นในการวางแนวแนวตั้ง ดังนั้นไม่ใช่ทุกสคริปต์ที่ต้องระบุขนาดอย่างชัดเจน การเรียก setFont() แต่ละครั้งสลับตระกูล สไตล์ หรือขนาดที่ใช้งานอยู่กลางหน้า และฟอนต์จะยังคงใช้งานอยู่จนกว่าจะมีการเรียก setFont() ครั้งถัดไป
ลูปแปลงชนิดขนาดด้วย (float) เพราะ setFont() ต้องการตัวเลขทศนิยม ความสูงของบรรทัดปรับขนาดตามขนาดฟอนต์ ($size * 0.8) ข้อความที่ใหญ่ขึ้นจึงได้บรรทัดที่สูงขึ้นและไม่มีส่วนใดซ้อนทับกัน ลองแทนที่ 'times' ด้วย 'courier' แล้วรันสคริปต์อีกครั้งเพื่อดูฟอนต์ตระกูลที่สาม
หากมีบางอย่างผิดพลาด
หัวข้อที่มีชื่อว่า “หากมีบางอย่างผิดพลาด”- ข้อผิดพลาด “class not found” หรือ autoload มักหมายความว่าสคริปต์ไม่พบ
vendor/autoload.phpให้รันภายในโฟลเดอร์โปรเจกต์ที่มีvendor/อยู่ - ชื่อตระกูลที่พิมพ์ผิดจะโยนข้อยกเว้นที่ระบุชื่อฟอนต์ที่หาไม่พบ ให้ตรวจสอบการสะกด:
helvetica,times,courier - ศูนย์รวมการแก้ปัญหารวบรวมวิธีแก้ที่พบบ่อย และฟอนต์และการแท็กครอบคลุมปัญหาเกี่ยวกับฟอนต์อย่างละเอียด
- ข้อยกเว้นของเอนจินทุกตัวมีบันทึกไว้ในเอกสารอ้างอิงข้อผิดพลาดพร้อมบริบทที่มากับข้อยกเว้นนั้นและการดำเนินการเพื่อกู้คืน
ตอนนี้สามารถกำหนดรูปทรงของหน้า จัดรูปแบบข้อความ และเลือกฟอนต์ได้อย่างตั้งใจแล้ว ในบทเรียนถัดไป จะวางรูปภาพลงบนหน้าและจัดระเบียบเนื้อหาด้วยตารางและรายการ