Pdf 在简化阿拉伯语Windows Svr 2012或W10中找不到Uniscribe ScriptShape字符
我有一个应用程序,它必须将rtf文件中的字符串转换为pdf格式。 我有一个简化的阿拉伯语粗体的问题,它在Windows7中工作,但在Windows10或W.SRV2012中失败 一个非常简单的阿拉伯语单词: غ،دهو 我选择GDI+ToNative()方法返回的“简化阿拉伯语”字体。ScriptShape在Win7中返回正确的glyph ID,但在Win10中,返回的glyph ID不在CMAP表中。 例如,找不到GlyphId 678,因此我无法在PDF的呈现中添加字符 更详细的解释是: 以下是简化为最小表达式的RTF,以再现问题:Pdf 在简化阿拉伯语Windows Svr 2012或W10中找不到Uniscribe ScriptShape字符,pdf,fonts,arabic,uniscribe,Pdf,Fonts,Arabic,Uniscribe,我有一个应用程序,它必须将rtf文件中的字符串转换为pdf格式。 我有一个简化的阿拉伯语粗体的问题,它在Windows7中工作,但在Windows10或W.SRV2012中失败 一个非常简单的阿拉伯语单词: غ،دهو 我选择GDI+ToNative()方法返回的“简化阿拉伯语”字体。ScriptShape在Win7中返回正确的glyph ID,但在Win10中,返回的glyph ID不在CMAP表中。 例如,找不到GlyphId 678,因此我无法在PDF的呈现中添加字符 更详细的解释是: 以
{\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 data,从tableCMap.Win的glyphidaray[]构建一个字典
(如果需要,我可以提供我的代码)
然后我打电话
Uniscribe.ScriptItemize(text, text.Length, items.Length, ref scriptControl, ref scriptState, items, ref itemsCount);
获取项目后,我调用Uniscribe.ScriptLayout()
根据BiDi级别对运行进行排序
然后,我在当前hDc中选择字体,并为每个运行调用ScriptShape()
,该调用返回运行的glyphid
使用Win7简化阿拉伯语(即使在Win10中),我得到以下标志符号:
字形
所有这些都与我可以发送到PDF的字符正确匹配。
然而,当我替换并使用W10或WinSvr 2012中的SimplifiedArabic粗体时,我得到
字形
{
您可以看到Win10字体中的字形[1]是678,但我在CMap表的字典中找不到该Id
如果我手动将glyphs[1]设置为194,它可以正常渲染正确的字符。所以我不知道为什么ScriptShape会对新字体使用哪个GlyphId感到困惑
(当然,如果我在Win10框中手动安装旧的Win7字体,它会工作得很好)
有什么建议吗
谢谢。
df如果您是为win10开发的,请不要将GDI+与Uniscribe一起使用;这是旧的图形系统。尤其是在排版非常重要的情况下,请使用Direct2D,它使用DirectWrite(自Windows 7发布以来,一直是首选系统)如果您是为win10开发的,请不要将GDI+与Uniscribe一起使用;这是旧的图形系统。尤其是在排版很重要的情况下,请使用Direct2D,它使用DirectWrite(自从Windows 7发布以来,它一直是首选系统)
{ushort[9]}
[0]: 3
[1]: 194
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
ushort[9]}
[0]: 3
**[1]: 678**
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
[7]: 0
[8]: 0