Font Fallback and Vertical Text
HotPDF เลือก face สำรองตามสคริปต์ Unicode ได้, รายงาน code point ที่ยังไม่ระบุตัวได้ และเขียนข้อความ CJK ผ่าน writing mode แนวตั้งของ CID อย่างจริงจัง
ห่วงโซ่ fallback ระดับเอกสาร
THotPDF.SetFontFallbackChain เก็บรายการ face ที่เรียงลำดับไว้ต่อหมวด THPDFFontScript หนึ่งหมวด
THPDFPage.TextOutWithFallback resolve Unicode scalar แต่ละตัวกับ face ที่เลือก, ห่วงโซ่สคริปต์ของมัน และห่วงโซ่กลาง แล้วปล่อย scalar ที่ติดกันซึ่งใช้ face เดียวกันเป็น text run เดียว
- ห่วงโซ่ fallback เป็นการตั้งค่าระดับเอกสาร ใช้ได้ต่อข้ามหน้า
- ชื่อ face ที่ซ้ำและว่างจะถูกตัดออก โดยยังคงลำดับที่ผู้เรียกจัดไว้
- การสอบถามฟอนต์ที่ติดตั้งไว้จะปฏิเสธการแทนที่เงียบ ๆ ของ GDI ก่อนยอมรับว่าครอบคลุม
- scalar ใน supplementary plane ถูกถอดจาก UTF-16 surrogate pair ก่อนจัดประเภท
- การ fallback แต่ละรอบใช้ฟอนต์ Type0 ที่ฝังไว้เดิม การ subset,
ToUnicodeและเส้นทางฟอนต์ข้ามหน้าร่วมกัน - การตรวจ fallback layout ใช้ font family ที่ติดตั้งไว้กับ face bold/italic ที่ขอ คงค่า font style, charset, ขนาด และทิศทางการเขียนไว้ครบทุก run แล้วคืนฟอนต์ของผู้เรียกให้เหมือนเดิมหลังเสร็จ
การวินิจฉัยที่นำไปใช้ได้จริง
AnalyzeUnresolvedGlyphs ทำการตรวจ coverage แบบอ่านอย่างเดียว ขณะที่ TextOutWithFallback บันทึก scalar ที่ยังไม่ได้คำตอบที่เจอระหว่างเอาต์พุต
THPDFUnresolvedGlyphInfo แต่ละตัวมี code point ของ scalar, face หลัก, สคริปต์ที่จัดไว้ และรายการคำแนะนำ fallback คั่นด้วยเครื่องหมายอัฒภาค
GetUnresolvedGlyphs คืนรายงานปัจจุบันของเอกสาร และ ClearUnresolvedGlyphs เริ่มช่วงรายงานใหม่
overload แบบระบุสไตล์ของ THotPDF.ResolveFontForCodePoint กับ THotPDF.AnalyzeUnresolvedGlyphs รับ TFontStyles เพื่อให้ preflight ตรวจ face เดียวกับที่ใช้ตอน output ได้ ส่วน overload เดิมยังคงตรวจ face แบบ regular
text box, ข้อความที่ฝังใน SVG และ appearance ข้อความของเอกสารที่โหลด จะคง font family ที่มีสไตล์ไว้ตลอดการจัด fallback layout แทนที่จะเอาชื่อฟอนต์ภายในของ PDF ไปนับเป็น system family หรือดันทุก run ไปใช้ face แบบ regular
การเขียน CJK แนวตั้ง
THPDFPage.TextOutVertical เลือกตัวแปรแนวตั้งของ face ปัจจุบัน แล้วปล่อย text run เดียวแบบ Identity-V แทนการจัดตำแหน่งตัวอักษรทีละตัวด้วยมือ
- ฟอนต์ลูก CID มีค่า default
/DW2และรายการ/W2เฉพาะ glyph - OpenType
vheaกับvmtxให้ advance แนวตั้งและ top side bearing, origin ของ TrueType ไขได้จาก bounding box ของglyfแต่ละตัว ส่วนVORGให้ค่า default origin ของ CFF ที่เชื่อถือได้พร้อมข้อยกเว้น - ฟอนต์ที่ไม่มีตารางแนวตั้ง ใช้ค่า default advance 1000 หน่วยและจุดกำเนิด 880 หน่วยที่ปรับได้
- เมื่อเปิด
sfVerticalAlternatesรอบ GSUB แบบคงความยาวเต็มชุดจะใช้vrt2เมื่อฟอนต์ประกาศไว้ มิฉะนั้นจะตกไปใช้vertโดยยังคงการเลือกสคริปต์กับภาษาที่กำลังใช้ - เมื่อฟอนต์ไม่ให้ substitution ของเครื่องหมายวรรคตอนแต่ map presentation form แนวตั้งของ Unicode ไว้ จุด, หยุด, วงเล็บ, ขีด, จุดไข่ปลา และเครื่องหมายวรรคตอนที่เกี่ยวข้องจะใช้ glyph เหล่านั้น ขณะที่
ToUnicodeคงข้อความต้นฉบับไว้ - feature GPOS แนวตั้ง
vkrnกับvpalยังใช้ได้ผ่านShapingFeatures GetVerticalTextAdvanceคืนค่า advance ในระบบพิกัดผู้ใช้ที่ต้องใช้วางตำแหน่ง run แนวตั้งถัดไป
ตัวอย่าง
PDF.SetFontFallbackChain(hfsCJK,
['Microsoft YaHei UI', 'Yu Gothic UI', 'Malgun Gothic']);
PDF.SetFontFallbackChain(hfsEmoji, ['Segoe UI Emoji']);
PDF.CurrentPage.SetFont('Arial', [], 12);
PDF.CurrentPage.TextOutWithFallback(72, 72, 0, Text);
PDF.CurrentPage.SetFont('Yu Gothic UI', [], 14);
PDF.CurrentPage.TextOutVertical(420, 72, VerticalText);
Missing := PDF.GetUnresolvedGlyphs;