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

RDLC export to pdf with high resolution background image

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

问题

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

以前的解决方法

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

隐式限制

  1. 当前页码

客户想要在发票文章上方显示当前页码 table(参见“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 打印到 PDF”)导出此解决方案时,也会发生这种情况。

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

解决方案

  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. [选择] 显示导出按钮 如果您不需要单独的按钮来调用 reportviewer 元素的导出方法,您可以通过 UI Designer 或代码
  2. 启用它

结果

  1. 预览

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

  1. 在“pdf 打印机”上打印(这里是“Microsoft 打印到 pdf”)

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

  1. 使用 Reportviewer 导出

当通过导出 reportviewer 控件导出时,您现在将获得一个漂亮的高分辨率图像作为报告的背景

进一步的后果

由于我客户的用户习惯于“打印为 pdf”,客户现在要么需要培训用户使用报告查看器导出按钮,要么将在视图中引入一个单独的按钮“导出为 PDF”。