簡體   English   中英

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. 當前頁碼

客戶希望在發票文章表上方顯示當前頁碼(請參閱“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”)導出此解決方案時,也會發生這種情況。

經過一些挖掘和測試,我終於讓它工作了(至少在imo)

解決方案

  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] 顯示導出按鈕如果您不需要單獨的按鈕來調用報表查看器元素的導出方法,您可以通過 UI 設計器或代碼啟用它

結果

  1. 預覽

可以設置作為較低分辨率的更高性能,如果需要,還可以設置“預覽”水印1

  1. 在“pdf 打印機”上打印(此處為“Microsoft 打印到 pdf”)

仍然模糊,因為我們無法在“reportviewer_PrintingBegin”或“reportviewer_Print”中設置分辨率

  1. 使用報表查看器導出

當通過導出報表查看器控件導出時,您現在將獲得一個漂亮的高分辨率圖像作為報告的背景😊

進一步的后果

由於我客戶端的用戶習慣於“打印為 pdf”,因此客戶端現在要么需要培訓用戶使用報表查看器導出按鈕,要么將在視圖中引入一個單獨的按鈕“導出為 PDF”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM