PDFlibPas วาดข้อความญี่ปุ่นและจีนลงตามแนวหน้า SetVerticalWritingMode เปิดโหมดการเขียนแนวตั้ง คำสั่ง DrawText ธรรมดาจะวิ่งลง และ GetVerticalWritingMode รายงานสถานะปัจจุบัน ก่อนที่สิ่งนี้จะมีอยู่ การตั้งข้อความแนวตั้งหมายถึงการวางทุกตัวอักษรด้วยมือแล้วหวังว่าระยะห่างจะดูถูกต้อง
การเขียนแนวตั้งไม่ใช่ข้อความแนวนอนที่หมุนเก้าสิบองศา ตัวอักษรยังคงตั้งตรง การเคลื่อนวิ่งลงแทนที่จะไปทางข้าง และอักษรหลายตัวเปลี่ยนรูปร่างโดยสิ้นเชิง — ซึ่งเป็นส่วนที่แยกความแตกต่างระหว่างเอกสารที่อ่านเป็นธรรมชาติกับเอกสารที่ผู้อ่านชาวญี่ปุ่นรู้ทันทีว่าผลิตด้วยเครื่อง
อะไรเปลี่ยนภายใน PDF
ข้อความที่วาดแบบนี้ผ่านแบบอักษร Type0 ในโหมดการเขียนแนวตั้งที่พก vertical metric ของตัวเอง นั่นสำคัญในสองทาง ตัวอ่านเคลื่อนแต่ละอักษรตามระยะที่ผู้ออกแบบตั้งใจไว้ แทนที่จะเป็นขั้นสม่ำเสมอ คอลัมน์จึงมีจังหวะที่แบบอักษรถูกออกแบบมาเพื่อ และการคัดลอกข้อความออกคืนอักษรเดิม เพราะรันแนวตั้งยังคงเป็นข้อความจริงที่มีการแมปที่เหมาะสม ไม่ใช่ลำดับของ glyph ที่ถูกจัดวาง
แบบอักษรที่ไม่พก vertical metric ของตัวเองจะเคลื่อนที่หนึ่ง em ต่ออักษร ซึ่งคือสิ่งที่ตัวอ่านจะทำด้วยค่าเริ่มต้น ทางเลือกสำรองนี้ควรรู้ไว้เพราะมันคือความแตกต่างที่คุณจะเห็นเมื่อเอกสารเรนเดอร์ถูกต้องด้วยแบบอักษร CJK ที่เหมาะสม แต่ดูมีระยะห่างแบบเครื่องกับแบบอักษรละตินที่บังเอิญมี kana อยู่บ้าง
var
Lib: TPDFlib;
H: Double;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('MS Mincho', 1); // 1 = embed the face
Lib.SetTextSize(12);
Lib.SetVerticalWritingMode(1); // ordinary DrawText now runs down
H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
Lib.DrawText(480, 72, '第三章 保守点検');
Lib.SetVerticalWritingMode(0); // back to horizontal
Lib.DrawText(72, 72 + H, 'Chapter 3');
Lib.SaveToFile('manual-ja.pdf');
finally
Lib.Free;
end;
end;
ทำไมวงเล็บจึงดูผิดในข้อความแนวตั้ง
เพราะวงเล็บมีสองรูปแบบและมีเพียงรูปแบบเดียวเท่านั้นที่อยู่ในคอลัมน์ได้ วงเล็บ เครื่องหมายสระยาว และ kana เล็กถูกวาดต่างกันเมื่อข้อความวิ่งลงหน้า — วงเล็กหมุนไปนั่งตามแนวคอลัมน์แทนที่จะนอนขวาง และเครื่องหมายสระยาวกลายเป็นเส้นแนวตั้ง วาดรูปแนวนอนในคอลัมน์แนวตั้งแล้วทุกตัวจะนอนตะแคง
PDFlibPas เอารูปแบบจาก vertical feature ของแบบอักษรเอง ดังนั้นแต่ละแบบอักษรจึงส่งสิ่งที่ผู้ออกแบบวาดไว้ ไม่ใช่การแทนที่ที่เดาจากอักษร ความแตกต่างนี้สำคัญต่อความถูกต้อง ตารางการแทนที่ที่เดาไว้ถูกในกรณีทั่วไปแต่ผิดในแบบอักษรที่ปฏิบัติอักษรตัวหนึ่งต่างออกไป และแบบอักษรที่ไม่ระบุรูปแนวตั้งจะถูกวาดเหมือนเดิมทุกประการ ไม่ถูกบังคับผ่านตารางที่มันไม่เคยขอ
GetVerticalTextHeight วัดรูปแบบที่จะถูกวาดจริง ดังนั้นคอลัมน์ที่อักษรเปลี่ยนรูปยังคงถูกวัดได้อย่างถูกต้อง การวัดรูปแนวนอนแล้ววาดรูปแนวตั้งคือสาเหตุคลาสสิกของคอลัมน์ที่ล้นกรอบไปสองสามตัวอักษร
การวาดรันเดียวโดยไม่เปลี่ยนโหมด
DrawVerticalText วาดรันเดียวเป็นแนวตั้ง รับตำแหน่ง ชื่อแบบอักษร ขนาด และข้อความ แล้วปล่อยโหมดการเขียนไว้ไม่เปลี่ยน ใช้สำหรับข้อยกเว้นแนวตั้งในเอกสารแนวนอน — ป้ายบนกระดูกสันหลังหนังสือ ตราปั๊ม คอลัมน์ชื่อเดียว — ที่การสลับโหมดรวมเปิดปิดรอบทุกคำสั่งเป็นสถานะมากเกินกว่าที่งานต้องการ
รูปแนวนอนและแนวตั้งของแบบอักษรเดียวถูกเก็บแยกกันภายใน ดังนั้นหน้าหนึ่งจึงพกทั้งสองได้โดยไม่รบกวนกัน นั่นคือสิ่งที่ทำให้หน้าผสมใช้งานได้จริง หนังสือญี่ปุ่นที่เนื้อหาเป็นแนวตั้งแต่ส่วนหัวท้ายเป็นแนวนอน หรือใบรับรองจีนที่หัวเรื่องเป็นแนวตั้งเหนือรายละเอียดแนวนอน
// One vertical run inside an otherwise horizontal page
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// The horizontal text around it is unaffected
Lib.DrawText(72, 96, 'Maintenance inspection record');
การทำแบบอักษรให้ถูกต้องก่อนสิ่งอื่นใด
การเขียนแนวตั้งขึ้นอยู่กับแบบอักษรทั้งหมด แบบอักษร CJK ที่มี vertical metric ที่เหมาะสมและ vertical feature จะผลิตเอาต์พุตที่ถูกต้องโดยไม่ต้องทำอะไรเพิ่ม แบบอักษรที่ไม่มีสิ่งเหล่านั้นจะผลิตอักษรตั้งตรงที่เคลื่อนที่ละหนึ่ง em และไม่มีการเปลี่ยนรูปเลย หากข้อความแนวตั้งดูผิดเล็กน้อย ให้ตรวจสอบแบบอักษรก่อนตรวจสอบโค้ด
การฝังตามกฎปกติและต้นทุนปกติ แบบอักษร CJK ฉบับเต็มมีขนาดใหญ่ ดังนั้น subsetting จึงไม่ใช่ตัวเลือกสำหรับเอกสารที่จะส่งไปที่ใด — บันทึกของ การเพิ่มประสิทธิภาพขนาดไฟล์ PDF และ font subsetting ครอบคลุมสิ่งที่ควรคาดหวัง และคู่มือ การฝังแบบอักษรที่ขาดหายไปใน PDF ที่มีอยู่ ครอบคลุมกรณีซ่อมแซมเมื่อเอกสารแนวตั้งมาถึงโดยไม่มีแบบอักษรของมัน
จุดที่ข้อความแนวตั้งยังต้องการการตัดสินใจเลย์เอาต์จากคุณ
ลำดับคอลัมน์ ข้อความแนวตั้งญี่ปุ่นวิ่งขวาไปซ้ายตามคอลัมน์ ดังนั้นหน้าสองคอลัมน์จะเริ่มที่ขอบขวา และไม่มีการตั้งค่าโหมดการเขียนใดอนุมานสิ่งนั้นจากข้อความได้ สิ่งเดียวกันใช้กับลำดับหน้าในเอกสารที่อ่านขวาไปซ้ายทั้งเล่ม และกับตำแหน่งที่ furigana เชิงอรรถ และคำบรรยายรูปวางอยู่
สิ่งที่ไลบรารีรับประกันคือแต่ละรันถูกตั้งอย่างถูกต้อง รูปแบบที่ถูกต้อง การเคลื่อนที่ที่ถูกต้อง ข้อความที่สกัดได้ จุดที่รันจะไปบนหน้าเป็นปัญหาเลย์เอาต์ และสำหรับเอกสารที่ประกอบจากข้อมูล คู่มือ การค้นหาข้อความและการแจงนับองค์ประกอบหน้า เป็นประโยชน์สำหรับการตรวจสอบภายหลังว่าสิ่งที่ลงบนหน้าคือสิ่งที่คุณตั้งใจ
PDFlibPas เป็นไลบรารี PDF แบบ Pascal พื้นเมืองสำหรับ Delphi, C++Builder และ Lazarus และการเขียน CJK แนวตั้งเป็นส่วนหนึ่งของ API การวาด ไม่ใช่ส่วนเสริม — ดู หน้าผลิตภัณฑ์ PDFlibPas สำหรับรายการคุณสมบัติข้อความและแบบอักษร