跳至頁尾內容
使用IRONPDF

using IronPDF 在 .NET Core 中建立 PDF 生成器

規模生成報表的問題

IronPDF 主頁 對於小規模客戶群,導出CSV並手動格式化雖然緩慢但可以忍受。 對於幾百名客戶來說,這成為了一個專門的任務。 對於幾千名客戶來說,這成為了一個阻塞結算周期的瓶頸。

SSRS和Crystal Reports長時間以來是標準解決方案。它們仍然有效,但輸出看起來像是2008年建造的,難於設計主題,維護成本高昂,並且與產品的其他視覺設計脫節。 更新報告定義需要專家,並且輸出很少能夠在不付出重大努力的情況下與品牌相匹配。

第三方報表生成API解決了外觀問題,但引入了新的問題。 每個文件的定價直接隨著客戶增長而擴展,這意味著每當業務成功時,基礎設施成本就會上升。 還存在網路依賴問題:如果API在結算運行時不可用,整個周期將停滯。

性能方面並不簡單。 一個SaaS平台在月初為10,000名客戶生成使用總結,一個電信系統生成明細通話記錄,一個物業管理員向數百名租戶發送租金賬本,所有這些都有一個必須完成運行的窗口。 沒有為吞吐量設計的方案將會遺漏掉。

與此同時,客戶期望得到一份看起來屬於他們支付的產品的品牌文件,而不是在上面放了一個標識的原始資料導出。

這個IronPDF範例演示了現代.NET應用程式如何自動生成品牌PDF文件然後在大規模向客戶交付。 使用IronPDF C# PDF函式庫,開發者可以在.NET項目中將HTML轉換為可靠的PDF文件,而不需要依賴外部服務。 這裡展示的方法能在多個平台上運行,輕鬆整合到Visual Studio中,並採用.NET開發者已經信任的NuGet庫進行PDF分發模型。

解決方案:使用IronPDF C#PDF庫的批量PDF生成

IronPDF允許.NET應用程式從HTML和CSS模板生成品牌PDF報表,支持迴圈作業或背景任務。 每個客戶的資料填充相同的模板,ChromePdfRenderer生成PDF,應用程式通過電子郵件傳送或發布到自助服務門戶。

沒有SSRS安裝需要維護,沒有Crystal Reports許可需要續期,沒有隨著客戶數量增長的每文件費用。 IronPDF作為單一NuGet包運行在您現有的.NET應用程式內,不需要外部過程。 HTML模板由您的團隊擁有,使用與產品其餘部分相同的CSS進行樣式化,並可以根據您的計劃更新。

安裝IronPDF NuGet包

大多數開發者通過Visual Studio中的NuGet包管理器安裝IronPDF。 打開Visual Studio解決方案資源管理器,右鍵點擊參考,選擇管理NuGet包,然後搜尋(Ctrl)IronPDF並點擊安裝IronPDF。

NuGet標誌出現在包列表旁,確認可以使用最新的NuGet版本。 安裝後,將所需的命名空間新增到項目中:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

IronPDF作為C# PDF DLL通過C# NuGet庫發佈,讓任何.NET文件工作流程的安裝變得簡單。

實際運行:在您的.NET項目中使用IronPDF

1. 排程的作業觸發結算運行

在每個結算期開始時(通常是1日午夜),BackgroundService、Hangfire周期性作業或Quartz.NET調度程式會啟動。該作業查詢所有活躍客戶和其結算期間資料的結算資料庫:行項目、費用、信貸、運行餘額和使用量指標。

查詢返回每個客戶的一組記錄。 從這一點開始,報表生成就成為了一個迴圈。

2. 為每位客戶填充HTML模板

模板是一個標準HTML字串或一個渲染的Razor視圖。 它包含公司標誌(嵌入為base64資料URI以便於部署安全渲染)、客戶的帳號、報表期間以及組織到各個區段的所有結算細節、使用量分析、費用、信貸和結算餘額。

模板是每個報表外觀的唯一真實來源。 當法務團隊需要新的披露頁尾時,或設計團隊更新配色方案時,一個文件更改,所有未來的報表都會反映出來。

3. ChromePdfRenderer呈現每個報表

在這個IronPDF範例中,ChromePdfRenderer將動態HTML內容轉換為生成的PDF文件,展示了如Adobe Reader這樣的現代PDF查看器如何準確顯示最終的PDF內容。

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

foreach (var customer in activeCustomers)

{
    string html = $@"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";

    PdfDocument statement = renderer.RenderHtmlAsPdf(html);
    await DeliverStatementAsync(customer, statement);
}
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

