rtf ファイルから文字列を変換して pdf にレンダリングする必要があるアプリがあります。簡体字アラビア語太字に問題があります。Windows 7 では動作しますが、Windows 10 または W.Srv 2012 では失敗します。
アラビア語の非常に簡単な単語: غ، dhoe
GDI+ の ToNative() メソッドによって返される「簡体字アラビア語」フォントを選択します。ScriptShape は Win7 では正しいグリフ ID を返しますが、Win10 では返された glyphId が CMAP テーブルにありません。たとえば、GlyphId 678 が見つからないため、PDF のレンダリングに文字を追加できません。
より詳細な説明:
問題を再現するために最小限の式に縮小された RTF を次に示します。
{\rtf1\fbidis\ansi\ansicpg1252\deff0\nouicompat\deflang1033
{\fonttbl{\f0\froman\fprq2\fcharset178 Simplified Arabic;}{\f1\fnil Source Sans Pro;}}
\pard\ltrpar\cf1\b\f0\rtlch\fs32\lang1025\'db\'a1 \'cf\'e5\'e6 \cf0\b0\f1\ltrch\fs18\lang1033\par
}
PDF のアトムを生成するために、まず System.Drawing.Font("Simplified Arabic", 16, bold) を取得します。
次にGetFontData(hDC, 0,0, buffer, length)
、TagGlyf テーブル データを呼び出して取得しdictionary <ushort, chart>
、tableCMap.Win の GlyphIdArray[] から a を作成します (必要に応じてコードを提供できます)。
それから私は電話します
Uniscribe.ScriptItemize(text, text.Length, items.Length, ref scriptControl, ref scriptState, items, ref itemsCount);
アイテムを取得した後、Uniscribe.ScriptLayout()
BiDi レベルに従って実行を注文するために呼び出します。
次に、現在の hDc でフォントを選択し、実行の GlyphIds を返す実行呼び出しごとに選択しますScriptShape()
。
Win7 の簡体字アラビア語 (Win10 でも) を使用すると、次のグリフが得られます。
{ushort[9]}
[0]: 3
[1]: 194
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
すべてがPDFに送信できる文字と正しく一致しています。ただし、W10 または WinSvr 2012 の SimplifiedArabic Bold を置き換えて使用すると、
グリフ {
ushort[9]}
[0]: 3
**[1]: 678**
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
[7]: 0
[8]: 0
Win10 フォントのグリフ [1] が 678 であることがわかりますが、CMap テーブルの辞書でその ID を見つけることができません。
glyphs[1] を手動で 194 に設定すると、正しい文字をレンダリングして問題なく動作します。そのため、ScriptShape がどの GlyphId を新しいフォントで使用するかについて混乱する理由がわかりません。
(もちろん、古い Win7 フォントを Win10 ボックスに手動でインストールすると、完全に動作します)
助言がありますか?
ありがとう。df