我有一个应用程序,它必须将 rtf 文件中的字符串转换为 pdf 格式。我对简体阿拉伯语粗体有疑问,它在 Windows 7 中有效,但在 Windows 10 或 W.Srv 2012 中失败。
一个非常简单的阿拉伯语单词:غ، دهو
我选择了 GDI+ ToNative() 方法返回的“simplified Arabic”字体。ScriptShape 在 Win7 中返回正确的 glyph Id,但在 Win10 中返回的 glyphIds 不在 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[] 构造一个(如果需要,我可以提供我的代码)
然后我打电话
Uniscribe.ScriptItemize(text, text.Length, items.Length, ref scriptControl, ref scriptState, items, ref itemsCount);
拿到物品后,我打电话Uniscribe.ScriptLayout()
根据 BiDi 级别订购跑步。
然后我选择当前 hDc 中的字体,并为每个ScriptShape()
返回运行的 GlyphIds 的运行调用。
使用 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 字体中的 glyphs[1] 为 678,但我在 CMap 表中的字典中找不到该 Id。
如果我手动将字形 [1] 设置为 194,则可以正常渲染正确的字符。所以我不知道为什么 ScriptShape 对新字体使用哪个 GlyphId 感到困惑。
(当然,如果我在 Win10 框中手动安装旧的 Win7 字体,它可以完美运行)
有什么建议么?
谢谢。df