foreach (var customer in activeCustomers)

{
    string html = $@"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>";

    PdfDocument statement = renderer.RenderHtmlAsPdf(html);
    await DeliverStatementAsync(customer, statement);
}
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

renderer.RenderingOptions.MarginTop = 20

renderer.RenderingOptions.MarginBottom = 20

For Each customer In activeCustomers

    Dim html As String = $"
        <h1>Account Statement — {customer.StatementPeriod}</h1>
        <p><strong>Account:</strong> {customer.AccountNumber}</p>
        <p><strong>Name:</strong> {customer.FullName}</p>
        <hr/>
        <h2>Charges This Period</h2>
        {customer.LineItemsHtml}
        <p><strong>Closing Balance:</strong> {customer.ClosingBalance:C}</p>"

    Dim statement As PdfDocument = renderer.RenderHtmlAsPdf(html)
    Await DeliverStatementAsync(customer, statement)
Next
$vbLabelText   $csharpLabel

已渲染的PDF文件輸出

IronPDF 範例生成的PDF輸出 在迴圈中重用相同的ChromePdfRenderer實例可以避免冗餘的初始化開銷。 對於成千上萬的客戶基數,該作業可以對列表進行分區,並在可用的内核上運行並行批次,以保持在結算窗口內。

提示對並行批次處理而言,為每個執行緒實例化一個單獨的ChromePdfRenderer,而不是共用一個實例。 渲染器不是執行緒安全的,但多個實例可以無爭用地同時運行。

4. PDF通過電子郵件傳送並儲存以供門戶存取

PdfDocument公開BinaryData,直接寫入MemoryStream以用作電子郵件附件,不需文件系統寫入:

using System.Net.Mail;
using System.IO;

async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
    var pdfBytes = statement.BinaryData;
    // Store in blob storage for portal download
    await _blobClient.UploadAsync(
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
        new BinaryData(pdfBytes)
    );

    // Email to customer
    using var stream = new MemoryStream(pdfBytes);
    using var attachment = new Attachment(stream,
        $"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
    var message = new MailMessage("billing@yourcompany.com", customer.Email)
    {
        Subject = $"Your {customer.StatementPeriod} Statement",
        Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
    };

    message.Attachments.Add(attachment);

    using var smtp = new SmtpClient("smtp.yourprovider.com");

    await smtp.SendMailAsync(message);
}
using System.Net.Mail;
using System.IO;

async Task DeliverStatementAsync(CustomerRecord customer, PdfDocument statement)
{
    var pdfBytes = statement.BinaryData;
    // Store in blob storage for portal download
    await _blobClient.UploadAsync(
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf",
        new BinaryData(pdfBytes)
    );

    // Email to customer
    using var stream = new MemoryStream(pdfBytes);
    using var attachment = new Attachment(stream,
        $"Statement-{customer.StatementPeriod}.pdf", "application/pdf");
    var message = new MailMessage("billing@yourcompany.com", customer.Email)
    {
        Subject = $"Your {customer.StatementPeriod} Statement",
        Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached."
    };

    message.Attachments.Add(attachment);

    using var smtp = new SmtpClient("smtp.yourprovider.com");

    await smtp.SendMailAsync(message);
}
Imports System.Net.Mail
Imports System.IO

Async Function DeliverStatementAsync( _
    customer As CustomerRecord, _
    statement As PdfDocument) As Task

    Dim pdfBytes = statement.BinaryData
    ' Store in blob storage for portal download
    Await _blobClient.UploadAsync( _
        $"statements/{customer.AccountNumber}/{customer.StatementPeriod}.pdf", _
        New BinaryData(pdfBytes) _
    )

    ' Email to customer
    Using stream As New MemoryStream(pdfBytes)
        Using attachment As New Attachment(stream, _
            $"Statement-{customer.StatementPeriod}.pdf", "application/pdf")
            Dim message As New MailMessage("billing@yourcompany.com", customer.Email) With { _
                .Subject = $"Your {customer.StatementPeriod} Statement", _
                .Body = $"Dear {customer.FullName}, your statement for {customer.StatementPeriod} is attached." _
            }

            message.Attachments.Add(attachment)

            Using smtp As New SmtpClient("smtp.yourprovider.com")
                Await smtp.SendMailAsync(message)
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

範例:附加PDF發票的電子郵件

附加PDF的電子郵件 Blob儲存按帳號和期間為文件鍵入,使門戶檢索變得簡單,只需查詢即可。客戶可以自行下載當前和歷史報表,無需聯繫支援。

現實世界的好處

