HTML 到 PDF:C# .NET 快速教程

如何在 C# 中將 HTML 轉換為 PDF(開發者指南)

This article was translated from English: Does it need improvement?
Translated
View the article in English

在 C# 中將 HTML 轉換為 PDF 通常看起來很簡單,直到實際需求出現。 開發人員很快就會遇到影響渲染精度、部署和可擴展性的限制。

常見挑戰包括:

❌ PDF 輸出中 HTML5 / CSS3 佈局損壞

❌ JavaScript 過多導致頁面渲染空白

❌ PDF 檔案與 Chrome 瀏覽器預覽不符

❌ 過時的基於 WebKit 的渲染引擎

❌ 登入會話、cookie 和標頭失敗

❌ 僅限 Windows 的依賴項會阻止 Linux/Docker 運行

❌ 大型文件渲染時記憶體佔用過高

❌ 對加密、簽章或 PDF/A 的支援有限

除了渲染之外,基礎設施相容性也至關重要。 團隊必須確保 PDF 生成功能能夠在現代 .NET 運行時、雲端平台和容器化環境中正常運行,且不會影響效能。

為了彌補這些差距,現代基於 Chrome 的解決方案(如 IronPDF)提供了更高的渲染保真度、更廣泛的平台支援和可用於生產的部署工作流程——本指南的其餘部分將逐步探討這些內容。

TL;DR:HTML 轉 PDF 快速入門指南

您可以使用IronPDF庫輕鬆地在 C# 中將 HTML 轉換為 PDF,該庫提供了ChromePdfRenderer.RenderHtmlAsPdf方法,可以從 HTML、CSS 和 JavaScript 創建高品質的 PDF 文件。

Nuget Icon立即開始使用 NuGet 建立 PDF 檔案:

  1. 使用 NuGet 套件管理器安裝 IronPDF

    PM > Install-Package IronPdf

  2. 複製並運行這段程式碼。

    IronPdf.ChromePdfRenderer
           .StaticRenderHtmlAsPdf("<p>Hello World</p>")
           .SaveAs("pixelperfect.pdf");
  3. 部署到您的生產環境進行測試

    立即開始在您的專案中使用 IronPDF,免費試用!
    arrow pointer

購買或註冊 IronPDF 30 天試用版後,請尋找寄送至您信箱的許可證金鑰。 請在申請開始時新增您的許可證密鑰。

IronPdf.License.LicenseKey = "KEY";
IronPdf.License.LicenseKey = "KEY";
$vbLabelText   $csharpLabel

為什麼 .NET 開發人員需要 C# 的 HTML 轉 PDF 轉換器

.NET 框架缺乏內建的 HTML 轉 PDF 功能。 IronPDF 利用嵌入式 Google Chromium 渲染引擎來確保高保真轉換,準確地保留您的網頁內容的佈局和樣式。

強大的 Chrome 渲染引擎: Chrome 的 Blink 引擎可實現精確的 HTML 到 PDF 轉換,現在已針對內存、表單和渲染精度進行了修復 (v2025.9.4)

像素級精準度:產生的 PDF 檔案與網頁上的版本完全一致,而非列印友善版本。 最近的修復包括自訂頁首/頁腳裁剪、灰階文字保留以及元資料中的特殊字元/表情符號(截至 v2025.9.4)

全面支援現代 Web:全面支援 CSS3、HTML5 和 JavaScript,適用於所有 HTML 元素。 最近的改進改變了長文字區域和複選框的表單欄位處理方式。

效能提升 5-20 倍:比瀏覽器自動化或 Web 驅動程式快得多,現在修復了記憶體洩漏問題,並減少了批次操作中重複元素(如印章/標題)的檔案大小。

PDF/UA 合規性:產生符合第 508 節標準的無障礙 PDF,並針對跨平台(例如 Linux)表單渲染進行了增強。

無外部依賴:無需在伺服器上安裝任何可執行文件

✅ 專為運行在 .NET 10、9、8、7、6(Core、Standard 或 Framework)上的 C#、F# 和 VB.NET 而設計

IronPDF 簡化了 .NET 開發人員的工作流程,提供了一個簡單且有效率的解決方案,可以從 Web 應用程式的 HTML 產生外觀專業的 PDF 文件。 從發票和報表到憑證和檔案,開發人員可以使用他們熟悉的 Web 技術堆疊,而 IronPDF 只需幾行程式碼即可處理複雜的操作。

RELATED: IronPDF Changelog: Updates, milestones, roadmap

你將學到什麼

1.如何使用 C# 將 HTML 轉換為 PDF

