PDFlibPas מצייר טקסט יפני וסיני כלפי מטה בעמוד. SetVerticalWritingMode מפעיל כתיבה אנכית, קריאות DrawText רגילות אז זורמות כלפי מטה, ו-GetVerticalWritingMode מדווח על המצב הנוכחי. לפני שזה התקיים, הצבת טקסט אנכית פירושה למקם כל תו ביד ולקוות שהמרווח ייראה בסדר
כתיבה אנכית אינה טקסט אופקי מסובב תשעים מעלות. התווים נשארים זקופים, ההתקדמות רצה כלפי מטה במקום לרוחב, ומספר תווים משנים צורה לחלוטין — וזה החלק שמפריד מסמך שנקרא באופן טבעי ממסמך שקורא יפני מזהה מיד כמיוצר-מכונה
מה משתנה בתוך ה-PDF
טקסט שמצויר כך עובר דרך גופן Type0 במצב כתיבה אנכית שנושא את מדדי האנך המקוריים של הגופן. זה חשוב בשני כיוונים. קורא מקדם כל תו במרחק שהמעצב שלו התכוון אליו במקום בצעד אחיד, כך שלעמודה יש את הקצב שהגופן עוצב עבורו. והעתקת הטקסט החוצה מחזירה את התווים המקוריים, משום שהריצה האנכית היא עדיין טקסט אמיתי עם מיפוי תקין במקום רצף של גליפים ממוקמים
גופן שאינו נושא מדדי אנך משלו מקדם em אחד לכל תו, שזה מה שקורא היה עושה עם ברירת המחדל. אותה חזרה-לאחור כדאי להכיר משום שהיא ההבדל שתראה כשמסמך מוצג נכון עם גופן CJK תקין ונראה מרווח מכנית עם גופן לטיני שקורה להכיל קצת קאנה
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;
למה סוגריים נראים שגויים בטקסט אנכי?
מפני שלסוגר יש שתי צורות ורק אחת מהן שייכת לעמודה. סוגריים, סימן התנועה הארוכה והקאנה הקטנים מצוירים אחרת כשטקסט רץ כלפי מטה בעמוד — סוגריים מסתובבים כדי לשבת לאורך העמודה במקום לשכב לרוחבה, וסימן התנועה הארוכה הופך לקו אנכי. ציור הצורות האופקיות בעמודה אנכית וכל אחד מהם שוכב על צידו
PDFlibPas לוקח את הצורות מתכונת האנך המקורית של הגופן, כך שכל גופן מספק את מה שהמעצב שלו צייר במקום תחליף שנוחש מהתו. הבחנה זו חשובה לנכונות: טבלת תחליפים שנוחשה צודקת למקרים הנפוצים וטועה לגופנים שמתייחסים לתו אחרת, וגופן שאינו מציין צורות אנכיות מצויר בדיוק כפי שהיה במקום להידחף דרך טבלה שמעולם לא ביקש
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 עם מדדי אנך תקינים ותכונה אנכית מייצר פלט נכון ללא עבודה נוספת; גופן בלעדיהם מייצר תווים זקופים שמתקדמים em אחד בכל פעם וללא שום שינויי צורה. אם טקסט אנכי נראה לא-נכון בעדינות, יש לבחון את הגופן לפני בחינת הקוד
הטמעה פועלת לפי הכללים והעלויות הרגילים. גופן CJK מלא גדול, כך שתת-קבוץ אינו אופציונלי למסמכים שהולכים לשום מקום — ההערות על אופטימיזציית גודל קובץ PDF ותת-קבוץ גופנים מכסות למה לצפות, והסקירה של הטמעת גופנים חסרים ב-PDF קיים מכסה את מקרה התיקון כשמסמך אנכי מגיע בלי הגופנים שלו
היכן טקסט אנכי עדיין דורש ממך החלטת פריסה
סדר עמודות. טקסט יפני אנכי זורם מימין לשמאל לפי עמודות, כך שעמוד דו-עמודתי מתחיל בשפה הימנית, ואף הגדרת מצב כתיבה אינה יכולה להסיק זאת מהטקסט. אותו הדבר חל על סדר עמודים במסמך שנקרא מימין לשמאל כשלם, ועל מיקום פוריגאנה, הערות שוליים וכיתובי תמונות
מה שהספרייה מבטיחה הוא שכל ריצה מוצבת נכון: צורות נכונות, קידום נכון, טקסט שניתן לחילוץ. לאן הריצות הולכות בעמוד זו בעיית פריסה, ולמסמכים שמורכבים מנתונים הסקירה של חיפוש טקסט וספירת אלמנטי עמוד שימושית לאימות לאחר מכן שמה שנחת על העמוד הוא מה שהתכוונת
PDFlibPas היא ספריית PDF מקורית בפסקל לדלפי, C++Builder ו-Lazarus, וכתיבת CJK אנכית היא חלק מממשק הציור במקום תוסף — ראה את דף המוצר של PDFlibPas לרשימת תכונות הטקסט והגופנים