規模。IronPDF在毫秒內呈現每個報表。 當在内核上並行化運行時,5,000名客戶的結算運行在分鐘內完成,這在典型的隔夜結算窗口內。

品牌一致性。每個報表都具有相同的標誌、配色方案、字體和佈局。 沒有不匹配的導出風險,也不會因為是由不同的團隊成員生成的而導致外觀不同的報表。

客戶自助服務。儲存在Blob中的報表在結算運行結束後立即可供門戶下載。 客戶可以自行檢索當前和過去的期間,對於"您能重新發送我的報表嗎"的支持票量相應減少。

合規性和歸檔。IronPDF支持PDF/A輸出,這是ISO標準化的長期文件歸檔格式。 對於金融機構和受法規約束的行業,PDF/A報表滿足記錄保存要求,而不需要單獨的歸檔步驟。啟動它只需要一個渲染選項。

模板重用。HTML和CSS模板由您的團隊與其他應用程式碼一起維護。 更新它所需的技能與更新任何其他視圖樣式一致—不需要報告設計師,不需要專有定義格式。

無每份文件費用。 渲染在內部進行。 沒有與報表供應商的API調用,沒有需跟蹤的計量使用,也沒有隨客戶增長的基礎設施賬單行項目。

開始使用IronPDF

開發人員可以使用功能齊全的免費試用版來測試該庫,其中包括在帳號建立後通過試用表單提供的試用金鑰。 在評估過程中不需要信用卡測試,這意味著團隊可以在沒有任何承諾的情況下探索主要功能。

IronPDF是更廣泛Iron Suite的一部分,通常由Iron Suite Enterprise徽標代表,並在Iron Software的客戶徽標中展示Iron Suite相關品牌。 該工具包幫助公司解決.NET應用程式和企業系統中的文件工作流程痛點。

如果您需要演示,可以向軟體產品演示團隊請求即時演示、個人演示或Iron Software產品演示。 銷售團隊安排會議,屆時軟體企業諮詢團隊和Iron Software企業諮詢專家將提供專案特定功能建議並回答技術問題。

結語

月度報表生成看起來像是一個已解決的問題,直到您嘗試在大規模進行品牌一致性和可靠交付。 十年前的標準工具產生的輸出已經不再適合當前的產品外觀,SaaS替代方案則是以另一組限制換取這些限制。

由IronPDF驅動的批量迴圈用HTML模板、一個渲染器、一個傳送步驟代替了所有這些,全部運行在您的團隊已經擁有和運行的應用程式內。 IronPDF涵蓋了C#中的PDF工作全生命周期—from 渲染和生成文件到保存、串流和操控—all from the same library at ironpdf.com。 如果您在建設或重新設計報表管道,開始您的免費30天試用並在承諾前對您自己的資料運行完整的結算周期。

常見問題

大規模生成每月帳戶對帳單的主要挑戰是什麼?

在大規模生成每月帳戶對帳單時,主要的挑戰是確保輸出的一致性和可靠性,同時高效地管理大量資料。IronPDF通過在.NET專案中將HTML轉換為可靠的PDF文件來幫助解決這個問題。

IronPDF如何促進PDF文件的建立?

IronPDF透過允許開發人員將HTML內容直接轉換為PDF文件來促進PDF文件的建立,這些文件可以嵌入到.NET應用中,而不需要外部服務。

IronPDF可以不用依賴外部服務使用嗎?

是的,IronPDF可以不用依賴外部服務。它無縫整合到.NET專案中,使得開發者能夠直接在其應用程式中生成PDF文件。

使用IronPDF生成對帳單的優勢是什麼?

使用IronPDF生成對帳單的優勢包括能夠將HTML內容生成可靠且高品質的PDF文件,易於整合到.NET專案中,並且不需要依賴外部PDF生成服務。

IronPDF 是否適合大規模 PDF 生成?

是的,IronPDF非常適合大規模生成PDF。它有效处理大量HTML資料的轉換,生成一致且可靠的PDF文件,理想用於每月帳戶對帳單的生成等應用。

IronPDF相容於哪種編程語言?

IronPDF與C#相容,並可順利整合到.NET專案中,這使得它成為在Microsoft技術堆疊上工作的開發人員的理想選擇。

IronPDF是否支援HTML到PDF的轉換?

是的,IronPDF支援HTML到PDF的轉換,使開發人員能夠輕鬆地將HTML內容轉換為專業外觀的PDF文件。

IronPDF如何處理PDF文件的版面和設計?

IronPDF透過準確渲染HTML和CSS來處理PDF文件的版面和設計,確保生成的PDF的視覺呈現符合預期的設計。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話