防止使用 Calibri 字体连字的 LocalReport.Render

12

我在RDLC报表生成PDF时遇到一个问题,打印空字符。它仅影响字体连字,即理解为字母组合,例如:

  • ti
  • ft
  • fi
  • tt

我的研究显示这些字符组合被合并为一个单一的字形,当打印出来时,我看到的是一个空格。例如截图:

在PDF中:

enter image description here

enter image description here

打印出来:

enter image description here

enter image description here

因此,症状是:

  • 屏幕上PDF看起来很好
  • 当打印(物理或使用XPS writer)时,所有连字都显示为空格

到目前为止,我已经将问题缩小到特定字体(Calibri)和特定服务器(Windows Server 2003 R2)。 PDF已嵌入字体:

enter image description here

为了解决这个问题,我希望实现以下目标:

  • 防止LocalReport.Render将连字组合在一起
  • 使Server 2003能够像我的Windows 7机器一样处理字体

我不确定如何/从哪里开始比较字体环境,因此非常感谢提供思路和指针。

更新:

感谢下面的答案,我已经检查了两台机器上的字符映射表,但它们看起来是相同的:

服务器(出现问题的地方):

enter image description here

本地(没有问题):

enter image description here

这也提醒我通过复制字体文件并直接安装它们来安装字体。两个版本都是5.72,数字签名,TrueType轮廓,但服务器显示OpenType Font,而本地显示OpenType Layout(可能只是不同操作系统的显示)。

有趣的是,如果我在本地使用Calibri Regular 48,则可以看到连字:

enter image description here

而服务器则不使用它:

enter image description here

此外,两个PDF都是在同一台机器上打印的,但仅在服务器生成的PDF中出现了问题,因此我认为打印机驱动程序不可能是问题?


在这里,特别提到了Calibri字体缺少“tt”。看起来,无论字体是否嵌入PDF中,都会使用本地2003安装副本。升级2003机器上的字体版本和/或始终使用嵌入字体(打印机驱动程序选项?)是最佳解决方案。如果您只控制生成PDF的计算机,则可能降级Calibri是一个选项。 - user2846289
我不确定"Section 1"片段,但"Helpful Information"片段看起来有些粗。在复制字体文件的时候,您是否确保复制了所有与Calibri相关的字体文件? - mkl
@mkl - 你说得对,它确实很粗体。检查了文件后,似乎我有全部的和一些额外的。 - m.edmondson
1
如果我在记事本中写“信息”(使用Calibri Bold字体),则会即时创建连字,并正确地写入到PostScript或XPS中(10个字形)。 - user2846289
2
如果您暂时从服务器中删除所有Calibri字体,重新启动并尝试打印PDF会怎样呢? - user2846289
显示剩余9条评论
3个回答

4

你能进行搜索和替换操作,并通过在字符之间插入单词连接符(U+2060)或在旧系统上使用零宽度不间断空格(U+FEFF)来打破连字吗?这应该强制其不使用连字。


1

一般来说,由ReportViewer生成的PDF甚至Reporting Services生成的PDF 不会嵌入字体:

PDF呈现扩展程序不会嵌入字体。报表中使用的字体必须安装在报表服务器和用于查看报表的客户端计算机上。

因此,我建议:

  1. 检查2003服务器上的Calibrì字体版本是否与客户端相同(在两台机器中浏览到%windir%\fonts,单击Calibrì,右键单击每个ttf文件,选择属性,并在详细信息选项卡中查找文件版本)。
  2. 修复差异:从2003服务器中删除旧版本,并导入您在Windows 7中找到的新ttf,所有这些都使用操作系统提供的工具(请参见下面的图片)tool provided by the os
  3. 再次尝试您的过程:如果您得到所需内容,则完成。
  4. 如果您确实需要将生成的报告分发给可能存在此问题的客户端,则必须安装GhostScript并使用类似以下内容的东西对pdf进行后处理(这将生成一个PDF/A输出文件
gs -dPDFA -dBATCH -dNOPAUSE -dUseCIEColor -dHaveTransparency=false -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite -sPDFACompatibilityPolicy=1 -sOutputFile=output_filename.pdf input_filename.pdf

一些附加说明:

  • 过去我曾经遇到类似的问题,即自定义字体在重启服务器后消失,因此在步骤2之后,请尝试在继续之前重新启动服务器
  • GhostScript是一款免费软件,双重许可证下发行,分别适用于使用相同许可证的开源项目的Affero GNU / General Public Licence和其他人的Artifex商业许可证这里可以找到详细信息。
  • 过去,我被要求尝试许多比GhostScript更便宜的替代品,相信我:没有比它更便宜且有效的替代品。

0

如果您可以访问字体定义(在代码中),则有解决方案。

xaml: FontFamily="Calibri" Typography.StandardLigatures="False"


您的答案可以通过添加更多支持信息来改善。请编辑以添加更多详细信息,例如引用或文档,以便他人确认您的答案的正确性。您可以在帮助中心中找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接