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

2020-09-26 10:39发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)您好,我遇到的是此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条回答
土豆飞人
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"。

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

一周热门 更多>