תמיכה בעיצוב ערבית / פרסית / אורדו

צינור עיצוב בצד היצרן (v2.85.0 - v2.119.68)

OpenType GSUB Engine  CFF / OpenType Subsetting

HotPDF מריץ צינור עיצוב בצד היצרן המקפל ריצות ערבית, פרסית ואורדו של קלט יוניקוד לצורות תצוגה בערבית במהלך פליטת טקסט PDF, כך שקוראי קצה מקבלים גליפים של מיקום / ליגטורה המוכנים לרינדור ללא צורך במעצב מסוג Harfbuzz משלהם

מה הצינור עושה

עיצוב מיקומי (v2.85.0): לכל אות בסיס בערבית יש עד ארבע צורות מיקומיות - מבודדת (isol), תחילית (init), אמצעית (medi), סופית (fina). HotPDF בודק את מחלקת החיבור של כל תו ערבי ואת מחלקות החיבור של השכנים המיידיים שלו, ואז ממפה את נקודת הקוד של הקלט לגליף המתאים ב-Arabic Presentation Forms-B (U+FE70 - U+FEFC) לפני הפליטה. אותיות שאינן מתחברות, מחברים, תווים שקופים (סימני שילוב) ו-Tatweel kashida מטופלים כולם לפי אלגוריתם עיצוב הערבית של יוניקוד

ליגטורה מנדטורית LAM-ALEF (v2.119.32): מפרט עיצוב הערבית של יוניקוד מחייב שכל LAM (U+0644) שאחריו מגיע מיד ALEF (U+0627 רגיל, U+0622 עם madda מעל, U+0623 עם hamza מעל, U+0625 עם hamza מתחת) יקופל לגליף ליגטורה יחיד (צורות מבודדות / סופיות U+FEFB - U+FEFC עם גרסאות hamza / madda מתאימות). זוהי אחת מהליגטורות הבודדות שאינן אופציונליות בטיפוגרפיה ערבית והיא נדרשת לצורך תקינות; רינדור שלהן כגליפים נפרדים מייצר טקסט שקוראים שפת אם מזהים מיד כפגום. HotPDF מבצע את הקיפול במהלך הפליטה כך שקוראים אינם זקוקים למעצב מסוג Harfbuzz בנתיב הקוד שלהם

9 אותיות ליבה של פרסית / אורדו (v2.119.35): פרסית ואורדו מרחיבות את הערבית עם אותיות שאינן בבלוק Arabic Presentation Forms-B (U+FE70 - U+FEFC). 9 האותיות הנפוצות ביותר מסוג זה - כולל PEH (U+067E), TCHEH (U+0686), JEH (U+0698), KEH (U+06A9 / U+06AF), GAF (U+06AF), NOON GHUNNA (U+06BA), HEH DOACHASHMEE (U+06BE), YEH BARREE (U+06D2) ו-HEH GOAL (U+06C1) - הן בעלות צורות תצוגה ב-Arabic Presentation Forms-A (U+FB50 - U+FDFF). HotPDF ממפה כעת אותיות אלו לגליף Forms-A המתאים במהלך עיצוב מיקומי, כך שטקסט בפרסית ובאורדו מרונדר עם צורות init / medi / fina / isol הנכונות בכל קורא קצה

ערבית Extended-A + Supplement (v2.119.52, v2.119.56): טבלת מחלקות החיבור מכסה כעת את שאר תווים של ערבית Extended-A (גרסאות ALEF WASLA / NOON GHUNNA / HEH), ערבית Supplement U+0750-U+077F וטווח ערבית Extended-A הגבוה יותר U+08A0-U+08FF. תווים עם קידוד Presentation Forms-A סטטי ממופים דרך המעצב הקיים של 4 עמדות; תווים ללא (רוב Extended-A) מקבלים סיווג מחלקת חיבור בלבד כך ששכנים יעוצבו בצורה נכונה גם כאשר התו עצמו מועבר ללא שינוי. גרסה v2.119.56 תיקנה שני מיפויים שגויים של Forms-A שהוצגו על ידי v2.119.52 (U+06C2 / U+06C3)

