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

ความเสถียร: ทดลอง

การรองรับการเขียนแนวตั้ง 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 แนวตั้งทั้งสองแบบได้รับการรองรับ

Terminal window
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 ที่มาในชุด
สัญลักษณ์ตำแหน่งบทบาท
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.phpแฟล็ก opt-in สำหรับตัวจัดบรรทัดแนวตั้ง (ค่าเริ่มต้น false)
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpGate สำหรับ vertical-lr; ทั้งสองต้องเปิดจึงจะจัดได้
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/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-flowW3C CSS Writing Modes Level 3§3
การวางตั้งตรงต่อกลีฟเป็นไปตามพร็อพเพอร์ตี vertical-orientation ของ UnicodeUnicode UAX #50Vertical Orientation

นี่คือการนำชุดย่อยแนวตั้งแบบตั้งตรงคอลัมน์เดียวมาใช้แบบ preview พร้อมขอบเขต fail-closed ที่บันทึกไว้ข้างต้น NextPDF ไม่ยืนยันว่าเอาต์พุตจากเส้นทางนี้สอดคล้องกับ โปรไฟล์ใด ๆ; ตัวตรวจเป็นผู้ตัดสินใจนั้น ไม่มีการคัดลอกข้อความมาตรฐานซ้ำ