【问题标题】:Exclude default font embed in RDLC render to PDF将 RDLC 中嵌入的默认字体排除到 PDF 中
【发布时间】:2014-04-14 21:22:35
【问题描述】:

我尝试将 RDLC 报告呈现为 PDF 文件,但生成的文件大小比正常文件大。经过一番研究,我发现生成的 PDF 嵌入了字体: ...... 9 0 对象 > 溪流 .....

当我使用相同的方法和相同的代码生成 PDF 并保存到磁盘时,一个 PDF 的大小为:6.82 KB 和其他 109 KB。

如果我用 Adob​​e Acrobat 打开,PDF 是相同的。

解决方案 1:

我在 MVC 4 应用程序中使用“Microsoft.ReportViewer.WebForms”版本 11 生成 PDF。 我尝试在同一个 MVC 应用程序中使用“Microsoft.ReportViewer.WinForms”库来查看大小是否减小但没有结果。

失败

溶液 2:

我用记事本在 RDLC 文件中搜索是否存在关于字体的内容但不存在,只有字体大小,如果是粗体但不存在某些名称。

失败

PDF 小字体属性:

大 PDF 字体属性:

我的问题是:如何不在 RDLC 呈现的 PDF 中嵌入默认字体?

【问题讨论】:

    标签: asp.net-mvc winforms pdf fonts rdlc


    【解决方案1】:

    事实证明,我们只需要在 DeviceInfo.xml 中添加一个键:

    <DeviceInfo>
    <EmbedFonts>None</EmbedFonts>
    </DeviceInfo>
    

    我找到了the answer here

    【讨论】:

    • 绝对是的。这应该是公认的答案。对于ReportViewer.WebForms,这也可以通过将整个DeviceInfo xml 标记作为字符串作为deviceInfo 参数传递给Render 函数来完成。使用 rdlc 成功测试,该 rdlc 在 Calibri Light 中只包含一个标签,嵌入 155 KB,不嵌入 5 KB。
    【解决方案2】:

    根据How to embed a Font in a PDF with RDLC,您必须满足以下要求:

    • 字体必须标记为允许嵌入
    • 字体必须是 TrueType 类型

    这类似于MSDN documentation 从报表生成器和 SSRS 导出到 PDF 文件时的字体嵌入:

    • 字体嵌入权限由字体作者授予。安装的字体包含一个属性,该属性指示字体作者是否
      打算允许在文档中嵌入字体。如果属性
      值为 EMBED_NOEMBEDDING,字体未嵌入 PDF 文件中。 有关详细信息,请参阅 msdn.microsoft.com 上的“TTGetEmbeddingType”。
    • 字体为 TrueType。
    • 字体由报表中的可见项引用。如果字体被 Hidden 属性设置为 True 的项目引用,
      显示渲染数据不需要字体,也不会包含在其中
      在文件中。仅在需要显示时嵌入字体
      呈现的报告数据。

    因此,如果您不满足这些要求,则不应嵌入您的字体。

    【讨论】:

      【解决方案3】:

      您真的不应该在 ASP.NET MVC 中使用 Microsoft.ReportViewer.WebForms。 而只是调用您的报告服务器并获取所需的报告。

      public async Task<FileStreamResult> GenerateReport()
      {
      
          CredentialCache credentialCache = new CredentialCache();
          credentialCache.Add(new Uri("http://domainORipaddress"), "NTLM", new NetworkCredential(
              ConfigurationManager.AppSettings["username"],
              ConfigurationManager.AppSettings["password"]
          ));
      
          Stream report = null;
          using (var httpClient = new HttpClient(new HttpClientHandler { Credentials = credentialCache }))
          { 
              //put the desired timeout here if needed to cancel the task
              httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
              report = await httpClient.GetStreamAsync("reportUrl");
          }
      
          Response.AppendHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", reportName));
          return File(reportPath, MediaTypeNames.Application.Pdf);
      }
      

      参考:SQL Server Reporting Service with ASP.NET MVC

      引入了字体嵌入:

      SQL Server 2008 累积更新 1(Unicode 字符的完整字体嵌入和子集)

      SQL Server 2005 Service Pack 3(仅限非 ANSI 字符)

      参考:Do You Unicode in PDF?

      字体嵌入不再与客户端上安装的字体版本无关 - 无论客户端操作系统、字体版本和客户端 PDF 查看器如何,都可以以相同的方式查看文档。

      因此,当您禁用字体嵌入时,您基本上会恢复到旧的行为

      如何禁用:

      1. 打开路径下的RSreportserver.config文件:RS Installation Folder\Reporting Services\ReportServer

      参考:Modify a Reporting Services Configuration File (RSreportserver.config)

      1. 找到以下

            <Extension Name="PDF" Type="    
            Microsoft.ReportingServices.Rendering.ImageRenderer.PdfReport,
            Microsoft.ReportingServices.ImageRendering"/>
        
      2. 添加以下内容

         <Configuration>
           <DeviceInfo>
              <EmbedFonts>None</EmbedFonts>
           </DeviceInfo>
          </Configuration>
        
      3. 您需要执行 IISReset(IISReset 停止并重新启动整个 Web 服务器(包括非 ASP.NET 应用程序)以设置更改。

      参考:How to disable this Font embedding in Reporting Services 2005 Service Pack 3?

      【讨论】:

      • 我使用 Microsoft.ReportViewer.WebForms,因为我在 winform 应用程序中使用相同的代码,并且在生成 pdf 时得到相同的结果。
      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2020-04-05
      • 2020-12-02
      • 1970-01-01
      • 2014-12-17
      • 2013-10-14
      相关资源
      最近更新 更多