问题标签 [uniscribe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
2174 浏览

delphi - 尝试使用 SynPDF 将带有 unicode 文本的报告导出为 pdf,导致文本混淆

SynPDF 已经修复了一些 unicode 问题,但显然不是全部。以下是使用 SynPDF 将快速报告导出为 PDF 的直接代码:

这是带有标签的报表设计器的屏幕截图,其中包含翻译的希伯来语字符串:

电话:03-5555555 电话

这在运行时按原样显示,并且也打印相同。然而,使用 SynPDF,结果如下: 电话PDF

有谁知道对此可以做些什么?

我使用 SynPDF 的原因是因为它是免费的,

并且因为它呈现元文件中的文本

而不仅仅是拍照,

这意味着我可以通过我的 pdf 文件获得高质量的文本。

但我不会排除其他组件,因为它们

有解决这个问题的办法。

谢谢你。

0 投票
1 回答
683 浏览

.net - 计算字形在 Windows 中的位置

是否有任何简单且兼容的 GDI 或 .NET 可访问的 Windows 子系统将提供字形位置字符。这里的任务是组合符号,例如阿拉伯语中的组合符号,有时会有多个组合符号链堆叠在一起,例如阿拉伯法塔 + 阿拉伯字母上标 Alef + 阿拉伯 Maddah 上方。问题是,虽然 X 位置可以通过 GDI GetCharacterPlacement 精确确定,但从 OpenType 或 TrueType 字体表和锚点以及一组复杂的规则中得出的 Y 位置计算不可用。最终,要生成格式正确的阿拉伯语 PDF,需要精确的 Y 位置。学习 Microsoft Word 2013 的另存为 PDF 功能,

WPF 可能在 GlyphRun 类属性 GlyphOffsets 中包含一些函数来执行此操作。DirectWrite 有 IDWriteTextAnalyzer 接口,GetGlyphPlacements 方法可以返回 DWRITE_GLYPH_OFFSETs 和许多其他复杂的脚本信息。查看 GDI Display 和 Printer Drive 函数,STROBJ_bEnumPositionsOnly 似乎返回了一组带有此信息的 GLYPHPOS 结构。如果您将全文发送到渲染,GDI 肯定会在所有情况下正确渲染,但如果您想逐个字形地进行渲染,则不会。

XPS 对象模型中的 IXpsOMGlyphs 允许 GetGlyphIndices 调用返回一组 XPS_GLYPH_INDEX 给出水平偏移和垂直偏移,尽管这个库几乎不合适。

最后,唯一合适的库看起来是 Uniscribe,它使用起来很复杂,但自 Internet Explorer 5 和 Windows 2000 以来就受支持,而不是 GDI 之外的所有其他讨论,通常是 Vista 和更高版本或需要特殊依赖项。ScriptItemize 返回一个 SCRIPT_STRING_ANALYSIS 数组,该数组可以传递给 ScriptShape,然后 ScriptPlace 返回一个数组或 GOFFSET。事实上,Uniscribe 将提供有关分词、变音符号、方向流和复杂脚本中发生的许多其他方面的信息。我只是想知道是否有更简单的方法,或者这是否是此类任务所需的最低要求和完全合适的方法,因为 Uniscribe 似乎很难直接从 .NET 使用,并且合理地需要 C++ 包装器,因为有一个很棒的处理结构和指针。

更新和回答:Uniscribe 不适用于 PDF 目的,因为它在 GDI 设备单元中使用整数,因此准确性大大降低。这可能是 Microsoft Word 2013 最终支持原生 PDF 转换支持的原因,因为最终似乎依赖 DirectWrite。如下所述,我在 CodeProject 上发布了 .NET 中的两种代码解决方案作为提示。除了设计自定义字体整形和计算引擎之外,DirectWrite 似乎是唯一的答案。

0 投票
0 回答
138 浏览

pdf - 在简体阿拉伯语 Windows Svr 2012 或 W10 中找不到 Uniscribe ScriptShape 字符

我有一个应用程序,它必须将 rtf 文件中的字符串转换为 pdf 格式。我对简体阿拉伯语粗体有疑问,它在 Windows 7 中有效,但在 Windows 10 或 W.Srv 2012 中失败。

一个非常简单的阿拉伯语单词:غ، دهو

我选择了 GDI+ ToNative() 方法返回的“simplified Arabic”字体。ScriptShape 在 Win7 中返回正确的 glyph Id,但在 Win10 中返回的 glyphIds 不在 CMAP 表中。例如,找不到 GlyphId 678,因此我无法在 PDF 的呈现中添加字符。

更详细的解释:

这是为了重现问题而将 RTF 简化为最小表达式:

为了生成 PDF 的原子,我首先得到 System.Drawing.Font("Simplified Arabic", 16, bold)。

然后我调用GetFontData(hDC, 0,0, buffer, length)并获取表 TagGlyf 数据,dictionary <ushort, chart>从 tableCMap.Win 的 GlyphIdArray[] 构造一个(如果需要,我可以提供我的代码)

然后我打电话

拿到物品后,我打电话Uniscribe.ScriptLayout()根据 BiDi 级别订购跑步。

然后我选择当前 hDc 中的字体,并为每个ScriptShape()返回运行的 GlyphIds 的运行调用。

使用 Win7 简体阿拉伯语(即使在 Win10 中)我得到以下字形:字形

并且所有内容都正确匹配我可以发送到 PDF 的字符。但是,当我替换并使用 W10 或 WinSvr 2012 中的 SimplifiedArabic Bold 时,我得到

字形{

您可以看到 Win10 字体中的 glyphs[1] 为 678,但我在 CMap 表中的字典中找不到该 Id。

如果我手动将字形 [1] 设置为 194,则可以正常渲染正确的字符。所以我不知道为什么 ScriptShape 对新字体使用哪个 GlyphId 感到困惑。

(当然,如果我在 Win10 框中手动安装旧的 Win7 字体,它可以完美运行)

有什么建议么?

谢谢。df

0 投票
0 回答
255 浏览

c++ - 在 Windows 10 中面临 ScriptShape(USP10.dll) Windows API 的挑战

  1. 被测应用:记事本
  2. 记事本中输入的内容:ABCD

在 Windows 环境中观察到的行为:-

Windows 7/Windows 8.1:为了在记事本中绘制文本 ABCD,调用进入 ScriptShape Windows API(USP10.dll) 以生成 Glpyhs,然后转到 ExtTextOut(GDI32.dll)。

Windows 10:为了在记事本中绘制文本 ABCD,调用进入 ExtTextOut(GDI32.dll) 而不通过 ScriptShape Windows API(USP10.dll)。

如果我们分析 notepad.exe 的进程 dmp,那么在 Windows 7/Windows 8.1 的情况下,USP10.dll 被调用,而在 Windows 10 的情况下,USP10.dll 从未被调用,这意味着没有任何与 ScriptShape 相关的调用被触发. 所以,我的问题是,如果是 Windows 10,它会被路由到哪里?如果不涉及 USP10.dll,则涉及哪个 dll 从 Unicode 字符生成字形索引?

任何建议都会有所帮助

0 投票
2 回答
455 浏览

winapi - 如何使用 DirectWrite 平衡面向脚本的 OpenType 功能与其他 OpenType 功能?

全面披露:我正在开发我的 libui GUI 框架的文本 API。这包含了 Windows 上的 DirectWrite、OS X 上的 Core Text 和其他 Unix 上的 Pango(使用 HarfBuzz 进行 OpenType 整形)。我要指定的文本格式属性之一是要使用的 OpenType 特性的集合,这三个特性都提供;DirectWrite 是IDWriteTypography.

现在,当您使用这些库绘制一些文本时,默认情况下您会启用一些有用的 OpenType 功能,例如标准连字 ( liga),如 f+i 连字。我认为这是特定于字体的,但事实证明这是特定于正在成形的文本的脚本。Microsoft 为 OpenType 支持的所有脚本提供了指南(在“特定于脚本的开发”下),我可以看到在 HarfBuzz 本身中完成这一切以确认它的相当复杂的逻辑。

在 Core Text 和 Pango 上,如果我启用其他属性,它们将被添加到这些默认值之上。但特别是使用 DirectWrite,IDWriteTextLayout::SetTypography()这样做会删除默认值

如果您明确指定 IDWriteTypography 对象,DirectWrite 会删除默认的 OpenType 功能

可以在此处找到产生此输出的程序。

显然,我的第一个选择是询问如何获得 DirectWrite 的默认功能。不过,有人已经在这个网站上这样做了,答案似乎是“不”。

我猜 DirectWrite 允许我完全控制应用于某些文本的功能列表。这很好,但除非我以某种方式明确禁用默认功能,否则我无法使用其他 API 执行此操作!当然,我不知道这个列表是否会改变,所以硬编码可能不是最好的主意。

即使硬编码是一种选择,我也可以为每个脚本获取 HarfBuzz 的列表,但是 a)它相当复杂b)脚本有多种可能的整形器,这取决于(我认为)版本兼容性(例如,缅甸)。

