將 ActiveReports 報表輸出為 PDF 檔

更新頁 :
頁面創建日期 :

操作環境

窗戶
  • 視窗 10 專業版 22H2
Visual Studio的
  • Visual Studio 2022 社區版
適用於 .NET 的 ActiveReports
  • 適用於 .NET 16.0J 的 ActiveReports

先決條件

窗戶
  • Windows 8.1
  • 視窗 10
  • 窗戶11
  • Windows 伺服器 2012
  • Windows 伺服器 2012 R2
  • Windows 伺服器 2016
  • Windows 伺服器 2019
  • 視窗伺服器 2022
Visual Studio的
  • Visual Studio 2017的
  • Visual Studio 2019 中
  • Visual Studio 2022 中
.NET 框架
  • NET 框架 4.6.2
  • NET 框架 4.7
  • NET 框架 4.8
。網
  • .NET Core 3.1
  • .NET 5
  • .NET 6
適用於 .NET 的 ActiveReports
  • 適用於 .NET 16.0J 的 ActiveReports

如何輸出到 PDF 檔

如果使用者希望將報表作為 PDF 檔,則提供該報表的最快方法是在查看器中查看報表。 除了顯示報表外,查看器還具有列印和輸出PDF等檔的功能,因此,如果顯示查看器,則可以要求使用者輸出PDF檔。

但是,在某些情況下,您可能不想打擾使用者,或者您可能希望系統地定向 PDF 檔。 本節介紹如何以程式設計方式直接從報表輸出 PDF 檔。

PDF 檔案輸出方法和限制

有幾種方法可以以程式設計方式輸出 PDF 檔,但並非所有方法都可以接受。 這取決於 ActiveReports 的版本、平臺、框架和它執行的報告類型。 例如,在 ActiveReports 16 中,節報表和頁報表的輸出方式不同。 這方面的一個例子也可以在官方頁面上找到。

出於這個原因,這裡有一些程式設計 PDF 輸出的示例,您可以將其用作參考,以找到適合您的項目的輸出。

關於示例報告

新專案範本中包含的報告檔為空,因此我們將使用官方的範例報告。 以下是一些建議,因此請從以下網站之一下載。

在本例中,我們將使用以下示例報告。

  • 頁面報告 : Estimate_page_ipa.rdlx
  • 部分報告:Invoice.rpx(包含在 WebSample16 示例專案中)

呈現和生成 PDF(頁面報表/RDL 報表)

有一個用於輸出 PDF 的「導出篩檢程式」 ,但在版本 16 中,它只能用於章節報告。

因此,頁面報告/RDL 報告需要使用“繪圖擴展”生成,如上頁所述。

首先,我將創建一個專案,但這次我將使用一個簡單的控制台應用程式來製作它。 它適用於桌面和 Web 版本就像應用於 Web 版本一樣容易。

創建專案時,請選擇「主控台應用」。

創建專案后,添加所需的包。

以下是您將新增的內容: 請不要獲取最新版本,而是使用下面描述的版本。 似乎某些軟體包組合在最新版本中無法正常工作。 將顯示一個警告標記,但請忽略它,因為依賴項不匹配。 但是,將來可能會隨著版本升級而改變,因此請每次進行調整。 GrapeCity.Documents.Imaging GrapeCity.Documents.Pdf 並且需要渲染為 PDF。

  • GrapeCity.ActiveReports.Export.pdf (16.4.0)
  • GrapeCity.Documents.Imaging (6.0.3)
  • 葡萄城.Documents.pdf (6.0.3)

將報告檔添加到專案中。 位置可以在任何地方,但這次我要 Reports 創建一個資料夾並將其放入其中。 此放置位置會影響您稍後指定的路徑。

接下來,打開已添加報表的屬性。

將生成操作設置為「嵌入資源」。 這意味著將資源嵌入到 EXE (DLL) 中。 報表在桌面上是唯一載入的,就像在Web上一樣。

接下來,編寫代碼以載入報表並將其列印為 PDF。 由於它是主控台應用程式,因此應按原樣在 Program.cs 中描述,但如果是桌面,則應在按鈕事件等中描述,如果是 ASP.NET,則應在發佈時在處理的地方進行描述。

