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

C# RDLC导出为具有高分辨率背景图像的pdf,c#,background-image,rdlc,export-to-pdf,high-resolution,C#,Background Image,Rdlc,Export To Pdf,High Resolution,最近,对于我当前的一个客户,我不得不创建一个RDLC报告。更具体地说,是数字固定纸上的发票。(参见“stational\u paper\u example.png”) 问题 将高分辨率图像设置为报告背景时,图像的缩放将完全关闭。请参阅“静止的\u纸张\u错误的\u缩放.png” 以前的解决方法 由于使用数字固定纸的报告之前只是一个项目,我们通过在背景中设置图像元素(z索引)并设置高分辨率图像使其工作。但这次我们有了一些新的隐含限制 隐含限制 当前页码 客户希望在invoice articles表

最近,对于我当前的一个客户,我不得不创建一个RDLC报告。更具体地说,是数字固定纸上的发票。(参见“stational\u paper\u example.png”)

问题 将高分辨率图像设置为报告背景时,图像的缩放将完全关闭。请参阅“静止的\u纸张\u错误的\u缩放.png”

以前的解决方法 由于使用数字固定纸的报告之前只是一个项目,我们通过在背景中设置图像元素(z索引)并设置高分辨率图像使其工作。但这次我们有了一些新的隐含限制

隐含限制
  • 当前页码
  • 客户希望在invoice articles表上方显示当前页码(请参阅“stational\u paper\u page\u number.png”)。您只能在报告的页眉或页脚部分获取此信息

  • 象元
  • 我设置为“report background”的图像元素不能放在报表的页眉、正文和页脚内(请参阅“stational\u paper\u image\u as\u background.png”)

    因此,要么客户改变他们的报告布局,要么我开始做这件事

    新问题
  • 将高分辨率图像设置为背景
  • 如前所述,当您简单地将高分辨率图像设置为背景时,您将(可能)遇到“缩放”错误,如“stational\u paper\u false\u scaled.png”中所示。图像渲染几乎完全超出范围

  • 将低分辨率图像设置为背景

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

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

    解决方案
  • 设置报告的背景
  • 我将报告的背景设置如下:

    Source:   External
    Value:    ="file:" + Parameters!PathToStationeryPaper.Value
    MIMEType: image/jpeg
    
  • 检查固定纸张的使用情况 由于不是整个软件解决方案的所有报告都使用固定纸张,所以我只检查报告参数
  • 预览时显示低分辨率图像 在“reportviewer\u RenderingBegin”事件中,我设置了一个低分辨率图像以提高性能。您也可以在此处设置带有水印的固定纸张版本
  • 添加设备信息 在“reportviewer\u ReportExport”事件中,我将路径设置为高分辨率图像,并添加设备信息(“ReportExportEventArgs.DeviceInfo”),以提高分辨率,因为导出功能似乎能够以更高的质量工作
  • private void reportViewer1\u ReportExport(对象发送方,ReportExportEventArgs e)
    {
    如果(reportUsesStationaryPaper())
    {
    //将报告重置为高分辨率模式以进行打印
    字符串设备信息=
    @"         
    300
    300
    ";
    e、 设备信息=设备信息;
    var pathToStationaryPaper=“[…]”/stational_highres.png”;
    reportViewer1.LocalReport.SetParameters(新的Microsoft.Reporting.WinForms.ReportParameter(“PathToStationeryPaper”,pathToStationaryPaper));
    }
    }
    
  • [OPT]显示导出按钮 如果不需要单独的按钮来调用reportviewer元素的导出方法,则可以通过UI设计器或代码启用它
  • 结果
  • 预演
  • 可以设置更高的性能和更低的分辨率,如果需要,还可以设置“预览”水印

  • 在“pdf打印机”(此处为“Microsoft打印到pdf”)上打印
  • 仍然模糊,因为我们无法在“reportviewer\u PrintingBegin”或“reportviewer\u Print”中设置分辨率

  • 使用Reportviewer导出
  • 当通过reportviewer控件的导出导出时,您现在将获得一个漂亮的高分辨率图像作为报告的背景
    private bool reportUsesStationaryPaper()
    {
       var result = false;
       foreach (var param in reportViewer1.LocalReport.GetParameters())
       {
          if (param.Name.Equals("UsesStationeryPaper"))
          {
             result = true;
             break;
          }
       }
       return result;
    }
    
    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));
       }
    }
    
    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));
       }
    }