那么为什么不使用 HarfBuzz 的列表来重新创建 DirectWrite 的默认功能列表呢?无论如何,它似乎想要对其他塑造者准确,所以这应该有效,对吧?好吧,我需要做两件事:弄清楚要使用什么脚本,并弄清楚要在脚本的哪些字符上使用哪些属性,其中字符在单词中的位置很重要。

DirectWrite 提供了一个接口,该接口IDWriteTextAnalyzer提供了执行整形的工具。我可以使用它,但似乎脚本数据以DWRITE_SCRIPT_ANALYSIS结构返回,并且脚本 ID 的描述说“编写系统脚本的从零开始的索引表示。”。

这没有帮助,所以我编写了一个程序来转储我输入的文本的脚本编号。在输入字符串上运行它

产生输出

我无法将这些脚本编号与任何 Windows 标头中的任何内容匹配:如果在任何 API 中定义了阿拉伯文、拉丁文或西里尔文编号,它们与这些不匹配。即使我确实得到了脚本和脚本编号之间的映射,这仍然没有给我提供应用词内特征的数据。

Uniscribe呢?好吧,等效SCRIPT_ANALYSIS类型的文档说它的脚本 ID 是一个“[opaque] 值”,它的“这个成员的值是未定义的,应用程序不应该依赖于它的值从一个版本到下一个版本是相同的”。虽然我可以获得LANG_ENGLISH一个语言代码来识别脚本,但除了“西方”(拉丁语?)脚本之外,仍然没有定义值。DirectWrite 值是否与 Uniscribe 相同?似乎我至少可以通过查看fLinkBeforeandfLinkAfter字段来确定单词的初始和最终状态,但这足以正确应用每个脚本的属性吗?

