|
Arabic / Persian / Urdu Shaping Support Producer-side shaping pipeline (v2.85.0 - v2.119.68)
|
OpenType GSUB Engine CFF / OpenType Subsetting |
|
Το HotPDF εκτελεί pipeline shaping στην πλευρά παραγωγού που μετατρέπει Unicode είσοδο αραβικών, περσικών και ουρντού σε Arabic Presentation Forms κατά την εκπομπή κειμένου PDF, ώστε οι καταναλωτές ανάγνωσης να λαμβάνουν έτοιμα προς απόδοση positional / ligature glyphs χωρίς να χρειάζονται δικό τους shaper επιπέδου Harfbuzz
What the pipeline does Positional shaping (v2.85.0): κάθε βασικό αραβικό γράμμα έχει έως τέσσερις positional forms - isolated (isol), initial (init), medial (medi), final (fina). Το HotPDF εξετάζει την join class κάθε αραβικού χαρακτήρα και τις join classes των άμεσων γειτόνων του, έπειτα χαρτογραφεί το input codepoint στο κατάλληλο glyph Arabic Presentation Forms-B (U+FE70 - U+FEFC) πριν την εκπομπή. Non-joining γράμματα, joiners, transparent characters (combining marks) και το Tatweel kashida αντιμετωπίζονται όλα σύμφωνα με τον αλγόριθμο Unicode Arabic Shaping
Υποχρεωτική ligature LAM-ALEF (v2.119.32): η προδιαγραφή Arabic Unicode Shaping απαιτεί κάθε LAM (U+0644) που ακολουθείται αμέσως από ALEF (U+0627 απλό, U+0622 με madda επάνω, U+0623 με hamza επάνω, U+0625 με hamza κάτω) να συγχωνεύεται σε ένα ligature glyph (U+FEFB - U+FEFC isolated / final forms με τις κατάλληλες παραλλαγές hamza / madda). Είναι από τις ελάχιστες μη προαιρετικές ligatures στην αραβική τυπογραφία και απαιτείται για ορθότητα· η απόδοσή τους ως ξεχωριστά glyphs παράγει κείμενο που φυσικοί αναγνώστες αναγνωρίζουν αμέσως ως εσφαλμένο. Το HotPDF εκτελεί τη συγχώνευση κατά την εκπομπή, ώστε οι callers να μη χρειάζονται shaper επιπέδου Harfbuzz στη δική τους διαδρομή κώδικα
Βασικά 9 γράμματα Persian / Urdu (v2.119.35): τα περσικά και ουρντού επεκτείνουν τα αραβικά με γράμματα που δεν ανήκουν στο block 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) - έχουν presentation forms στο Arabic Presentation Forms-A (U+FB50 - U+FDFF). Το HotPDF πλέον χαρτογραφεί αυτά τα γράμματα στα κατάλληλα Forms-A glyphs κατά το positional shaping, ώστε περσικό και ουρντού κείμενο να αποδίδεται με τις σωστές init / medi / fina / isol μορφές σε κάθε καταναλωτή ανάγνωσης
Arabic Extended-A + Supplement (v2.119.52, v2.119.56): ο πίνακας joining-class καλύπτει πλέον τους υπόλοιπους χαρακτήρες Arabic Extended-A (ALEF WASLA / NOON GHUNNA / HEH variants), Arabic Supplement U+0750-U+077F και το υψηλότερο εύρος Arabic Extended-A U+08A0-U+08FF. Χαρακτήρες με στατική κωδικοποίηση Presentation Forms-A χαρτογραφούνται μέσω του υπάρχοντος shaper 4 θέσεων· χαρακτήρες χωρίς τέτοια μορφή (οι περισσότεροι του Extended-A) λαμβάνουν μόνο ταξινόμηση joining-class ώστε οι γείτονες να σχηματίζονται σωστά ακόμη και όταν ο ίδιος ο χαρακτήρας περνά αμετάβλητος. Η v2.119.56 διόρθωσε δύο λανθασμένες Forms-A χαρτογραφήσεις που εισήχθησαν από τη v2.119.52 (U+06C2 / U+06C3)
Πλήρης κάλυψη Persian / Urdu Form-B (v2.119.57): ο πίνακας joining-class επεκτάθηκε σε όλο το εύρος 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). Ειδικά, το τυπικό Urdu 'h' HEH DOACHASHMEE (U+06BE → FBAA-FBAD) και το τελικό λέξης Urdu yeh YEH BARREE (U+06D2 → FBAE-FBAF) πλέον χαρτογραφούνται σωστά στις θέσεις Forms-A που είχαν χρησιμοποιηθεί λανθασμένα από την προσωρινή διόρθωση ALEF WASLA / NOON GHUNNA της v2.119.52. Η στατική κάλυψη Forms-A πλέον εκτείνεται σε 40+ χαρακτήρες πηγής
YEH-HAMZA + vowel ligature post-pass (v2.119.58): ένα post-pass που προστέθηκε στο _ApplyArabicShaping μετά το positional shaping καλύπτει τα 8 ζεύγη ligature στο block Forms-A U+FBEA-U+FBFB - YEH-HAMZA + ALEF / AE / WAW / U / OE / YU / E / ALEF MAKSURA. Κάθε ζεύγος εκπέμπει την isolated form (FBEA / FBEC / FBEE / FBF0 / FBF2 / FBF4 / FBF6 / FBF9) μαζί με τη base+1 final form. Οι θέσεις starting / medial FBF8 / FBFB αφήνονται στο GSUB engine μέσω opt-in sfArabicGSUB. Βασίζεται στον ίδιο σκελετό με τη LAM-ALEF της v2.119.32
Allah ligature (v2.119.60): η ακολουθία τεσσάρων χαρακτήρων ALEF + LAM + LAM + HEH συγχωνεύεται σε U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM. Υλοποιείται ως στατικό post-pass σε επίπεδο codepoint μετά τα LAM-ALEF της v2.119.32 και YEH-HAMZA της v2.119.58 στην αλυσίδα _ApplyArabicShaping
Bismillah phrase ligature (v2.119.62): η τυπική φράση Bismillah 22 codepoints "بسم الله الرحمن الرحيم" συγχωνεύεται σε ένα glyph U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. Εκτελείται ως το πρώτο pre-pass στο _ApplyArabicShaping (πριν από LAM-ALEF), ώστε το συγχωνευμένο Bismillah glyph να φτάνει στην υπόλοιπη pipeline ως ένα codepoint και να μην τροποποιείται από επόμενες substitutions
Public Query Helpers GetArabicJoiningClass επιστρέφει την Unicode joining class που χρησιμοποιεί ο στατικός αραβικός shaper. GetArabicPosition αναλύει έναν χαρακτήρα μέσα σε run σε isolated, initial, medial ή final position, ώστε οι callers να μπορούν να επιθεωρήσουν ή να αναπαραγάγουν τις ίδιες αποφάσεις shaping πριν εκπέμψουν κείμενο
How callers invoke it Η pipeline shaping εκτελείται αυτόματα μέσα στις μεθόδους εκπομπής Unicode κειμένου - δεν απαιτείται ρητή κλήση "shape this". Περάστε Unicode strings αραβικών / περσικών / ουρντού σε THPDFPage.UnicodeTextOut ή THPDFPage.RtLTextOut και το HotPDF χαρτογραφεί κάθε input codepoint στη presentation form του πριν γράψει τον PDF text-showing operator. Τα αρχικά Unicode bytes καταγράφονται επίσης στο FUnicodeUsedCps για παραγωγή ToUnicode CMap, ώστε copy / paste και screen readers στην πλευρά ανάγνωσης να εξακολουθούν να βλέπουν το αρχικό Unicode payload
Font requirements Η γραμματοσειρά που καταχωρίζεται μέσω RegisterUnicodeTTF πρέπει να περιέχει glyphs τόσο για το block Arabic Presentation Forms-B (U+FE70 - U+FEFC) όσο και (για περσικά / ουρντού) για το σχετικό εύρος Arabic Presentation Forms-A (U+FB50 - U+FDFF). Συνιστώμενες γραμματοσειρές που περιλαμβάνουν πλήρες σύνολο:
Noto Sans Arabic (Latin + Arabic; Forms-A + Forms-B + Arabic Extended-A). Noto Naskh Arabic, Noto Naskh Arabic UI. Amiri (traditional Naskh, full Forms-A + Forms-B coverage). Scheherazade New (SIL, designed for languages of the Muslim world). Microsoft Arabic Typesetting / Tahoma / Times New Roman (Windows-bundled, full Forms-B; some have Forms-A coverage).
Όταν η καταχωρισμένη γραμματοσειρά δεν διαθέτει glyph για παραγόμενη presentation form, το HotPDF επιστρέφει στο βασικό Unicode codepoint και το εκπέμπει αμετάβλητο· οι καταναλωτές ανάγνωσης ενδέχεται τότε να επιχειρήσουν δικό τους shaping (Acrobat, Foxit) ή να αποδώσουν .notdef
Typical workflow
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;
Automatic Phase 8 pipeline integration (v2.119.59 - v2.119.68) v2.119.59 introduced the opt-in
Όταν είναι ορισμένο το sfArabicGSUB, ο στατικός shaper Unicode Presentation Forms παρακάμπτεται υπέρ των GSUB κανόνων της ίδιας της γραμματοσειράς. Το HotPDF εκπέμπει native contextual glyph IDs μέσω synthetic codepoints όταν αυτά τα glyphs δεν είναι προσβάσιμα από το cmap της γραμματοσειράς, κρατά κλειστό το embedded subset και γράφει ToUnicode reverse mappings για copy και paste. Callers που θέλουν να συνεχίσει να τρέχει ο στατικός shaper για κάλυψη codepoints εκτός όσων δηλώνει το GSUB της γραμματοσειράς πρέπει να αφήσουν απενεργοποιημένο το sfArabicGSUB και να βασιστούν στη στατική post-pass αλυσίδα
ToUnicode CMap ligature reverse mapping (v2.119.61, v2.119.62, v2.119.65) The Adobe-Identity-UCS ToUnicode CMap emitted by
PUA synthetic codepoint emit (v2.119.68) AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word επιτρέπουν στον producer code να εκπέμπει GSUB substitute GIDs που δεν έχουν φυσικό Unicode codepoint προσβάσιμο μέσω του cmap της γραμματοσειράς. Ο allocator μοιράζει codepoints στην Private Use Area (U+E000 - U+F8FF, 6400 slots) και αντικατοπτρίζει την ανάθεση στο FUnicodeCpToGid (ώστε το /CIDToGIDMap να επιλύει το synthetic CP πίσω στο target GID στον consumer reader), στο FAcroFormUnicodeAdvances (ώστε το word-wrap της v2.65 να βρίσκει τη σωστή em-fraction) και σε έναν per-GID reverse-lookup πίνακα (ώστε επαναλαμβανόμενα requests ανάθεσης να είναι idempotent). Χρησιμοποιήστε το για Devanagari cluster shapes, stylistic alternates και CJK ideographic variation sequences που εισάγει το GSUB αλλά δεν φτάνει το cmap
Relationship to the OpenType GSUB engine Ο στατικός post-pass shaper που περιγράφεται παραπάνω (v2.85.0 + v2.119.32 / 58 / 60 / 62) είναι από προεπιλογή ανεξάρτητος από το OpenType GSUB engine. Όταν το sfArabicGSUB ενεργοποιείται μέσω ShapingFeatures, το GSUB engine γίνεται μέρος της διαδρομής εκπομπής στην πλευρά παραγωγού: το HotPDF συμβουλεύεται το cmap για να χτίσει base GID array, εφαρμόζει native Arabic positional και contextual GSUB lookups σε αυτό το glyph run, αναθέτει synthetic codepoints για substitute glyph IDs που δεν έχουν Unicode Presentation Form και καλεί MarkUnicodeGlyphUsed για να κρατήσει τα substitute glyphs μέσα στο embedded font subset
Για substitute glyphs χωρίς Unicode codepoint, οι callers συνδυάζουν ShapingFeatures με τον PUA synthetic-codepoint allocator της v2.119.68, ώστε το substitute GID να παραμένει προσβάσιμο μέσω της τυπικής hex pipeline. Η στατική post-pass αλυσίδα παραμένει το προεπιλεγμένο fallback για codepoints που δεν καλύπτουν οι GSUB δηλώσεις της γραμματοσειράς
Scope and limitations Ο αλγόριθμος BiDi παραμένει εκτός αυτής της σελίδας: οι callers εξακολουθούν να πρέπει να ταξινομούν μόνοι τους μικτά LTR και RTL runs ή να χρησιμοποιούν ξεχωριστή βιβλιοθήκη BiDi. Η υποστήριξη GPOS, Indic/Tibetan/Mongolian, Hebrew, N'Ko, Adlam, Thai/Lao και Javanese βρίσκεται πλέον σε ξεχωριστές opt-in σελίδες shaping flag και API, οπότε αυτή η σελίδα εστιάζει μόνο σε στατικό και GSUB-based Arabic shaping
See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, THPDFPage.RtLTextOut, THPDFPage.UnicodeTextOut, CFF / OpenType Font Subsetting |