כיסוי מלא של פרסית / אורדו Form-B (v2.119.57): טבלת מחלקות החיבור הורחבה כדי להקיף את מלוא הטווח U+0672-U+06D5 (כ-80 תווים המכסים גרסאות של REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH), ונוספו 26 מיפויים חדשים של Presentation Forms-A (15 מסוג D-class 4-form + 11 מסוג R-class 2-form). בפרט, HEH DOACHASHMEE הסטנדרטית של אורדו 'h' (U+06BE → FBAA-FBAD) ו-yeh הסופית של מילים באורדו YEH BARREE (U+06D2 → FBAE-FBAF) ממופות כעת בצורה נכונה לחריצי Forms-A שנוצלו לרעה על ידי התיקון הזמני v2.119.52 ALEF WASLA / NOON GHUNNA. הכיסוי הסטטי של Forms-A מקיף כעת יותר מ-40 תווים של מקור

מעבר עוקב (post-pass) לליגטורת YEH-HAMZA + תנועה (v2.119.58): מעבר עוקב שנוסף ל-_ApplyArabicShaping לאחר עיצוב מיקומי מכסה את 8 זוגות הליגטורות בבלוק Forms-A U+FBEA-U+FBFB - YEH-HAMZA + ALEF / AE / WAW / U / OE / YU / E / ALEF MAKSURA. כל זוג פולט את הצורה המבודדת (FBEA / FBEC / FBEE / FBF0 / FBF2 / FBF4 / FBF6 / FBF9) בתוספת הצורה הסופית בסיס+1. חריצי הצורה התחלתית / אמצעית FBF8 / FBFB מושארים למנוע ה-GSUB דרך הצטרפות (opt-in) של sfArabicGSUB. נבנה על אותו שלד של v2.119.32 LAM-ALEF

ליגטורת אללה (v2.119.60): רצף ארבעת התווים ALEF + LAM + LAM + HEH מתקפל ל-U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM. מיושם כמעבר עוקב (post-pass) סטטי ברמת נקודת קוד לאחר v2.119.32 LAM-ALEF ו-v2.119.58 YEH-HAMZA בשרשרת _ApplyArabicShaping

ליגטורת המשפט בסמאללה (v2.119.62): משפט הבסמאללה הסטנדרטי בן 22 נקודות הקוד "بسم الله الرحمن الرحيم" מתקפל לגליף יחיד U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. מורץ כמעבר מקדים (pre-pass) הראשון ב-_ApplyArabicShaping (לפני LAM-ALEF), כך שגליף הבסמאללה המקופל מגיע לשאר הצינור כנקודת קוד אחת ואינו עובר שינוי על ידי החלפות במורד הזרם

עוזרי שאילתות ציבוריים

GetArabicJoiningClass מחזיר את מחלקת החיבור של יוניקוד המשמשת את מעצב הערבית הסטטי. GetArabicPosition פותר תו אחד בריצה למיקום מבודד, תחילי, אמצעי או סופי כך שקוראים יכולים לבדוק או לשקף את אותן החלטות עיצוב לפני פליטת טקסט

כיצד קוראים מפעילים זאת

צינור העיצוב פועל באופן אוטומטי בתוך מתודות פליטת הטקסט ביוניקוד - אין צורך בקריאה מפורשת של "עצב זאת". העבר מחרוזות קלט יוניקוד בערבית / פרסית / אורדו ל-THPDFPage.UnicodeTextOut או ל-THPDFPage.RtLTextOut ו-HotPDF ממפה כל נקודת קוד של קלט לצורת התצוגה שלה לפני כתיבת אופרטור הצגת הטקסט של ה-PDF. בתיי היוניקוד המקוריים נלכדים גם ב-FUnicodeUsedCps עבור יצירת ToUnicode CMap, כך שהעתק/הדבק בצד הקורא וקוראי מסך עדיין רואים את מטען היוניקוד המקורי

