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)并设置高分辨率图像来使其工作。但是这次我们得到了一些新的隐式限制。
隐式限制
- 当前页码
客户想要在发票文章上方显示当前页码 table(参见“stationary_paper_page_number.png”3)。您只能在报告的页眉或页脚部分获得此信息
- 图像元素
我设置为“报告背景”的图像元素不能放在报告的页眉、正文和页脚中(参见“stationary_paper_image_as_background.png”4)
所以要么客户改变他们的报告布局,要么我让这件事继续下去。
新问题
- 将高分辨率图像设置为背景
如前所述,当您简单地将高分辨率图像设置为背景时,您将(可能)遇到“缩放”错误,如“stationary_paper_falsely_scaled.png”2 中所示。图像几乎完全超出范围。
- 将低分辨率图像设置为背景
如果您将低分辨率图像设置为背景,您将(可能)看到一种模糊背景,如“stationary_paper_low_res.png”5 中所见。当您使用“PDF 打印机”(例如“Microsoft 打印到 PDF”)导出此解决方案时,也会发生这种情况。
经过一些挖掘和测试,我终于让它工作了(至少在我看来)
解决方案
- 设置报表背景
我将报告的背景设置如下:
Source: External
Value: ="file:" + Parameters!PathToStationeryPaper.Value
MIMEType: image/jpeg
- 检查文具纸的使用情况
由于并非整个软件解决方案的所有报告都使用固定纸,所以我只检查报告参数。
private bool reportUsesStationaryPaper()
{
var result = false;
foreach (var param in reportViewer1.LocalReport.GetParameters())
{
if (param.Name.Equals("UsesStationeryPaper"))
{
result = true;
break;
}
}
return result;
}
- 在预览时显示低分辨率图片
在事件“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));
}
}
- 添加设备信息
在事件“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));
}
}
- [选择] 显示导出按钮
如果您不需要单独的按钮来调用 reportviewer 元素的导出方法,您可以通过 UI Designer 或代码
启用它
结果
- 预览
可以设置较低分辨率的更高性能,如果需要,还可以设置“预览”水印 1
- 在“pdf 打印机”上打印(这里是“Microsoft 打印到 pdf”)
仍然模糊,因为我们无法在“reportviewer_PrintingBegin”或“reportviewer_Print”中设置分辨率
- 使用 Reportviewer 导出
当通过导出 reportviewer 控件导出时,您现在将获得一个漂亮的高分辨率图像作为报告的背景
进一步的后果
由于我客户的用户习惯于“打印为 pdf”,客户现在要么需要培训用户使用报告查看器导出按钮,要么将在视图中引入一个单独的按钮“导出为 PDF”。
最近,我必须为我当前的一位客户创建一份 RDLC 报告。更具体地说,是数字固定纸上的发票。 (参见“stationary_paper_example.png”1)。
问题
当高分辨率图像设置为报告背景时,图像缩放完全关闭。参见“stationary_paper_falsely_scaled.png”2
以前的解决方法
由于以前只是一个项目介绍了带有数字文具纸的报告,因此我们通过在背景中设置图像元素(z-index)并设置高分辨率图像来使其工作。但是这次我们得到了一些新的隐式限制。
隐式限制
- 当前页码
客户想要在发票文章上方显示当前页码 table(参见“stationary_paper_page_number.png”3)。您只能在报告的页眉或页脚部分获得此信息
- 图像元素
我设置为“报告背景”的图像元素不能放在报告的页眉、正文和页脚中(参见“stationary_paper_image_as_background.png”4)
所以要么客户改变他们的报告布局,要么我让这件事继续下去。
新问题
- 将高分辨率图像设置为背景
如前所述,当您简单地将高分辨率图像设置为背景时,您将(可能)遇到“缩放”错误,如“stationary_paper_falsely_scaled.png”2 中所示。图像几乎完全超出范围。
- 将低分辨率图像设置为背景
如果您将低分辨率图像设置为背景,您将(可能)看到一种模糊背景,如“stationary_paper_low_res.png”5 中所见。当您使用“PDF 打印机”(例如“Microsoft 打印到 PDF”)导出此解决方案时,也会发生这种情况。
经过一些挖掘和测试,我终于让它工作了(至少在我看来)
解决方案
- 设置报表背景
我将报告的背景设置如下:
Source: External
Value: ="file:" + Parameters!PathToStationeryPaper.Value
MIMEType: image/jpeg
- 检查文具纸的使用情况 由于并非整个软件解决方案的所有报告都使用固定纸,所以我只检查报告参数。
private bool reportUsesStationaryPaper()
{
var result = false;
foreach (var param in reportViewer1.LocalReport.GetParameters())
{
if (param.Name.Equals("UsesStationeryPaper"))
{
result = true;
break;
}
}
return result;
}
- 在预览时显示低分辨率图片 在事件“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));
}
}
- 添加设备信息 在事件“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));
}
}
- [选择] 显示导出按钮 如果您不需要单独的按钮来调用 reportviewer 元素的导出方法,您可以通过 UI Designer 或代码 启用它
结果
- 预览
可以设置较低分辨率的更高性能,如果需要,还可以设置“预览”水印 1
- 在“pdf 打印机”上打印(这里是“Microsoft 打印到 pdf”)
仍然模糊,因为我们无法在“reportviewer_PrintingBegin”或“reportviewer_Print”中设置分辨率
- 使用 Reportviewer 导出
当通过导出 reportviewer 控件导出时,您现在将获得一个漂亮的高分辨率图像作为报告的背景
进一步的后果
由于我客户的用户习惯于“打印为 pdf”,客户现在要么需要培训用户使用报告查看器导出按钮,要么将在视图中引入一个单独的按钮“导出为 PDF”。