HarfBuzz 确实有一个实验性的 DirectWrite 后端,它不打算被实际程序使用;我还不确定它是否具有我上面指定的相同的功能破坏。如果我发现了,我会在这里更新这部分。

最后,如果我以类似 kaxaml 的方式输入以下与上面第一个等效的测试用例:

我看到连字被正确应用,即使在后一种情况下:

kaxaml 显示我想要的效果很好

(最后的分数只是为了证明该属性正在被应用。)如果我假设 XAML 使用 DirectWrite,那么这证明我的第一个选项(简单地将我的自定义属性覆盖在默认值之上)应该是可能的......(我做出这个假设的基础是 XAML 提供了一个与 Direct2D 惊人相似的 API 来绘制 2D 图形,并且填补了很多漏洞,我必须手动编写大量胶水代码才能用 vanilla Direct2D 做同样的事情,所以我假设 XAML 中的任何可能都可以通过 Direct2D 实现,并且通过扩展 DirectWrite,因为它们在技术上是一起引入的......)

在这一点上,我完全迷失了。我希望至少可以跨平台进行预测,而且我不确定程序甚至应该如何,更不用说直接使用 OpenType 功能了。我是否对文本布局 API 抱有不好的期望?如果需要,我是否必须放弃 IDWriteTextLayout 并自己进行所有文本整形和布局?

