【问题标题】:Prevent LocalReport.Render using Calibri Font Ligatures使用 Calibri 字体连字防止 LocalReport.Render
【发布时间】:2013-12-10 04:20:28
【问题描述】:

当 RDLC 报告以 PDF 格式打印时,我遇到了打印空字符的问题。它只影响font ligatures,我理解它是字母组合,例如:

  • 英尺
  • fi
  • tt

我的研究表明,这些字符组合被组合成一个字形,打印出来时我将其视为一个空白区域。剪报示例:

在 PDF 上:

印刷:

因此症状是:

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

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

我很乐意解决这个问题:

  • 防止LocalReport.Render 合并连字
  • 启用 Server 2003 将字体视为我的 Windows 7 机器

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

更新:

感谢下面的答案,我检查了两台机器上的charmaps,但它们看起来相同:

服务器(问题所在):

本地(没问题):

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

有趣的一点是,如果我在本地使用 Calibri Regular 48,我会看到连字:

而服务器不使用它:

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

【问题讨论】:

  • Here Calibri 缺少tt 特别提到。看起来,无论字体嵌入到 PDF 中,都使用本地 2003 安装副本。在 2003 机器上升级字体版本和/或使其始终使用嵌入式字体(打印机驱动程序选项?)是最好的解决方案。如果您只控制生成 PDF 的计算机,也许 降级 Calibri 有一个选项。
  • @VadimR - 看起来两种字体都包含相同的连字(不是你说的ttti),但这并不能解释为什么我看到ti 和@ 987654340@ 在一台机器上被省略,而不是另一台。
  • 您能否提供一个示例 PDF 并指出打印输出中究竟缺少哪些连字,例如通过扫描打印输出?
  • 如果我在记事本中写下“信息”(使用 Calibri Bold),则会即时创建连字并正确写入 postscript 或 XPS(10 个字形)。
  • 如果您暂时从服务器中删除所有 Calibri,然后重新启动并尝试打印 PDF,该怎么办?

标签: c# pdf fonts rdlc ligature


【解决方案1】:

您能否通过在字符之间插入单词连接符 (U+2060) 或在旧系统上使用零宽度无分隔符 (U+FEFF) 来搜索、替换和断开连字?这应该强制它不使用连字。

【讨论】:

    【解决方案2】:

    一般来说,由 ReportViewer 生成的 PDF 甚至来自 Reporting Services won't embed fonts

    PDF 渲染扩展插件不嵌入字体。报表中使用的字体必须安装在报表服务器和用于查看报表的客户端计算机上。

    所以我会:

    1. 检查客户端2003服务器中的Calibrì字体版本是否相同(在两台机器上浏览到%windir%\fonts,点击Calibrì,右键单击每个ttf文件,选择Properties并查找@987654331 @ 在Details 标签中)。
    2. 修复差异:从2003服务器中删除旧版本并导入您在windows 7中找到的新ttf,全部使用操作系统提供的工具(见下图)
    3. 再试一次你的过程:如果你得到了你需要的,你就完成了。
    4. 如果您确实需要将生成的报告分发给可能有相同问题的客户,您必须安装 GhostScript 并使用以下内容对您的 pdf 进行后处理(这将产生 PDF/A output file
    gs -dPDFA -dBATCH -dNOPAUSE -dUseCIEColor -dHaveTransparency=false -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite -sPDFACompatibilityPolicy=1 -sOutputFile=output_filename.pdf input_filename.pdf
    

    一些旁注:

    • 过去我遇到过类似的问题,自定义字体在重新启动服务器后会消失,因此在第 2 步之后尝试重新启动服务器,然后再继续
    • GhostScript 是一个古老的free software,在Affero GNU/General Public Licence(仅适用于使用相同许可证的开源项目)和Artifex Commercial License 下为其他所有人提供双重许可。 Here你可以找到详情。
    • 过去,我曾被要求尝试许多更便宜的 GhostScript 替代品,相信我:没有更便宜的替代品。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2014-06-22
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多