דרישות גופן

הגופן שנרשם באמצעות RegisterUnicodeTTF חייב להכיל גליפים הן עבור בלוק Arabic Presentation Forms-B (U+FE70 - U+FEFC) והן (עבור פרסית / אורדו) עבור טווח Arabic Presentation Forms-A הרלוונטי (U+FB50 - U+FDFF). גופנים מומלצים שמגיעים עם הסט המלא:

Noto Sans Arabic (לטינית + ערבית; Forms-A + Forms-B + ערבית Extended-A)

Noto Naskh Arabic, Noto Naskh Arabic UI

Amiri (נאסק מסורתי, כיסוי מלא של Forms-A + Forms-B)

Scheherazade New (SIL, מיועד לשפות העולם המוסלמי)

Microsoft Arabic Typesetting / Tahoma / Times New Roman (מגיע עם Windows, כיסוי Forms-B מלא; לחלקם יש כיסוי Forms-A)

כאשר לגופן הרשום חסר גליף עבור צורת תצוגה נגזרת, HotPDF חוזר לנקודת הקוד הבסיסית של יוניקוד ופולט אותה ללא שינוי; קוראי קצה עשויים לנסות עיצוב משלהם (Acrobat, Foxit) או לרנדר .notdef

זרימת עבודה טיפוסית

PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');

PDF.BeginDoc;

PDF.CurrentPage.SetFont('NotoArab', [], 14);

