将RDLC渲染中嵌入的默认字体排除为PDF

时间:2014-03-11 10:20:28

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

我尝试将RDLC报告呈现为PDF文件,并且生成的文件大小超过正常值。经过一些研究,我发现PDF生成的嵌入字体: ..... 9 0 obj << / Filter / FlateDecode / Length 52986 / Length1 194264>> 流 .....

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

如果我使用Adobe Acrobat打开PDF,则相同。

解决方案1:

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

失败

Solutin 2:

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

失败

小PDF字体属性: Small PDF

大PDF字体属性: enter image description here

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

3 个答案:

答案 0 :(得分:3)

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

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

我找到了the answer here

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

你真的不应该在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安装文件夹\ Reporting Services \ ReportServer
  2. 参考: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应用程序)以设置更改。

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