1

我有一个应用程序,它必须将 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

4

0 回答 0