|
Arabic / Persian / Urdu Shaping Support Producer-side shaping pipeline (v2.85.0 - v2.119.68)
|
OpenType GSUB Engine CFF / OpenType Subsetting |
|
O HotPDF executa um pipeline de formação do lado do produtor que converte trechos árabes, persas e urdu em entrada Unicode nas respetivas Arabic Presentation Forms durante a emissão de texto PDF, para que os leitores consumidores recebam glifos posicionais / de ligadura prontos a renderizar sem precisarem do seu próprio formador ao nível de Harfbuzz
O que o pipeline faz Formação posicional (v2.85.0): cada letra base árabe tem até quatro formas posicionais - isolada (
Ligadura obrigatória LAM-ALEF (v2.119.32): a especificação Arabic Unicode Shaping determina que qualquer LAM (U+0644) imediatamente seguida de um ALEF (U+0627 simples, U+0622 com madda acima, U+0623 com hamza acima, U+0625 com hamza abaixo) se funde num único glifo de ligadura (U+FEFB - U+FEFC formas isolada / final com as variantes de hamza / madda adequadas). Esta é uma das poucas ligaduras não opcionais na tipografia árabe e é necessária para a correção; representá-las como glifos separados produz texto que os leitores nativos reconhecem de imediato como mal formado. O HotPDF faz esta fusão durante a emissão, pelo que os chamadores não precisam de um formador ao nível de Harfbuzz no seu próprio caminho de código
9 letras nucleares do persa / urdu (v2.119.35): o persa e o urdu estendem o árabe com letras que não existem no bloco Arabic Presentation Forms-B (U+FE70 - U+FEFC). As 9 letras mais usadas - incluindo 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) e HEH GOAL (U+06C1) - têm formas de apresentação em Arabic Presentation Forms-A (U+FB50 - U+FDFF). O HotPDF mapeia agora estas letras para o glifo Forms-A adequado durante a formação posicional, para que o texto persa e urdu seja renderizado com as formas init / medi / fina / isol corretas em qualquer leitor consumidor
Arabic Extended-A + Supplement (v2.119.52, v2.119.56): a tabela de classes de junção cobre agora os restantes caracteres Arabic Extended-A (ALEF WASLA / NOON GHUNNA / variantes de HEH), Arabic Supplement U+0750-U+077F e o intervalo mais alto Arabic Extended-A U+08A0-U+08FF. Os caracteres com codificação estática em Presentation Forms-A são mapeados através do formador de 4 posições já existente; os que não têm essa codificação (a maior parte do Extended-A) recebem apenas classificação de classe de junção, para que os vizinhos sejam formados corretamente mesmo quando o carácter em si é passado sem alterações. A v2.119.56 corrigiu dois mapeamentos Forms-A errados introduzidos pela v2.119.52 (U+06C2 / U+06C3)
Cobertura completa Persian / Urdu Form-B (v2.119.57): a tabela de classes de junção foi alargada para abranger todo o intervalo U+0672-U+06D5 (cerca de 80 caracteres que cobrem variantes de REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH), e foram adicionados 26 novos mapeamentos Presentation Forms-A (15 de classe D com 4 formas + 11 de classe R com 2 formas). Em particular, o HEH DOACHASHMEE «h» standard do urdu (U+06BE → FBAA-FBAD) e o yeh final de palavra do urdu YEH BARREE (U+06D2 → FBAE-FBAF) estão agora corretamente mapeados para as posições Forms-A que foram mal usadas pela correção temporária ALEF WASLA / NOON GHUNNA da v2.119.52. A cobertura estática Forms-A abrange agora mais de 40 caracteres de origem
YEH-HAMZA + pós-passagem de ligadura vocálica (v2.119.58): uma pós-passagem acrescentada a
Ligadura Allah (v2.119.60): a sequência de quatro caracteres ALEF + LAM + LAM + HEH funde-se em U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM. Implementada como uma pós-passagem estática ao nível do codepoint depois da LAM-ALEF da v2.119.32 e da YEH-HAMZA da v2.119.58 na cadeia
Ligadura da expressão Bismillah (v2.119.62): a expressão Bismillah standard de 22 codepoints "بسم الله الرحمن الرحيم" funde-se num único glifo U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. Corre como a primeira pré-passagem em
Auxiliares de consulta públicos
Como os chamadores o invocam O pipeline de formação é executado automaticamente dentro dos métodos de emissão de texto Unicode - não é necessária qualquer chamada explícita para «dar forma a este texto». Passe cadeias árabes / persas / urdu em entrada Unicode para THPDFPage.UnicodeTextOut ou THPDFPage.RtLTextOut e o HotPDF mapeia cada codepoint de entrada para a respetiva forma de apresentação antes de escrever o operador de apresentação de texto no PDF. Os bytes Unicode originais também são capturados em
Requisitos do tipo de letra O tipo de letra registado através de
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).
Quando ao tipo de letra registado falta um glifo para uma forma de apresentação derivada, o HotPDF recua para o codepoint Unicode base e emite-o sem alterações; os leitores consumidores podem então tentar a sua própria formação (Acrobat, Foxit) ou desenhar
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;
Integração automática do pipeline da Fase 8 (v2.119.59 - v2.119.68) v2.119.59 introduced the opt-in
Quando
ToUnicode CMap ligature reverse mapping (v2.119.61, v2.119.62, v2.119.65) A ToUnicode CMap Adobe-Identity-UCS emitida por
PUA synthetic codepoint emit (v2.119.68) AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word permitem ao código produtor emitir GIDs substitutos GSUB que não têm nenhum codepoint Unicode natural alcançável através da cmap do tipo de letra. O alocador distribui codepoints na Private Use Area (U+E000 - U+F8FF, 6400 slots) e espelha a atribuição em FUnicodeCpToGid (para que /CIDToGIDMap resolva o CP sintético de volta para o GID-alvo no leitor consumidor), FAcroFormUnicodeAdvances (para que o word-wrap v2.65 encontre a fração de em correta) e numa tabela de reverse lookup por GID (para que pedidos de atribuição repetidos sejam idempotentes). Use isto para formas de cluster devanágari, alternates estilísticos e sequências de variação ideográfica CJK que o GSUB introduz mas a cmap não alcança
Relationship to the OpenType GSUB engine O formador estático de pós-passagem descrito acima (v2.85.0 + v2.119.32 / 58 / 60 / 62) é independente do motor OpenType GSUB por predefinição. Quando
Para glifos substitutos sem codepoint Unicode, os chamadores combinam
Scope and limitations O algoritmo BiDi continua fora desta página: os chamadores ainda têm de ordenar por si próprios os trechos mistos LTR e RTL ou usar uma biblioteca BiDi separada. O suporte para GPOS, Indic/Tibetano/Mongol, Hebraico, N'Ko, Adlam, Tailandês/Lao e Javanês passa agora a residir em páginas separadas de sinalizadores e APIs opt-in de formação, pelo que esta página se concentra apenas na formação árabe estática e baseada em GSUB
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 |