还是我必须放弃普通 Windows 7 支持并升级到平台更新 DirectWrite 功能集?甚至完全是Windows 7?

0 投票
1 回答
137 浏览

windows - 阿拉伯字母中午 ghunna 错误地用点显示

背景

阿拉伯字母 noon ghunna (ں) 在我的 Windows 10 PC 上显示不正确(在 Chrome、Edge、记事本和 Word 中)。顺序 ALEF、NOON GHUNNA、ALEF 显示为:

安娜

相同的序列在我的 Android 手机上正确显示,没有点:

安娜

为了完整起见,实际的 unicode 字符串(用于复制/粘贴目的)是:

回复

关于这封信(L2-12/381)存在一些争议,从 Unicode 标准中可以看出,该信已经解决了从第 7 版到目前的第 11 版):

渲染系统应将 U+06BA 显示为双连接字母,所有四种上下文形式均显示为 dotless,无论文本的语言如何。

但是圆点出现在词首(ںا)和词中(اںا)的位置。最终形式(اں)和孤立形式(ں)都可以。

问题

现在我的问题是,除了等待微软修复它之外,如何修复它?我想了解问题出在哪里。它是在 Uniscribe 库中,还是取决于所使用的字体?可以通过使用特制的 TrueType/OpenType 字体来修复它吗?

0 投票
0 回答
123 浏览

c - 如何使用 ScriptTextOut 绘制旋转文本?

如何使用该ScriptTextOut功能绘制旋转文本?
我都试过了Graphics::SetTransformSetWorldTransform但他们似乎没有成功。

0 投票
1 回答
941 浏览

c++ - 如何判断字体是否支持代理对 Unicode 字符?

我能够找到以下确定Unicode-16字体是否支持字符的方法。不幸的是,这不适用于代理对 Unicode characters,因为WCRANGE函数支持的结构GetFontUnicodeRanges仅返回WCHAR(16 位)参数作为输出。

这是我正在尝试做的一个例子:

如果我在 Windows 10 上运行它,我会得到:

在此处输入图像描述

但这就是我在 Windows 7 上得到的:

在此处输入图像描述

那么如何判断中间字符是否不会被渲染呢?


PS。我还尝试使用文档不完整的 Uniscribe本教程的修改版本作为示例。但无论我怎么做,都未能在 Win10 和 Win7 之间产生明显的结果。如果它有助于回答这个问题,这是我尝试过的代码:

接着:


编辑:我能够创建一个演示 GUI 应用程序,演示下面Barmak Shemirani建议的解决方案。

0 投票
1 回答
145 浏览

linux - 如何为 Linux 实现 Uniscribe

我正在尝试为 Linux 实现 Uniscribe 以显示复杂的文本,例如阿拉伯语。这似乎是一项艰巨的任务。

我需要做的是实现以下 API:

  1. 检查字符串是否复杂。
  2. 获取字符串宽度。
  3. 获取下一段。
  4. 得到下一个休息。
  5. ...

我想使用/参考开源代码来做到这一点。

我已经阅读HarfBuzz源代码好几个星期了,但没有得到它们的 API。仅使用HarfBuzz来实现它们是否可行?看来我应该使用Pango,但由于它的许可证,我不能这样做。有替代品吗?麻省理工执照没问题。

对我有ICU帮助吗?