RDLC 导出为具有高分辨率背景图像的 pdf

问题描述 投票:0回答:1

最近,我必须为我当前的一个客户创建一份 RDLC 报告。更具体地说,是数字固定纸上的发票。 (参见“stationary_paper_example.png”1)。

问题

当高分辨率图像设置为报告背景时,图像的缩放完全关闭。请参阅“stationary_paper_falsely_scaled.png”2

之前的解决方法

由于之前仅在一个项目中介绍了带有数字固定纸的报告,因此我们通过在背景中设置图像元素(z-index)并设置高分辨率图像来使其工作。但这一次我们得到了一些新的隐含限制。

隐性限制

  1. 当前页码

客户希望在发票文章表上方显示当前页码(请参阅“stationary_paper_page_number.png”3)。您只能在报告的页眉或页脚部分获取此信息

  1. 图像元素

我设置为“报告背景”的图像元素不能放置在报告的页眉、正文和页脚内(参见“stationary_paper_image_as_background.png”4

所以要么客户改变他们的报告布局,要么我让这件事继续下去。

新问题

  1. 设置高分辨率图像作为背景

如前所述,当您简单地将高分辨率图像设置为背景时,您(可能)会遇到“缩放”错误,如“stationary_paper_falsely_scaled.png”中所示2。图像渲染几乎完全超出范围。

  1. 设置低分辨率图像作为背景

如果您将低分辨率图像设置为背景,您(可能)会看到一种模糊背景,如“stationary_paper_low_res.png”5中所示。当您使用“pdf打印机”(例如“Microsoft print to pdf”)导出此解决方案时,也会发生这种情况。

c# background-image rdlc export-to-pdf high-resolution
1个回答
1
投票

经过一些挖掘和测试,我终于让它工作了(至少在我看来)

解决方案

  1. 设置报告背景

我将报告的背景设置如下:

Source:   External
Value:    ="file:" + Parameters!PathToStationeryPaper.Value
MIMEType: image/jpeg
  1. 检查文具纸的使用情况 由于并非整个软件解决方案的所有报告都使用固定纸,因此我只检查报告参数。
private bool reportUsesStationaryPaper()
{
   var result = false;
   foreach (var param in reportViewer1.LocalReport.GetParameters())
   {
      if (param.Name.Equals("UsesStationeryPaper"))
      {
         result = true;
         break;
      }
   }
   return result;
}
  1. 在预览时显示低分辨率图像 在事件“reportviewer_RenderingBegin”中,我设置了低分辨率图像以提高性能。您还可以在这里设置带有水印的文具纸版本
private void reportViewer1_RenderingBegin(object sender, CancelEventArgs e)
{
   if (reportUsesStationaryPaper())
   {
      //Reset report to low-resolution mode for screen rendering
      var pathToStationaryPaper = "[…]/stationary_lowres.png";
      reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("PathToStationeryPaper", pathToStationaryPaper));
   }
}
  1. 添加设备信息 在“reportviewer_ReportExport”事件中,我设置了高分辨率图像的路径,并另外添加了设备信息(“ReportExportEventArgs.DeviceInfo”)以提高分辨率,因为导出功能似乎能够以更高的质量工作。
private void reportViewer1_ReportExport(object sender, ReportExportEventArgs e)
{
   if (reportUsesStationaryPaper())
   {
      //Reset report to high-resolution mode for printing
      string deviceInfo =
               @"<DeviceInfo>         
                  <DpiX>300</DpiX>
                  <DpiY>300</DpiY>
                 </DeviceInfo>";
      e.DeviceInfo = deviceInfo; 
      var pathToStationaryPaper = "[…]/stationary_highres.png";
      reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("PathToStationeryPaper", pathToStationaryPaper));
   }
}
  1. [OPT] 显示导出按钮 如果您不需要单独的按钮来调用reportviewer元素的导出方法,您可以通过UI设计器或代码启用它

结果

  1. 预览

可以设置较低分辨率的更高性能,如果需要,还可以设置“预览”水印1

  1. 在“pdf 打印机”上打印(此处为“Microsoft 打印到 pdf”)

仍然模糊,因为我们无法在“reportviewer_PrintingBegin”或“reportviewer_Print”中设置分辨率

  1. 使用报表查看器导出

通过报表查看器控件的导出进行导出时,您现在将获得一个漂亮的高分辨率图像作为报表的背景😊

进一步的后果

由于我的客户的用户习惯于“打印到 pdf”,因此客户现在需要培训用户使用报表查看器导出按钮,或者在视图中引入单独的按钮“导出到 PDF”。

© www.soinside.com 2019 - 2024. All rights reserved.