- [如何將 HTML 字串轉換為 PDF](#how-to-convert-html-string-to-pdf)
- [如何將現有 URL 匯出至 PDF](#how-to-export-existing-url-to-pdf)
- [如何將 HTML 檔案轉換為 PDF](#如何將 HTML 檔案轉換為 PDF)

2.如何配置 HTML 轉 PDF 設定 3.如何使用進階 PDF 產生和安全功能

- [ 如何為批量 PDF 創建生成 HTML 模板](#how-to-generate-html-template-for-batch-pdf-creation)。
- [如何使用 Async 方法生成 PDF](#how-to-generate-pdf-using-async-method)
- [如何新增進階安全功能](#如何新增進階安全功能)。

4.將 IronPDF 與其他 .NET PDF 庫進行比較

5.故障排除和技術支持

1. 如何使用 C# 將 HTML 轉換為 PDF

無論您是處理 HTML 字串、URL 還是 HTML 文件,IronPDF 都提供靈活的選項來產生符合您特定要求的高品質 PDF 文件。

在本教程中,我們將帶您了解最常見的場景,包括 HTML 字串轉 PDF、URL 轉 PDF 和 HTML 檔案轉 PDF。 此外,IronPDF 還提供了多種用於操作 PDF 文件的功能:

多功能 PDF 轉換 動態網頁轉 PDF

如何將 HTML 字串轉換為 PDF

最基本的操作是將 HTML 字串轉換為 PDF。 這種方法非常適合動態產生的HTML內容。 當您直接將 HTML 轉換為 PDF 時,RenderHtmlAsPdf 方法完全支援 HTML5、CSS3、JavaScript 及圖片。

使用 IronPdf;

// Create the Chrome renderer
var renderer = new ChromePdfRenderer();

// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");

// Save the PDF
pdf.SaveAs("output.pdf");
使用 IronPdf;

// Create the Chrome renderer
var renderer = new ChromePdfRenderer();

// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");

// Save the PDF
pdf.SaveAs("output.pdf");
$vbLabelText   $csharpLabel

提示(已更新至 v2025.9.4) 最近的更新修復了 HTML 元資料中特殊字元/表情符號的問題,並確保更好地處理 html 表單字段,包括 Linux 上的中文字元。 使用以下方式測試動態內容請將 EnableJavaScript 設為 true 以獲得最佳效果。

當您的 HTML 字串引用圖片或樣式表等本機資產時,請使用 BaseUrlPath 參數,以正確轉換包含所有資源的 HTML 內容:

使用 IronPdf;

var renderer = new ChromePdfRenderer();

// Convert HTML content with local image and CSS references
string html = @"
    <link rel='stylesheet' href='styles.css'>
    <img src='logo.png' alt='Company Logo'>
    <h1>Company Report</h1>
    <p>Annual report content...</p>";

// Set base path for resolving relative URLs in HTML to PDF conversion
var pdf = renderer.RenderHtmlAsPdf(html, @"C:\MyProject\Assets\");
pdf.SaveAs("report.pdf");
使用 IronPdf;

var renderer = new ChromePdfRenderer();

// Convert HTML content with local image and CSS references
string html = @"
    <link rel='stylesheet' href='styles.css'>
    <img src='logo.png' alt='Company Logo'>
    <h1>Company Report</h1>
    <p>Annual report content...</p>";

// Set base path for resolving relative URLs in HTML to PDF conversion
var pdf = renderer.RenderHtmlAsPdf(html, @"C:\MyProject\Assets\");
pdf.SaveAs("report.pdf");
$vbLabelText   $csharpLabel

[{t:(BaseUrlPath 告訴 IronPDF 在哪裡可以找到你的 CSS、JavaScript 和圖片檔案。 HTML 字串中的所有相對路徑都將從此目錄解析。

相關操作文章: How to Convert HTML String to PDF in C#

如何將現有 URL 匯出為 PDF

使用 C# 將整個網頁渲染成 PDF 可以讓團隊將 PDF 設計和後端渲染工作分開。 此方法可讓您將任何指定的 URL 直接轉換為 PDF 格式。

列印與螢幕 CSS

您可以配置 IronPDF 使用 CSS 媒體類型進行渲染。

使用 IronPdf;
using IronPdf.Rendering;

// Initialize HTML to PDF converter
var renderer = new ChromePdfRenderer();

// Configure CSS media type for rendering specified URLs
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Screen media type shows the entire web page as displayed on screen
使用 IronPdf;
using IronPdf.Rendering;

// Initialize HTML to PDF converter
var renderer = new ChromePdfRenderer();

// Configure CSS media type for rendering specified URLs
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Screen media type shows the entire web page as displayed on screen
$vbLabelText   $csharpLabel

JavaScript 支援

IronPDF 將 HTML 轉換為 PDF 時,完全支援 JavaScript、jQuery 甚至 AJAX。 對於動態 HTML 內容,您可以設定 IronPDF 等待 JavaScript 執行完畢後再將網頁渲染成 PDF。 這非常適合單頁應用程式和動態網站。

使用 IronPdf;

// Configure JavaScript rendering for dynamic HTML content to PDF
var renderer = new ChromePdfRenderer();

// Enable JavaScript execution during PDF generation
renderer.RenderingOptions.EnableJavaScript = true;

// WaitFor.RenderDelay pauses before capturing the HTML
renderer.RenderingOptions.WaitFor.RenderDelay = 500; // milliseconds
使用 IronPdf;

// Configure JavaScript rendering for dynamic HTML content to PDF
var renderer = new ChromePdfRenderer();

// Enable JavaScript execution during PDF generation
renderer.RenderingOptions.EnableJavaScript = true;

// WaitFor.RenderDelay pauses before capturing the HTML
renderer.RenderingOptions.WaitFor.RenderDelay = 500; // milliseconds
$vbLabelText   $csharpLabel

當網頁上的進階 d3.js 和弦圖渲染成 PDF 格式時,也可以顯示 JavaScript 執行情況:

使用 IronPdf;

// Create renderer for JavaScript-heavy HTML
var renderer = new ChromePdfRenderer();

// Convert d3.js visualization web page to PDF
var pdf = renderer.RenderUrlAsPdf("https://bl.ocks.org/mbostock/4062006");

// Save the interactive chart as static PDF
pdf.SaveAs("chart.pdf");
使用 IronPdf;

// Create renderer for JavaScript-heavy HTML
var renderer = new ChromePdfRenderer();

// Convert d3.js visualization web page to PDF
var pdf = renderer.RenderUrlAsPdf("https://bl.ocks.org/mbostock/4062006");

// Save the interactive chart as static PDF
pdf.SaveAs("chart.pdf");
$vbLabelText   $csharpLabel

響應式 CSS

由於響應式網頁旨在瀏覽器中查看,而 IronPDF 不會在伺服器作業系統中開啟真正的瀏覽器窗口,因此響應式 HTML 元素可能會以最小尺寸呈現。建議在渲染整個網頁時使用PdfCssMediaType.Print來解決此問題。

// Configure for optimal responsive design handling in HTML to PDF

renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
// Configure for optimal responsive design handling in HTML to PDF

renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
$vbLabelText   $csharpLabel

相關操作文章: How to Render URL to PDF

如何將HTML檔案轉換為PDF

將本機 HTML 檔案轉換為 PDF 時,會保留所有相關資源,包括 CSS、圖片和 JavaScript,就像使用 file:// 協定開啟一樣。 這種 HTML 轉 PDF 方法最適合將範本或預先設計的 HTML 頁面轉換為 PDF 文件。

使用 IronPdf;

// Initialize ChromePdfRenderer for HTML file conversion
var renderer = new ChromePdfRenderer();

// Convert HTML file to PDF documents
// Preserves all relative paths and linked resources in HTML
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");

// Save the HTML file as PDF 
pdf.SaveAs("Invoice.pdf");

// All CSS, JavaScript, and images load correctly in the generated PDF
使用 IronPdf;

// Initialize ChromePdfRenderer for HTML file conversion
var renderer = new ChromePdfRenderer();

// Convert HTML file to PDF documents
// Preserves all relative paths and linked resources in HTML
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");

// Save the HTML file as PDF 
pdf.SaveAs("Invoice.pdf");

// All CSS, JavaScript, and images load correctly in the generated PDF
$vbLabelText   $csharpLabel

將 HTML 檔案及其資源(CSS、圖像)放在單獨的資料夾中,以便在將 HTML 檔案轉換為 PDF 之前在瀏覽器中進行編輯和測試。 這樣可以確保您的 HTML 程式碼完美渲染,從而產生高品質的 PDF 文件。

相關操作文章: Render HTML File to PDF

2. 如何配置 HTML 轉 PDF 設定

在處理 PDF 文件方面,IronPDF 透過ChromePdfRenderer.RenderingOptions屬性為渲染的 PDF 提供了廣泛的自訂選項。

設定 描述 範例
紙張大小 設定現有PDF文件的頁面尺寸(A4、Letter、Legal等) `PdfPaperSize.A4`
紙張方向 將現有 PDF 設定為縱向或橫向。 `PdfPaperOrientation.Landscape`
上邊距/下邊距/左邊距/右邊距 設定頁面邊距,單位為毫米(預設值:25毫米)
Css媒體類型 用於 HTML 轉 PDF 的螢幕或列印 CSS `PdfCssMediaType.Print`
PrintHtml背景 包含背景顏色/圖像(預設值:true) 真實
啟用 JavaScript 在渲染 HTML 內容之前執行 JavaScript 程式碼 真實
等待渲染延遲 動態 HTML 內容等待時間(毫秒) 500

請參閱以下程式碼片段,以了解操作 PDF 文件的完整設定範例:

使用 IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

// Apply print-specific CSS rules
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Set custom margins in millimeters
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;

// Enable background colors and images
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;

// Generate PDFs with all settings applied to HTML content
var htmlContent = "<div style='background-color: #f0f0f0; padding: 20px;'><h1>Styled Content</h1></div>";
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
pdfDocument.SaveAs("styled-output.pdf");
使用 IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

// Apply print-specific CSS rules
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Set custom margins in millimeters
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;

// Enable background colors and images
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;

// Generate PDFs with all settings applied to HTML content
var htmlContent = "<div style='background-color: #f0f0f0; padding: 20px;'><h1>Styled Content</h1></div>";
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
pdfDocument.SaveAs("styled-output.pdf");
$vbLabelText   $csharpLabel

[{t:(使用 PdfCssMediaType 可以在渲染的 PDF 檔案格式中獲得更清晰、更適合列印的佈局。 使用 Screen 來精確地搭配使用者在瀏覽器中看到的內容。

相關操作指南文章:

客製化 PDF 轉換 精緻 PDF 佈局

3. 如何使用進階 PDF 產生和安全功能

利用進階模板、非同步操作和安全功能,解鎖企業級 HTML 轉 PDF 轉換功能。 這些 PDF 處理方法可讓您大規模建立 PDF 文檔,保護敏感的 PDF 文件,並在將 HTML 轉換為專業 PDF 格式時確保文檔的真實性。

如何產生用於批次建立 PDF 的 HTML 模板

基本的批次PDF創建

大量建立 PDF 對於高效產生多個個人化 PDF 文件至關重要。 對於基本情境,C# 中的 String.Format 方法最適用於簡單的 PDF 操作。

// Simple HTML templating with String.Format
string htmlTemplate = String.Format("<h1>Hello {0}!</h1>", "World");

// Results in HTML content: <h1>Hello World!</h1>
// Simple HTML templating with String.Format
string htmlTemplate = String.Format("<h1>Hello {0}!</h1>", "World");

// Results in HTML content: <h1>Hello World!</h1>
$vbLabelText   $csharpLabel

對於需要產生 PDF 文件的較長模板,請在 HTML 內容中使用佔位符替換: 使用 IronPdf;

// Define reusable HTML template for PDF files
var htmlTemplate = "<p>Dear [[NAME]],</p><p>Thank you for your order.</p>";

// Customer names for batch PDF conversion processing
var names = new[] { "John", "James", "Jenny" };

// Create personalized PDF documents for each customer
var renderer = new ChromePdfRenderer();

foreach (var name in names)
{
    // Replace placeholder with actual data in HTML string
    var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);

    // Generate personalized PDF document from HTML content
    var pdf = renderer.RenderHtmlAsPdf(htmlInstance);

    // Save with customer-specific filename as PDF files
    pdf.SaveAs($"{name}-invoice.pdf");
}
// Define reusable HTML template for PDF files
var htmlTemplate = "<p>Dear [[NAME]],</p><p>Thank you for your order.</p>";

// Customer names for batch PDF conversion processing
var names = new[] { "John", "James", "Jenny" };

// Create personalized PDF documents for each customer
var renderer = new ChromePdfRenderer();

foreach (var name in names)
{
    // Replace placeholder with actual data in HTML string
    var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);

    // Generate personalized PDF document from HTML content
    var pdf = renderer.RenderHtmlAsPdf(htmlInstance);

    // Save with customer-specific filename as PDF files
    pdf.SaveAs($"{name}-invoice.pdf");
}
$vbLabelText   $csharpLabel

使用 Handlebars.NET 實作 HTML 到 PDF 的模板化

對於將 HTML 轉換為 PDF 時包含循環和條件語句的複雜模板,請使用Handlebars.NET的高級模板功能來產生具有動態 HTML 內容的 PDF 文件。

# First, install Handlebars.NET for HTML to PDF templating
PM > Install-Package Handlebars.NET
# First, install Handlebars.NET for HTML to PDF templating
PM > Install-Package Handlebars.NET
SHELL
using HandlebarsDotNet;
使用 IronPdf;

// Define Handlebars template with placeholders for HTML content
var source = 
    @"<div class=""entry"">
        <h1>{{title}}</h1>
        <div class=""body"">
            {{body}}
        </div>
    </div>";

// Compile template for reuse in PDF conversion
var template = Handlebars.Compile(source);

// Create data object (can be database records) for HTML to PDF directly
var data = new { 
    title = "Monthly Report", 
    body = "Sales increased by 15% this month." 
};

// Merge template with data to create HTML content
var htmlResult = template(data);

// Convert templated HTML to PDF using the PDF converter
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlResult);

pdf.SaveAs("monthly-report.pdf");
using HandlebarsDotNet;
使用 IronPdf;

// Define Handlebars template with placeholders for HTML content
var source = 
    @"<div class=""entry"">
        <h1>{{title}}</h1>
        <div class=""body"">
            {{body}}
        </div>
    </div>";

// Compile template for reuse in PDF conversion
var template = Handlebars.Compile(source);

// Create data object (can be database records) for HTML to PDF directly
var data = new { 
    title = "Monthly Report", 
    body = "Sales increased by 15% this month." 
};

// Merge template with data to create HTML content
var htmlResult = template(data);

// Convert templated HTML to PDF using the PDF converter
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlResult);

pdf.SaveAs("monthly-report.pdf");
$vbLabelText   $csharpLabel

相關操作文章: Learn more about Handlebars.NET on GitHub

控制PDF分頁符號:

在轉換 HTML 程式碼片段時,管理產生的 PDF 文件中的分頁可確保獲得專業且易於閱讀的版面配置。使用 CSS 控制 PDF 檔案中的頁面分隔位置。
<!DOCTYPE html>
<html>
  <head>
    <style type="text/css" media="print">
      .page {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>Page 1 Content</h1>
    </div>
    <div class="page">
      <h1>Page 2 Content</h1>
    </div>
    <div class="page">
      <h1>Page 3 Content</h1>
    </div>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <style type="text/css" media="print">
      .page {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>Page 1 Content</h1>
    </div>
    <div class="page">
      <h1>Page 2 Content</h1>
    </div>
    <div class="page">
      <h1>Page 3 Content</h1>
    </div>
  </body>
</html>
HTML

如何使用非同步方法產生 PDF

IronPDF 提供企業級效能,全面支援非同步和多線程,滿足您大規模產生 PDF 檔案時對 HTML 到 PDF 轉換的需求。

使用 IronPdf;
using System.Threading.Tasks;

// Async method for non-blocking PDF generation from HTML content
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();

    // Async HTML to PDF conversion preserves thread pool
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);

    // Return PDF files as byte array for web responses
    return pdf.BinaryData;
}

// Concurrent batch PDF generation for multiple HTML strings
public async Task GenerateMultiplePdfsAsync(List<string> htmlTemplates)
{
    var renderer = new ChromePdfRenderer();

    // Create parallel conversion tasks to generate PDF documents
    var tasks = htmlTemplates.Select(html => 
        renderer.RenderHtmlAsPdfAsync(html)
    );

    // Await all PDF conversions simultaneously
    var pdfs = await Task.WhenAll(tasks);

    // Save generated PDF files from HTML content
    for (int i = 0; i < pdfs.Length; i++)
    {
        pdfs[i].SaveAs($"document-{i}.pdf");
    }
}
使用 IronPdf;
using System.Threading.Tasks;

// Async method for non-blocking PDF generation from HTML content
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();

    // Async HTML to PDF conversion preserves thread pool
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);

    // Return PDF files as byte array for web responses
    return pdf.BinaryData;
}

// Concurrent batch PDF generation for multiple HTML strings
public async Task GenerateMultiplePdfsAsync(List<string> htmlTemplates)
{
    var renderer = new ChromePdfRenderer();

    // Create parallel conversion tasks to generate PDF documents
    var tasks = htmlTemplates.Select(html => 
        renderer.RenderHtmlAsPdfAsync(html)
    );

    // Await all PDF conversions simultaneously
    var pdfs = await Task.WhenAll(tasks);

    // Save generated PDF files from HTML content
    for (int i = 0; i < pdfs.Length; i++)
    {
        pdfs[i].SaveAs($"document-{i}.pdf");
    }
}
$vbLabelText   $csharpLabel

[{t:(HTML 轉 PDF 效能最佳化技巧