// レポートファイルがあるパス
var reportPath = "ConsoleApp1.Reports.Estimate_page_ipa.rdlx";

// 埋め込みリソースを Stream をして取り出す
var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(reportPath);
if (stream == null) return;

// ページレポートに変換します
using var sr = new StreamReader(stream);
var pageReport = new GrapeCity.ActiveReports.PageReport(sr);

// PDF 描画拡張を定義します
var pdfRenderingExtension = new GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension();

// メモリストリームとして出力する定義です
var outputProvider = new GrapeCity.ActiveReports.Rendering.IO.MemoryStreamProvider();

// レポートを PDF にレンダリングします
pageReport.Document.Render(pdfRenderingExtension, outputProvider);

// Stream に変換します
var ps = outputProvider.GetPrimaryStream();
var outputStream = ps.OpenStream();

我不會詳細解釋它是什麼類型的處理,因為它是寫在代碼的註釋中。 關鍵是在第一行中指定報告檔的位置。 格式如下 <アセンブリ名>.<レポートファイルのパス> ,所有路徑分隔符均為句點。

最後一個是Stream,請根據處理內容將其轉換為PDF。

例如,如果要將其另存為本地檔,請添加以下內容。

// ファイルにストリームを書き出します
using var fs = new FileStream("Output.pdf", FileMode.Create);
outputStream.CopyTo(fs);

如果要使用 ASP.NET 下載它,請添加以下內容。

return File(outputStream, "application/pdf", "Output.pdf");

嘗試打開輸出的 PDF 檔,看看是否可以。

使用匯出過濾器輸出 PDF(部分報告)

使用可用於章節報告的 PDF 匯出過濾器。

它在主控台專案中的創建方式與頁面報表的創建方式相同。 您在此處建立的代碼和設置可以應用於其他專案。

創建專案后,添加所需的包。 這一次,我們將使用匯出篩檢程式進行輸出,因此我們只添加一個。

  • GrapeCity.ActiveReports.Export.pdf (16.4.0)

將報告檔添加到專案中。 位置可以在任何地方,但這次我要 Reports 創建一個資料夾並將其放入其中。 此放置位置會影響您稍後指定的路徑。

接下來,打開已添加報表的屬性。

將生成操作設置為「嵌入資源」。 這意味著將資源嵌入到 EXE (DLL) 中。 報表在桌面上是唯一載入的,就像在Web上一樣。

接下來,編寫代碼以載入報表並將其列印為 PDF。 由於它是主控台應用程式,因此應按原樣在 Program.cs 中描述,但如果是桌面,則應在按鈕事件等中描述,如果是 ASP.NET,則應在發佈時在處理的地方進行描述。

// レポートファイルがあるパス
var reportPath = "ConsoleApp1.Reports.Invoice.rpx";

// 埋め込みリソースを Stream をして取り出す
var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(reportPath);
if (stream == null) return;

// Stream を XML として読み込めるようにします
var xr = System.Xml.XmlReader.Create(stream);

// セクションレポートとして読み込みます
var sectionReport = new GrapeCity.ActiveReports.SectionReport();
sectionReport.LoadLayout(xr);
sectionReport.Run();

// PDF のエクスポートフィルターを作成します
var pdfExport = new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();

// メモリストリームに PDF の情報を書き出します
var outputStream = new System.IO.MemoryStream();
pdfExport.Export(sectionReport.Document, outputStream);
outputStream.Seek(0, SeekOrigin.Begin);

我不會詳細解釋它是什麼類型的處理,因為它是寫在代碼的註釋中。 關鍵是在第一行中指定報告檔的位置。 格式如下 <アセンブリ名>.<レポートファイルのパス> ,所有路徑分隔符均為句點。

最後一個是Stream,請根據處理內容將其轉換為PDF。

例如,如果要將其另存為本地檔,請添加以下內容。

// ファイルにストリームを書き出します
using var fs = new FileStream("Output.pdf", FileMode.Create);
outputStream.CopyTo(fs);

如果要使用 ASP.NET 下載它,請添加以下內容。

return File(outputStream, "application/pdf", "Output.pdf");

嘗試打開輸出的 PDF 檔,看看是否可以。