将Crystal Report导出为PDF时的多余字符

2020-09-26 10:39发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我遇到的是此KB中描述的问题 使用Crystal Reports Developer for Visual Studio SP21(我认为这是当前可用的最新版本)时的文章。 知识库文章指出,原因是从Windows系统目录而不是从.NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86的C:\ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports加载usp10.dll, 但是我已经检查了Process Explorer和Process Monitor,并且它使用的是Crystal目录中的DLL。

已经在论坛上多次报告了此问题,例如,在此处,< a rel =" nofollow" hraf=" https://archive.sap.com/discussions/thread/3480841">此处,此处,以及此处,但 似乎从来没有真正的修复,只有解决方法:("最好的"解决方法是Vitaly Vedmetskiy在中的评论 ,他建议使用特定版本的usp10.dll(作为SAP某人的评论的后续内容,他说:"我们需要非常特定版本的usp10.dll才能使文本呈现正常工作 正确。"这引起了一个问题,如果CR的文本渲染不能在该版本上正常工作,为什么SAP会分发1.626.7601.23259版本)但是正如我所说的那样, 这只是一个解决方法-Crystal不需要usp10.dll的非常特定的版本,尤其是从2005年(usp10.dll 1.422.3790.1830的日期)一直不需要。 较新的版本usp10.dll没有任何问题。

usp10.dll较新版本不起作用的原因是,它们现在使用OpenType字体的标准连字('liga')表进行自动连字替换。 例如,如果某些文本的字符为" fi",则字体可以告诉渲染器(例如usp10.dll)将其显示为连字fi。 Crystal的PDF导出中的错误是它不能正确处理该替换。 当它生成要嵌入PDF的字体的子集时,它将连字的第一个字符映射到整个连字的字形。 例如,如果文本包含" fi",则会将" f"映射到" fi"连字,将所有其他" f"(即使不带" i"时)也转到" fi"连字。

为了演示,我创建了一个简单的报告,其中只有一个文本框,其中带有Calibri字体的文本" ta ti fa fi"(Windows Vista引入的大多数其他" C"字体都将显示相同的内容)。 问题-坎德拉(Candara),康斯坦西亚(Constantia)和科贝尔(Corbel)。 这是报表设计视图中的外观。 注意" ti"和" fi"是如何连接的。

如果您单击它来编辑文本,它们将更改为单独的字母:

然后,如果转到"报告预览"选项卡,右键单击并导出到PDF文件,它将变成以下内容:

PDF已被压缩,但是有许多实用程序可以将其解压缩...如果您这样做并查看显示的文本,则会看到:

[t,13,a t,f,19,a f] TJ

这意味着显示" t",向右移动额外的13个单位,显示" a t",显示" f",向右移动额外的19个单位,显示" a f"。 放在一起,您会看到它认为它应该显示" ta t fa f"。 实际上,如果您从Acrobat Reader复制文本并将其粘贴,那么您就可以得到。 因此,如果它认为显示的是" ta t fa f",为什么它看起来像" tia ti fia fi"? 因为PDF中的字符与该字符应显示的字形(图像)之间存在映射关系。 CR生成的PDF将" t"映射为" ti"连字的字形,并将" f"映射为" fi"连字的字形。

似乎CR的PDF导出正在调用usp10.dll的ScriptShape函数来确定一段文本的字形列表,但是当多个字符被单个字形替换时,这似乎没有做正确的事情。 理想情况下,出口将是固定的,因此可以正确处理这种情况。 但是我想一个快速而肮脏的解决方法是告诉usp10禁用对" liga"表的处理。 而旧版本的usp10.dll"修复"问题的原因是因为它们不处理" liga"表...对新的usp10.dll禁用" liga"处理将产生恢复到旧版本的效果。 usp10.dll,而不必麻烦地获取旧版本的DLL。

无论如何,我希望Crystal Reports开发人员能够一劳永逸地解决此问题。

(3.8 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我遇到的是此KB中描述的问题 使用Crystal Reports Developer for Visual Studio SP21(我认为这是当前可用的最新版本)时的文章。 知识库文章指出,原因是从Windows系统目录而不是从.NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86的C:\ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports加载usp10.dll, 但是我已经检查了Process Explorer和Process Monitor,并且它使用的是Crystal目录中的DLL。

已经在论坛上多次报告了此问题,例如,在此处,< a rel =" nofollow" hraf=" https://archive.sap.com/discussions/thread/3480841">此处,此处,以及此处,但 似乎从来没有真正的修复,只有解决方法:("最好的"解决方法是Vitaly Vedmetskiy在中的评论 ,他建议使用特定版本的usp10.dll(作为SAP某人的评论的后续内容,他说:"我们需要非常特定版本的usp10.dll才能使文本呈现正常工作 正确。"这引起了一个问题,如果CR的文本渲染不能在该版本上正常工作,为什么SAP会分发1.626.7601.23259版本)但是正如我所说的那样, 这只是一个解决方法-Crystal不需要usp10.dll的非常特定的版本,尤其是从2005年(usp10.dll 1.422.3790.1830的日期)一直不需要。 较新的版本usp10.dll没有任何问题。

usp10.dll较新版本不起作用的原因是,它们现在使用OpenType字体的标准连字('liga')表进行自动连字替换。 例如,如果某些文本的字符为" fi",则字体可以告诉渲染器(例如usp10.dll)将其显示为连字fi。 Crystal的PDF导出中的错误是它不能正确处理该替换。 当它生成要嵌入PDF的字体的子集时,它将连字的第一个字符映射到整个连字的字形。 例如,如果文本包含" fi",则会将" f"映射到" fi"连字,将所有其他" f"(即使不带" i"时)也转到" fi"连字。

为了演示,我创建了一个简单的报告,其中只有一个文本框,其中带有Calibri字体的文本" ta ti fa fi"(Windows Vista引入的大多数其他" C"字体都将显示相同的内容)。 问题-坎德拉(Candara),康斯坦西亚(Constantia)和科贝尔(Corbel)。 这是报表设计视图中的外观。 注意" ti"和" fi"是如何连接的。

如果您单击它来编辑文本,它们将更改为单独的字母:

然后,如果转到"报告预览"选项卡,右键单击并导出到PDF文件,它将变成以下内容:

PDF已被压缩,但是有许多实用程序可以将其解压缩...如果您这样做并查看显示的文本,则会看到:

[t,13,a t,f,19,a f] TJ

这意味着显示" t",向右移动额外的13个单位,显示" a t",显示" f",向右移动额外的19个单位,显示" a f"。 放在一起,您会看到它认为它应该显示" ta t fa f"。 实际上,如果您从Acrobat Reader复制文本并将其粘贴,那么您就可以得到。 因此,如果它认为显示的是" ta t fa f",为什么它看起来像" tia ti fia fi"? 因为PDF中的字符与该字符应显示的字形(图像)之间存在映射关系。 CR生成的PDF将" t"映射为" ti"连字的字形,并将" f"映射为" fi"连字的字形。

似乎CR的PDF导出正在调用usp10.dll的ScriptShape函数来确定一段文本的字形列表,但是当多个字符被单个字形替换时,这似乎没有做正确的事情。 理想情况下,出口将是固定的,因此可以正确处理这种情况。 但是我想一个快速而肮脏的解决方法是告诉usp10禁用对" liga"表的处理。 而旧版本的usp10.dll"修复"问题的原因是因为它们不处理" liga"表...对新的usp10.dll禁用" liga"处理将产生恢复到旧版本的效果。 usp10.dll,而不必麻烦地获取旧版本的DLL。

无论如何,我希望Crystal Reports开发人员能够一劳永逸地解决此问题。

(3.8 kB)
付费偷看设置
发送
3条回答
me_for_i
1楼 · 2020-09-26 11:43.采纳回答

大卫,您好,

感谢您提供详细信息。 我确定他们已解决此问题,但看来它又被打破了。

我会在早上将其升级,然后让DEV重新研究它。

现在可能是导出dll中的问题。 CR 14.2.4现在使用的是1.6 usp10,因此可能是他们需要撤消之前所做的一切才能使它工作。

仅供参考,CR格式化引擎基于硬件和软件,包括打印机驱动程序,USP10,GDI,GDIPlus和各种框架。 有很多依赖项可用于尝试实现此目的。 一种改变就是打破事物的一切...

这已全部通过注册表项解决:

KBA 2534523-使用字体Calibri时,单词从Crystal Reports错误地导出为PDF格式

症状

  • 单词不正确。
  • 在许多单词中添加字母" i"或" a"或" f"。
  • 像这样的词:" test"以" testie"的形式导出到PDF
  • 将报表从Crystal Reports导出为PDF格式,其中包含格式化为使用字体Calibri的文本时,生成的PDF文档中的许多单词都不正确。

环境

  • SAP Crystal Reports 2011
  • SAP Crystal Reports 2013
  • SAP Crystal Reports 2016
  • Crystal Reports,Visual Studio开发人员

复制问题

  1. 在Crystal Reports中,使用任何数据源创建一个报告。
  2. 在包含文本的报表上插入数据库字段或文本对象。
  3. 设置数据库字段或文本对象的格式以使用字体Calibri
  4. 将报告导出为PDF格式
  5. 打开生成的PDF文档时,请注意许多单词是不正确的,例如:
    -引号,变为:quoties
    -测试,变为:tiest
    -日期,变为:datie

决议

  1. 在Crystal Reports中,使用任何数据源创建一个报告。
  2. 在包含文本的报表上插入数据库字段或文本对象。
  3. 设置数据库字段或文本对象的格式以使用字体Calibri
  4. 将报告导出为PDF格式
  5. 打开生成的PDF文档时,请注意许多单词是不正确的,例如:
    -引号,变为:quoties
    -测试,变为:tiest
    -日期,变为:datie

原因

这是程序错误。

解决方案

  • 此问题已在下面的"支持软件包和修补程序"部分中列出的修补程序中得到解决。

    "支持软件包和修补程序"部分一旦发布,将填充相关的修补程序级别。

    有关Business Intelligence平台的维护时间表和策略,请参阅"参考"部分中的知识库文章2144559。/p>

  • 要解决此问题,请添加注册表项:UseCustomEncoding,并将值设置为零(0)

    1。 关闭Crystal Reports设计器。

    2。 打开Microsoft注册表编辑器。
    (在MS Windows中,在"开始"菜单下,选择"运行",然后键入:regedit)

    3。 导航到以下路径:

    HKEY_CURRENT_USER \ SOFTWARE \ SAP Business Objects \ Suite XI 4.0 \ Crystal Reports \ Export \ PDF

对于VS 32位的CR,请使用以下密钥:

HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ SAP BusinessObjects \ Crystal Reports for .NET Framework 4.0 \ Crystal Reports \ Export \ PDF

对于VS 64位CR,请使用以下密钥:

.NET Framework 4.0的HKEY_LOCAL_MACHINE \ SOFTWARE \ SAP BusinessObjects \ Crystal Reports \ Crystal Reports \ Export \ PDF

注意:路径的最后一部分可能不存在。 如果是这种情况,只需添加缺少的密钥即可。

4.右键单击PDF键,然后选择:"新建-DWORD值"
5.将名称设置为:UseCustomEncoding
6.将值设置为:0
7.重新启动Crystal。 报告。

关键字

Calibri字体," a",usp10 1.6 CR,xport,Calibri,PDF

VS 2010SP021的晶体报告

BI平台服务器4.1SP011

BOP BI平台服务器4.2 SP005

SBOP BI平台服务器4.3

土豆飞人
2楼-- · 2020-09-26 11:30

嗯,这是我将UseCustomEncoding设置为0的PDF:LigatureTest.pdf

我已经在一些PDF查看器中打开了它:Adobe Acrobat Reader DC,Chrome Web浏览器,Windows 10 PDF查看器应用程序和SumatraPDF,它们都正确显示了它(" ta ti fa fi")。 但是,如果我突出显示文本,请按Ctrl + C进行复制,然后在记事本中按Ctrl + V,它们都会复制/粘贴" ta t fa f"。

如果设置注册表项的唯一作用是使注册表项正常工作,那么为其设置注册表项有什么意义呢? 为什么您要它不工作? 我只是对为什么必须设置注册表项而不是默认行为感到困惑。

粗暴的香蕉
3楼-- · 2020-09-26 11:19

由于USP10.dll 1.4版中的错误,CR使用了注册表 解决这些问题的关键。

我们更新到1.6,所以里面也可能有错误。

我注意到Adobe正在使用版本10 usp10.dll(Windows 10版本),因此在转换/复制字符时可能会出现问题。

如果您不想使用有效的字体,请不要使用该字体。

一周热门 更多>