PDF.CurrentPage.RtLTextOut(100, 700, 0,

UnicodeString(#$0645#$0631#$062D#$0628#$0627)); // "marhaba" (hello)

PDF.EndDoc;

שילוב צינור אוטומטי של שלב 8 (v2.119.59 - v2.119.68)

v2.119.59 הציג את מאפיין ההצטרפות (opt-in) ShapingFeatures: THPDFShapingFeatures ואת המונה THPDFShapingFeature, אשר מעלים את צינור העיצוב מעבר לקיפול סטטי במעבר עוקב להחלפה מונחת GSUB אוטומטית ספציפית לגופן. הגדר PDF.ShapingFeatures := [sfArabicGSUB] כדי להחיל את חיפושי הערבית המקומיים init, medi, fina, isol, rlig, calt ו-rclt של הגופן הרשום ולפלוט את מזהי הגליפים ההקשריים שנוצרו; הוסף sfCursiveAttachment כדי להחיל עוגני כניסה/יציאה מקושרים של GPOS על אותה ריצה מעוצבת; הוסף sfStandardLigatures עבור ליגטורות לטיניות סטנדרטיות (FB00-FB06 ff / fi / fl / ffi / ffl / ſt / st באמצעות v2.119.65 ApplyLatinLigatureRefinement); הוסף sfIndicShaping כדי לאפשר שינוי סדר מעבר מקדים של Devanagari (v2.119.67). ברירת המחדל [] שומרת על פלט זהה ברמת הבתים עבור קוראים התלויים במעצב הסטטי

כאשר sfArabicGSUB מוגדר, מעצב צורות התצוגה הסטטי של יוניקוד נעקף לטובת כללי ה-GSUB של הגופן עצמו. HotPDF פולט מזהי גליפים הקשריים מקומיים דרך נקודות קוד סינתטיות כאשר גליפים אלו אינם נגישים מה-cmap של הגופן, שומר על תת-הקבוצה המוטמעת סגורה, וכותב מיפויי ToUnicode הפוכים להעתקה והדבקה. קוראים שרוצים שמעצב הסטטי ימשיך לפעול עבור כיסוי נקודות קוד מחוץ למה שהצהרות ה-GSUB של הגופן מצהירות צריכים להשאיר את sfArabicGSUB כבוי ולהסתמך על שרשרת המעבר העוקב הסטטית

מיפוי ToUnicode CMap הפוך של ליגטורות (v2.119.61, v2.119.62, v2.119.65)

ה-Adobe-Identity-UCS ToUnicode CMap שנפלט על ידי RegisterUnicodeTTF מגיע עם ערכי מיפוי הפוך של bfchar עבור כל נקודת קוד של ליגטורה ששרשרת המעבר העוקב יכולה לייצר. גרסה v2.119.61 הוסיפה 27 ערכים (8 LAM-ALEF + 18 ממשפחת YEH-HAMZA + 1 אללה); v2.119.62 הוסיפה בסמאללה (U+FDFD); v2.119.65 הוסיפה 7 ערכי ליגטורה לטינית סטנדרטית (FB00-FB06). העתקה והדבקה של קורא קצה פותרת כל גליף ליגטורה בחזרה לרצף נקודות הקוד של המקור, כך שה-PDF המרונדר נשאר נגיש

פליטת נקודת קוד סינתטית של PUA (v2.119.68)

AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word מאפשרים לקוד היצרן לפלוט גליפי תחליף GSUB שאין להם נקודת קוד יוניקוד טבעית הנגישה דרך ה-cmap של הגופן. המקצה מחלק נקודות קוד ב-Private Use Area (U+E000 - U+F8FF, 6400 חריצים) ומשקף את ההקצאה לתוך FUnicodeCpToGid (כך ש-/CIDToGIDMap פותר את נקודת הקוד הסינתטית בחזרה ל-GID המטרה בקורא הקצה), לתוך FAcroFormUnicodeAdvances (כך שיישור מילים v2.65 מוצא את שבר ה-em הנכון), ולטבלת חיפוש הפוכה לכל GID (כך שבקשות הקצאה חוזרות הן אידמפוטנטיות). השתמש בזה עבור צורות צבירי Devanagari, חלופות סגנוניות ורצפי וריאציות אידיאוגרפיות של CJK ש-GSUB מציג אך cmap אינו מגיע אליהן

קשר למנוע ה-OpenType GSUB

מעצב המעבר העוקב הסטטי שתואר לעיל (v2.85.0 + v2.119.32 / 58 / 60 / 62) אינו תלוי ב-מנוע ה-OpenType GSUB כברירת מחדל. כאשר sfArabicGSUB מופעל דרך ShapingFeatures, מנוע ה-GSUB הופך לחלק מנתיב הפליטה בצד היצרן: HotPDF מתייעץ עם ה-cmap כדי לבנות מערך GID בסיסי, מחיל חיפושי GSUB מיקומיים והקשריים של ערבית מקורית על ריצת גליפים זו, מקצה נקודות קוד סינתטיות עבור מזהי גליפים חלופיים שאין להם צורת תצוגה של יוניקוד, וקורא ל-MarkUnicodeGlyphUsed כדי לשמור את הגליפים החלופיים בתוך תת-קבוצת הגופן המוטמעת

עבור גליפי תחליף ללא נקודת קוד יוניקוד, קוראים משלבים את ShapingFeatures עם מקצה נקודות הקוד הסינתטיות PUA v2.119.68 כך שגליף התחליף עדיין נגיש דרך צינור ההקס הסטנדרטי. שרשרת המעבר העוקב הסטטית נשארת ברירת המחדל עבור נקודות קוד שהצהרות ה-GSUB של הגופן אינן מכסות

טווח ומגבלות

אלגוריתם ה-BiDi נשאר מחוץ לדף זה: קוראים עדיין צריכים לסדר ריצות מעורבות של LTR ו-RTL בעצמם או להשתמש בספריית BiDi נפרדת. GPOS, Indic/Tibetan/Mongolian, Hebrew, N'Ko, אדלאם, תאית/לאו, וג'אוונית נמצאים כעת בדפי דגלי עיצוב ו-API נפרדים להצטרפות, כך שדף זה מתמקד רק בעיצוב ערבית סטטי ומבוסס GSUB

ראה גם: