ความเสถียร: ทดลอง
การรองรับการเขียนแนวตั้ง CJK
ภาพรวมโดยย่อ
หัวข้อที่มีชื่อว่า “ภาพรวมโดยย่อ”Preview แบบ opt-in ตัวจัดบรรทัดแนวตั้งเปิดเป็นค่าเริ่มต้นปิด เมื่อมันปิด เอนจินจะเรนเดอร์ในแนวนอนเหมือนเดิมทุกประการ — เหมือนกันทุกไบต์ เปิดมัน เฉพาะสำหรับเอกสารที่ต้องการบรรทัดแนวตั้งจริง และตรวจสอบผลลัพธ์
ตัวเรนเดอร์ HTML เพิ่มตัวจัดบรรทัดแนวตั้งจริงสำหรับ CSS writing mode
writing-mode: vertical-lr และ writing-mode: vertical-rl เมื่อตัวจัดบรรทัดเปิด
กลีฟจะซ้อนจากบนลงล่างโดยการวางต่อกลีฟนำมาจากเมตริกแนวตั้งจริงของฟอนต์ (ตาราง
vhea และ vmtx) ตามแบบจำลองการเขียนแนวตั้งของ PDF ใน ISO 32000-2 §9.7.5
ที่อธิบายไว้ ทิศทาง block-flow แนวตั้งทั้งสองแบบได้รับการรองรับ
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”composer require nextpdf/core:^3ตัวจัดบรรทัดมาในแพ็กเกจ core opt-in CssFeatureFlags::$layoutVerticalComposer
เป็น @since 6.1.0 เวอร์ชันของเอนจินไม่เปลี่ยนแปลง; คุณสมบัตินี้เป็นแบบเสริมและ
เปิดเป็นค่าเริ่มต้นปิด
ภาพรวมเชิงแนวคิด
หัวข้อที่มีชื่อว่า “ภาพรวมเชิงแนวคิด”การจัดวางแนวตั้งจะเปิดก็ต่อเมื่อทั้ง layoutVerticalLr และ layoutVerticalComposer
ถูกตั้งไว้ เมื่อเปิดทั้งสอง run แบบ vertical-lr หรือ vertical-rl จะจัดเป็นบรรทัด
แนวตั้งจริง: กลีฟแต่ละตัวถูกวางโดยระยะ advance แนวตั้งจากเมตริก vhea/vmtx ของ
ฟอนต์ และกลีฟที่ UAX #50 กำหนดให้ตั้งตรงจะถูกคงให้ตั้งตรง vertical-lr จัดคอลัมน์
จากซ้ายไปขวา; vertical-rl จัดคอลัมน์จากขวาไปซ้าย
สิ่งนี้แตกต่างจากฟาซาดการเข้ารหัสที่รับรู้ cmap ซึ่งบันทึกไว้ใน ตั้งข้อความ CJK ด้วยการเข้ารหัสที่รับรู้ cmap ซึ่งพิสูจน์เส้นทางการเข้ารหัสแต่ไม่ได้ขับเคลื่อน writing mode แนวตั้งด้วยตัวเอง หน้านี้ บันทึกตัวจัดบรรทัดฝั่งการจัดวางที่ opt-in ของ writing-mode เปิดใช้
ขอบเขต fail-closed — เมื่อใดที่มันจัด และทำอะไรเมื่อไม่จัด
หัวข้อที่มีชื่อว่า “ขอบเขต fail-closed — เมื่อใดที่มันจัด และทำอะไรเมื่อไม่จัด”ตัวจัดบรรทัดเป็นแบบระมัดระวังโดยการออกแบบ มันจัด run ในแนวตั้งก็ต่อเมื่อ ทุก กลีฟใน run เป็น UAX #50 แบบตั้งตรงที่มีเมตริกแนวตั้งจริง ไม่มีลิงก์ที่เปิดอยู่ภายใน run และ run เป็นคอลัมน์เดียว เมื่อสิ่งใดสิ่งหนึ่งในนั้นไม่เป็นจริง — แฟล็กปิด หรือ run ไม่สามารถจัดได้อย่างซื่อตรง — เอนจินจะถอยกลับไปยังการจัดวางแนวนอนและส่งไดแอก โนสติกที่เลื่อนออกไปซึ่งตรงกับโหมด:
HTML_WRITING_MODE_LR_DEFERREDสำหรับ run แบบvertical-lrที่จัดไม่ได้HTML_WRITING_MODE_RL_DEFERREDสำหรับ run แบบvertical-rlที่จัดไม่ได้
ไดแอกโนสติกแต่ละรายการมี reason ดังนั้นการเลื่อนจึงสังเกตได้และอธิบายได้ ไม่ใช่
การเรนเดอร์แนวนอนอย่างเงียบ ๆ ของข้อความที่ผู้เขียนขอให้ตั้งในแนวตั้ง
ขอบเขตที่บันทึกไว้ (สไลซ์ภายหลัง)
หัวข้อที่มีชื่อว่า “ขอบเขตที่บันทึกไว้ (สไลซ์ภายหลัง)”กรณีเหล่านี้อยู่นอกขอบเขตของสไลซ์ปัจจุบันและถูกติดตามไว้สำหรับงานภายหลัง:
- กลีฟที่หมุน (ไม่ตั้งตรง) ภายใน run แนวตั้ง
- การ wrap แนวตั้งแบบหลายคอลัมน์
- สี่เหลี่ยมลิงก์แนวตั้ง (ลิงก์ภายใน run แนวตั้งจะเลื่อน run ออกไป)
- ไม่มีฟิกซ์เจอร์ฟอนต์ CJK ที่มีเมตริกแนวตั้งมาให้ในคอร์ปัสทดสอบ ดังนั้นการตรวจสอบ ข้ามด้วยสายตาจึงถูกติดตามไว้แทนที่จะยืนยันด้วย golden ที่มาในชุด
พื้นผิวของ API
หัวข้อที่มีชื่อว่า “พื้นผิวของ API”| สัญลักษณ์ | ตำแหน่ง | บทบาท |
|---|---|---|
CssFeatureFlags::$layoutVerticalComposer | src/Html/CssFeatureFlags.php | แฟล็ก opt-in สำหรับตัวจัดบรรทัดแนวตั้ง (ค่าเริ่มต้น false) |
CssFeatureFlags::$layoutVerticalLr | src/Html/CssFeatureFlags.php | Gate สำหรับ vertical-lr; ทั้งสองต้องเปิดจึงจะจัดได้ |
Config::withCssFeatureFlags(CssFeatureFlags $flags): self | src/Core/Config.php | แนบชุดแฟล็กเข้ากับการกำหนดค่าเอกสาร |
รหัสไดแอกโนสติกที่เลื่อนออกไป HTML_WRITING_MODE_LR_DEFERRED และ
HTML_WRITING_MODE_RL_DEFERRED ปรากฏผ่านช่องทางคำแนะนำของผลการเรนเดอร์
ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;use NextPDF\Core\Document;use NextPDF\Html\Css\CssFeatureFlags;
$config = (new Config())->withCssFeatureFlags(new CssFeatureFlags( layoutVerticalLr: true, layoutVerticalComposer: true,));
$doc = Document::createStandalone($config);$doc->addPage();$doc->writeHtml( '<div style="writing-mode: vertical-rl; font-family: NotoSerifJP;">' . '日本語の縦書き' . '</div>',);$doc->save(__DIR__ . '/vertical.pdf');run ที่จัดไม่ได้อย่างซื่อตรงจะเรนเดอร์ในแนวนอนและเพิ่มคำแนะนำ
HTML_WRITING_MODE_RL_DEFERRED พร้อม reason ตรวจสอบช่องทางคำแนะนำก่อน
ถือว่าเอาต์พุตแนวตั้งเป็นที่สิ้นสุด
ตัวอย่างโค้ด — สำหรับใช้งานจริง
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — สำหรับใช้งานจริง”ลงทะเบียนฟอนต์ที่มีเมตริกแนวตั้งจริงผ่าน DocumentFactory เพื่อให้ตัวจัดบรรทัด
อ่าน vhea/vmtx ได้ จากนั้นให้เอกสารเลือกใช้ตัวจัดบรรทัด
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Html\Css\CssFeatureFlags;use NextPDF\Typography\FontRegistry;
$fontRegistry = new FontRegistry();$fontRegistry->register('/path/to/NotoSerifJP-Regular.otf', alias: 'NotoSerifJP');
$config = (new Config())->withCssFeatureFlags(new CssFeatureFlags( layoutVerticalLr: true, layoutVerticalComposer: true,));
$factory = new DocumentFactory($fontRegistry, new ImageRegistry(maxCacheBytes: 0));$doc = $factory->create($config);$doc->setLanguage('ja');$doc->addPage();$doc->writeHtml( '<div style="writing-mode: vertical-rl; font-family: NotoSerifJP;">' . '縦書きの本文。' . '</div>',);$doc->save($out);กรณีขอบและข้อควรระวัง
หัวข้อที่มีชื่อว่า “กรณีขอบและข้อควรระวัง”- ต้องมีทั้งสองแฟล็ก ตัวจัดบรรทัดต้องการ
layoutVerticalLrและlayoutVerticalComposerหากตัวใดตัวหนึ่งปิด run จะเรนเดอร์ในแนวนอน - ต้องมีเมตริกแนวตั้งจริง ฟอนต์ที่ไม่มี
vhea/vmtxไม่สามารถขับเคลื่อนตัวจัด บรรทัดได้; run จะเลื่อนไปยังการจัดวางแนวนอน - การเลื่อนสังเกตได้ run ที่จัดไม่ได้จะส่ง
HTML_WRITING_MODE_LR_DEFERRED/HTML_WRITING_MODE_RL_DEFERREDพร้อมreasonมันไม่เคยเรนเดอร์ตะแคงอย่าง เงียบ ๆ - ไม่มีการอ้างความสอดคล้องจากเส้นทางนี้ การจัดวางแนวตั้งเป็นความสามารถ ด้านการจัดวาง; มันไม่ใช่ข้อความความสอดคล้องแบบ PDF/UA-2 หรือ PDF/A-4 สำหรับ ไฟล์ที่ผลิตออกมา ตัวตรวจ (checker) เป็นผู้ตัดสินความสอดคล้อง
ประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ประสิทธิภาพ”การจัดวางเพิ่มการค้นหา advance แนวตั้งต่อกลีฟตลอด run ซึ่งเป็นเชิงเส้นตามจำนวน
กลีฟ งบประมาณ (wall_ms: 2000, peak_mb: 128) เป็นไปตามโปรไฟล์ CJK เพราะ
ฟอนต์ที่มีเมตริกแนวตั้งมีขนาดใหญ่และต้นทุนหลักคือการจัดการฟอนต์ ไม่ใช่การผ่านการ
จัดวาง
หมายเหตุด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “หมายเหตุด้านความปลอดภัย”ตัวจัดบรรทัดอ่านเมตริกแนวตั้งจากฟอนต์ที่ลงทะเบียนแล้วและตรวจสอบความถูกต้องแล้ว มันไม่เปิดช่องทางอินพุตใหม่ ไฟล์ฟอนต์ยังคงเป็นอินพุตไบนารีที่ไม่น่าเชื่อถือซึ่งจัดการ โดยการตรวจสอบความถูกต้องที่มีอยู่ของชั้น typography ข้อความที่จัดแล้วถูกเรนเดอร์ ไม่ใช่ตีความ
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”| ข้อความ | มาตรฐาน | ข้อ |
|---|---|---|
| การเขียนแนวตั้งใช้เมตริกกลีฟแนวตั้งของ CIDFont สำหรับการวาง | ISO 32000-2 | §9.7.5 |
writing-mode: vertical-lr / vertical-rl กำหนดทิศทาง block-flow | W3C CSS Writing Modes Level 3 | §3 |
| การวางตั้งตรงต่อกลีฟเป็นไปตามพร็อพเพอร์ตี vertical-orientation ของ Unicode | Unicode UAX #50 | Vertical Orientation |
นี่คือการนำชุดย่อยแนวตั้งแบบตั้งตรงคอลัมน์เดียวมาใช้แบบ preview พร้อมขอบเขต fail-closed ที่บันทึกไว้ข้างต้น NextPDF ไม่ยืนยันว่าเอาต์พุตจากเส้นทางนี้สอดคล้องกับ โปรไฟล์ใด ๆ; ตัวตรวจเป็นผู้ตัดสินใจนั้น ไม่มีการคัดลอกข้อความมาตรฐานซ้ำ