跳至頁尾內容
產品對比

IronPDF 與 PDFTron (Apryse):2025 年完整的 C# PDF 庫對比

正在為您的 .NET 專案尋找合適的 PDF 程式庫? 這篇對 IronPDF 和 PDFTron(現為 Apryse)的全面比較分析了功能、定價、性能和開發者體驗,以幫助您做出明智的決定。 無論您是建立 Web 應用程式、桌面軟體或雲端服務,選擇合適的 PDF 工具包都會對您的開發速度和專案成功產生重大影響。

快速比較摘要

類別 特徵/方面 IronPDF PDFTron(Apryse) 主要優勢
核心架構 設計理念 簡約至上,鍍鉻V8發動機 企業的客製化引擎 IronPDF:更快的開發速度
API複雜度 RenderHtmlAsPdf()這樣的簡單方法 IronPDF:代碼量減少 70%。
學習曲線 通常需要1-2天。 通常需要 1-2 週。 IronPDF:更快的採用
平台支援 跨平台 原生支持,單包 需要多個軟體包/模組 IronPDF:更簡單的部署
.NET 版本 .NET 10、9、8、7、6、5,Core 3.1+,Framework 4.6.2+ 提供類似支持,但需額外設置 兩者:現代框架支持
HTML 轉 PDF 渲染引擎 全鍍鉻V8發動機 自訂引擎(透過 HTML2PDF 模組) IronPDF:瀏覽器保真度超過 98%
JavaScript 支援 完全支援渲染延遲 支持有限 IronPDF:動態內容準備就緒
微軟辦公室軟體支持 DOCX 轉 PDF 內建DocxToPdfRenderer PDFTron:更佳的辦公室保真度
CAD支援 無法使用 DWG、DXF、DGN 轉 PDF PDFTron:CAD 工作流程
表現 HTML渲染速度 典型值 0.8-1.2 秒(Chrome 引擎) 0.3-0.5秒(典型值,簡單HTML) PDFTron:更快的基本 HTML
記憶體使用情況 150-200MB(Chrome進程) 典型值 80-120MB PDFTron:更低的記憶體佔用
Licensing & Pricing 入門級 Lite: $799 (1 dev, 1 project) 客製報價(預估 5,000 美元至 10,000 美元以上) IronPDF:透明定價
企業 Professional: $2,399 (10 devs) 客製報價(預估3萬美元以上) IronPDF:節省高達 90% 的成本
支援 包含支持 是的,我們提供 24/5 全天候工程支援。 因許可證級別而異 IronPDF:包含支持
最適合 用例 現代 Web 應用、HTML 報表、快速開發 文件密集型工作流程,CAD/Office轉換 上下文相關

IronPDF 和 PDFTron (Apryse) 是什麼?

IronPDF概述

IronPDF 是一個全面的 .NET PDF 程式庫,可簡化開發人員建立、編輯和操作 PDF 的過程。 它基於 Chrome 渲染引擎構建,擅長將 HTML、CSS 和 JavaScript 轉換為像素級完美的 PDF 文件。 該程式庫的 API 設計簡潔明了,開發者只需編寫少量程式碼即可整合 PDF 功能,使其成為 Web 應用程式、報表系統和文件自動化的理想選擇。

PDFTron(Apryse)概述

PDFTron 於 2023 年 2 月更名為 Apryse,是一款針對企業的 PDF SDK,提供廣泛的文件處理功能。 該軟體最初是為複雜的文件工作流程而開發的,它對各種文件格式提供強大的支持,包括 Microsoft Office、CAD 圖紙和專用文件類型。文件處理技術領域的全球領導者 PDFTron Systems Inc. 宣布更名為 Apryse; 匯集了包括 iText、Windward、Eversign 等在內的 13 家公司。

如何建立用於產生 PDF 的 ASP.NET 專案?

無論選擇哪個程式庫,設定用於產生 PDF 的 ASP.NET 專案都需要正確的配置。 請依照下列步驟建立 IronPDF 或 PDFTron 整合的基礎:

  1. 開啟 Visual Studio 2022 或更高版本
  2. 點選"建立新項目"
  3. 選擇"ASP.NET Core Web 應用程式"(建議使用 .NET 6.0 或更高版本)
  4. 選擇項目名稱和地點
  5. 根據您的需求選擇"Web 應用程式(模型-視圖-控制器)"或"Web API"。
  6. 為獲得最佳相容性,請確保選擇".NET 8.0"或更高版本。

Visual Studio 新專案對話方塊顯示 ASP.NET Core Web 應用程式選擇 Visual Studio 的"新專案"對話方塊顯示了用於整合 PDF 庫的 ASP.NET 專案模板

對於 Web 表單應用程式:

  • 選擇"ASP.NET Web 應用程式 (.NET Framework)"
  • 從範本選項中選擇"Web 表單" 點擊"建立"以產生專案結構

在 Visual Studio 專案建立精靈中選擇 Web 表單模板 為具有 PDF 功能的傳統 ASP.NET 應用程式選擇 Web 表單模板

如何在我的 C# 專案中安裝 IronPDF?

IronPDF 提供多種安裝方法,以適應不同的開發工作流程。 在 Visual Studio 中,以滑鼠右鍵按一下解決方案資源管理器中的項目,然後選擇"管理 NuGet 套件..."。 然後,只需搜尋 IronPDF 並安裝最新版本即可。

方法一:使用 Visual Studio 套件管理器

最直接的方法是使用 Visual Studio 內建的 NuGet 套件管理器:

  1. 在解決方案資源管理器中以滑鼠右鍵按一下您的專案。
  2. 選擇"管理 NuGet 套件"
  3. 點選"瀏覽"並搜尋"IronPDF"。
  4. 點選 IronPDF 軟體包上的"安裝"按鈕

解決方案資源管理器上下文功能表顯示"管理 NuGet 套件"選項 透過 Visual Studio 的解決方案資源管理器存取 NuGet 套件管理器以安裝 IronPDF

Visual Studio 中的專案選單顯示套件管理選項 另一種透過 Visual Studio 的"專案"功能表存取 NuGet 套件管理器的方法

NuGet 套件管理器介面顯示 IronPDF 安裝 透過 NuGet 套件管理器安裝 IronPDF,並顯示版本資訊和相依性

方法二:使用套件管理器控制台

對於喜歡使用命令列工具的開發人員:

# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf

# For specific version installation
Install-Package IronPdf -Version 2025.7.0
# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf

# For specific version installation
Install-Package IronPdf -Version 2025.7.0
SHELL

方法三:直接下載安裝

對於沒有 NuGet 存取權限的環境:

  1. IronPDF 官方網站下載
  2. 將 ZIP 檔案解壓縮到您的專案目錄
  3. 在 Visual Studio 中,以滑鼠右鍵按一下"引用"→"新增引用"。
  4. 瀏覽並選擇IronPdf.dll

方法四:使用 .NET CLI

面向命令列愛好者和 CI/CD 流水線:

# Navigate to your project directory
cd MyProject

# Install IronPDF
dotnet add package IronPdf

# Restore packages
dotnet restore
# Navigate to your project directory
cd MyProject

# Install IronPDF
dotnet add package IronPdf

# Restore packages
dotnet restore
SHELL

如何安裝 PDFTron (Apryse) SDK?

由於 PDFTron 採用模組化架構並面向企業用戶,因此其安裝步驟較多。 具體流程會根據目標平台和所需功能而有所不同。

先決條件

  • Visual Studio 2019 或更高版本
  • .NET桌面開發工作負載
  • .NET Framework 4.5.1+ 開發工具
  • PDFTron SDK 下載

手動整合步驟

1.提取 SDK

   # Example extraction path
   PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
   # Example extraction path
   PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
SHELL

2.使用許可證金鑰初始化

   // Initialize PDFTron with your license key
   pdftron.PDFNet.Initialize("your-license-key-here");

   // Note: Demo keys expire after evaluation period
   // Contact Apryse sales for production licenses
   // Initialize PDFTron with your license key
   pdftron.PDFNet.Initialize("your-license-key-here");

   // Note: Demo keys expire after evaluation period
   // Contact Apryse sales for production licenses
$vbLabelText   $csharpLabel

3.複製所需庫

  • PDFNET_BASE中的Lib資料夾複製到您的專案目錄中
  • 新增對PDFNetLoader.dll和平台特定的PDFNet.dll引用

4.配置複製本地屬性

在 Visual Studio 中將 PDFTron Copy Local 屬性設定為 False 將 PDFNet.dll 的"複製本機"屬性設為 False 以便正確部署 PDFTron

5.更新 App.config 文件

   <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
   </configuration>
   <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
   </configuration>
XML

6.配置建置後事件

   xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
   xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
SHELL

NuGet 安裝(簡化版)

為了簡化流程:

  1. 開啟 NuGet 套件管理器
  2. 搜尋"PDFTron.NET.x64"或特定平台的軟體包
  3. 安裝適合您架構的軟體包

PDFTron NuGet 套件安裝介面 透過 NuGet 套件管理器安裝 PDFTron 及特定於平台的套件

PDFTron 提供超過 30 種註解類型,比 ComPDFKit 的 10 多種註解類型更豐富。然而,如此強大的功能集要求在安裝過程中仔細選擇模組。

如何使用這些函式庫將 URL 轉換為 PDF?

這兩個函式庫都提供 URL 轉 PDF 的功能,但方法和功能有所不同。 讓我們來仔細研究一下每種方法的實作細節和效能特性。

使用 IronPDF 匯出 PDF 的 URL

IronPDF 的 Chrome 渲染引擎為現代 Web 標準提供了卓越的支援:

using IronPdf;

// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();

// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution

// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
    Username = "user@domain.com",
    Password = "secure_password"
};

// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");

// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
using IronPdf;

// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();

// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution

// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
    Username = "user@domain.com",
    Password = "secure_password"
};

// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");

// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
$vbLabelText   $csharpLabel

IronPDF 中的 Chrome 渲染器可以處理包含以下的複雜場景:

  • 包含大量 JavaScript 的單頁應用程式 (SPA)。
  • 具有媒體查詢的響應式設計
  • 網頁字體與外在樣式表
  • AJAX 內容載入 CSS動畫與過渡

IronPDF 主分支現在支援所有這些: nuget.org/packages/IronPdf 。 近期效能的提升顯著提高了渲染速度,尤其對於複雜的 Web 應用程式而言更是如此。

使用 PDFTron (Apryse) 將 URL 轉換為 PDF

PDFTron 需要 HTML2PDF 模組來進行網頁內容轉換:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

class UrlToPdfConverter 
{
    public static void ConvertUrlToPdf(string url, string outputPath)
    {
        // Initialize PDFTron with license
        PDFNet.Initialize("your-license-key");

        // Create a new PDF document
        using (PDFDoc doc = new PDFDoc())
        {
            // Initialize HTML2PDF converter
            HTML2PDF converter = new HTML2PDF();

            // Configure conversion settings
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);

            // Set page dimensions
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetMargins(0.5, 0.5, 0.5, 0.5);

            // Insert URL content
            converter.InsertFromURL(url);

            // Perform conversion
            if (converter.Convert(doc))
            {
                // Save the resulting PDF
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine($"Successfully converted {url} to {outputPath}");
            }
            else
            {
                Console.WriteLine("Conversion failed");
            }
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

class UrlToPdfConverter 
{
    public static void ConvertUrlToPdf(string url, string outputPath)
    {
        // Initialize PDFTron with license
        PDFNet.Initialize("your-license-key");

        // Create a new PDF document
        using (PDFDoc doc = new PDFDoc())
        {
            // Initialize HTML2PDF converter
            HTML2PDF converter = new HTML2PDF();

            // Configure conversion settings
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);

            // Set page dimensions
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetMargins(0.5, 0.5, 0.5, 0.5);

            // Insert URL content
            converter.InsertFromURL(url);

            // Perform conversion
            if (converter.Convert(doc))
            {
                // Save the resulting PDF
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine($"Successfully converted {url} to {outputPath}");
            }
            else
            {
                Console.WriteLine("Conversion failed");
            }
        }
    }
}
$vbLabelText   $csharpLabel

PDFTron HTML2PDF 的重要注意事項:

  • PDFTron 的 SDK 報價是基於技術廣度(API、功能)和分發範圍(外部用戶或內部用戶)。 與瀏覽器引擎相比,JavaScript 支援有限
  • 複雜佈局可能需要額外配置。 更適合簡單的 HTML 文件

如何從HTML字串建立PDF?

從 HTML 字串建立 PDF 對於產生動態報告、發票和文件至關重要。 這兩個庫的處理方式不同。

使用 IronPDF 將 HTML 字串轉換為 PDF

IronPDF 擅長渲染複雜的 HTML,並完全支援 CSS3 和 JavaScript:

using IronPdf;
using System.Text;

public class HtmlStringToPdfConverter
{
    public static PdfDocument GenerateInvoice(InvoiceData data)
    {
        // Build dynamic HTML with modern CSS
        var html = new StringBuilder();
        html.Append(@"
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');

                body {
                    font-family: 'Roboto', sans-serif;
                    margin: 0;
                    padding: 20px;
                    color: #333;
                }

                .invoice-header {
                    display: flex;
                    justify-content: space-between;
                    border-bottom: 2px solid #007bff;
                    padding-bottom: 20px;
                    margin-bottom: 30px;
                }

                .company-logo {
                    width: 150px;
                    height: auto;
                }

                .invoice-details {
                    text-align: right;
                }

                .invoice-number {
                    font-size: 24px;
                    font-weight: 700;
                    color: #007bff;
                }

                table {
                    width: 100%;
                    border-collapse: collapse;
                    margin-top: 20px;
                }

                th {
                    background-color: #f8f9fa;
                    padding: 12px;
                    text-align: left;
                    border-bottom: 2px solid #dee2e6;
                }

                td {
                    padding: 12px;
                    border-bottom: 1px solid #dee2e6;
                }

                .total-row {
                    font-weight: 700;
                    font-size: 18px;
                    background-color: #e9ecef;
                }

                @media print {
                    body { margin: 0; }
                    .no-print { display: none; }
                }
            </style>
        </head>
        <body>
        ");

        // Add invoice header
        html.Append($@"
            <div class='invoice-header'>
                <div>
                    <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
                    <h2>{data.CompanyName}</h2>
                    <p>{data.CompanyAddress}</p>
                </div>
                <div class='invoice-details'>
                    <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
                    <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
                    <p>Due: {data.DueDate:yyyy-MM-dd}</p>
                </div>
            </div>
        ");

        // Add line items table
        html.Append(@"
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
        ");

        foreach (var item in data.LineItems)
        {
            html.Append($@"
                <tr>
                    <td>{item.Description}</td>
                    <td>{item.Quantity}</td>
                    <td>${item.UnitPrice:F2}</td>
                    <td>${item.Total:F2}</td>
                </tr>
            ");
        }

        html.Append($@"
                </tbody>
                <tfoot>
                    <tr class='total-row'>
                        <td colspan='3'>Total</td>
                        <td>${data.Total:F2}</td>
                    </tr>
                </tfoot>
            </table>
        </body>
        </html>
        ");

        // Configure renderer for optimal output
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

        // Generate PDF with proper base path for assets
        var pdf = renderer.RenderHtmlAsPdf(html.ToString());

        // Add security if needed
        pdf.SecuritySettings.UserPassword = data.CustomerEmail;
        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        return pdf;
    }
}
using IronPdf;
using System.Text;

public class HtmlStringToPdfConverter
{
    public static PdfDocument GenerateInvoice(InvoiceData data)
    {
        // Build dynamic HTML with modern CSS
        var html = new StringBuilder();
        html.Append(@"
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');

                body {
                    font-family: 'Roboto', sans-serif;
                    margin: 0;
                    padding: 20px;
                    color: #333;
                }

                .invoice-header {
                    display: flex;
                    justify-content: space-between;
                    border-bottom: 2px solid #007bff;
                    padding-bottom: 20px;
                    margin-bottom: 30px;
                }

                .company-logo {
                    width: 150px;
                    height: auto;
                }

                .invoice-details {
                    text-align: right;
                }

                .invoice-number {
                    font-size: 24px;
                    font-weight: 700;
                    color: #007bff;
                }

                table {
                    width: 100%;
                    border-collapse: collapse;
                    margin-top: 20px;
                }

                th {
                    background-color: #f8f9fa;
                    padding: 12px;
                    text-align: left;
                    border-bottom: 2px solid #dee2e6;
                }

                td {
                    padding: 12px;
                    border-bottom: 1px solid #dee2e6;
                }

                .total-row {
                    font-weight: 700;
                    font-size: 18px;
                    background-color: #e9ecef;
                }

                @media print {
                    body { margin: 0; }
                    .no-print { display: none; }
                }
            </style>
        </head>
        <body>
        ");

        // Add invoice header
        html.Append($@"
            <div class='invoice-header'>
                <div>
                    <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
                    <h2>{data.CompanyName}</h2>
                    <p>{data.CompanyAddress}</p>
                </div>
                <div class='invoice-details'>
                    <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
                    <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
                    <p>Due: {data.DueDate:yyyy-MM-dd}</p>
                </div>
            </div>
        ");

        // Add line items table
        html.Append(@"
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
        ");

        foreach (var item in data.LineItems)
        {
            html.Append($@"
                <tr>
                    <td>{item.Description}</td>
                    <td>{item.Quantity}</td>
                    <td>${item.UnitPrice:F2}</td>
                    <td>${item.Total:F2}</td>
                </tr>
            ");
        }

        html.Append($@"
                </tbody>
                <tfoot>
                    <tr class='total-row'>
                        <td colspan='3'>Total</td>
                        <td>${data.Total:F2}</td>
                    </tr>
                </tfoot>
            </table>
        </body>
        </html>
        ");

        // Configure renderer for optimal output
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

        // Generate PDF with proper base path for assets
        var pdf = renderer.RenderHtmlAsPdf(html.ToString());

        // Add security if needed
        pdf.SecuritySettings.UserPassword = data.CustomerEmail;
        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        return pdf;
    }
}
$vbLabelText   $csharpLabel

IronPDF HTML渲染的主要優勢:

  • 完全支援 CSS3,包括 flexbox 和 grid 佈局
  • Google Fonts 和網頁字體集成 JavaScript 圖表庫(Chart.js、D3.js)渲染完美
  • 支援響應式設計,並具備視口控制功能
  • 用於自包含文件的Base64 映像嵌入

使用 PDFTron (Apryse) 將 HTML 字串轉換為 PDF

PDFTron 的 HTML 字串轉換方法:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronHtmlConverter
{
    public static void ConvertHtmlString(string htmlContent, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Create HTML2PDF converter instance
            HTML2PDF converter = new HTML2PDF();

            // Configure page settings
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetLandscape(false);
            converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);

            // Enable images and backgrounds
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);
            settings.SetJavaScriptDelay(1000); // Limited JS support

            // Insert HTML content
            converter.InsertFromHtmlString(htmlContent);

            // Convert to PDF
            if (converter.Convert(doc))
            {
                // Post-processing options
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
            }
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronHtmlConverter
{
    public static void ConvertHtmlString(string htmlContent, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Create HTML2PDF converter instance
            HTML2PDF converter = new HTML2PDF();

            // Configure page settings
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetLandscape(false);
            converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);

            // Enable images and backgrounds
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);
            settings.SetJavaScriptDelay(1000); // Limited JS support

            // Insert HTML content
            converter.InsertFromHtmlString(htmlContent);

            // Convert to PDF
            if (converter.Convert(doc))
            {
                // Post-processing options
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
            }
        }
    }
}
$vbLabelText   $csharpLabel

PDFTron HTML 的一些限制需要考慮:

  • 基本 CSS 支援(不支援進階佈局)
  • JavaScript 執行受限
  • 字體嵌入需要額外的配置
  • 更適合簡單的文件佈局

如何將ASPX頁面轉換為PDF?

將 ASPX 頁面轉換為 PDF 是 ASP.NET 應用程式的常見需求。 IronPDF 提供原生支持,而 PDFTron 則需要變通方法。

使用 IronPDF 將 ASPX 轉換為 PDF

IronPDF只需一行程式碼即可實現無縫的ASPX轉換:

using IronPdf;

public partial class InvoicePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Render the current ASPX page as PDF on page load
        if (Request.QueryString["pdf"] == "true")
        {
            // Configure PDF output options
            AspxToPdf.RenderThisPageAsPdf(
                AspxToPdf.FileBehavior.InBrowser,
                "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
        }
    }

    protected void ExportToPdfButton_Click(object sender, EventArgs e)
    {
        // Advanced configuration for ASPX to PDF
        IronPdf.AspxToPdf.RenderThisPageAsPdf(
            IronPdf.AspxToPdf.FileBehavior.Attachment,
            "Invoice.pdf",
            new ChromePdfRenderOptions()
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                CssMediaType = PdfCssMediaType.Print,
                EnableJavaScript = true,
                CreatePdfFormsFromHtml = true,
                FitToPaper = true
            });
    }
}
using IronPdf;

public partial class InvoicePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Render the current ASPX page as PDF on page load
        if (Request.QueryString["pdf"] == "true")
        {
            // Configure PDF output options
            AspxToPdf.RenderThisPageAsPdf(
                AspxToPdf.FileBehavior.InBrowser,
                "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
        }
    }

    protected void ExportToPdfButton_Click(object sender, EventArgs e)
    {
        // Advanced configuration for ASPX to PDF
        IronPdf.AspxToPdf.RenderThisPageAsPdf(
            IronPdf.AspxToPdf.FileBehavior.Attachment,
            "Invoice.pdf",
            new ChromePdfRenderOptions()
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                CssMediaType = PdfCssMediaType.Print,
                EnableJavaScript = true,
                CreatePdfFormsFromHtml = true,
                FitToPaper = true
            });
    }
}
$vbLabelText   $csharpLabel

為了更好地控制渲染過程:

// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
    // Set global defaults for all ASPX to PDF conversions
    AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
    AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
    AspxToPdf.GlobalSettings.EnableJavaScript = true;
    AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;

    // Custom headers and footers
    AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
    {
        HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
        Height = 25
    };
}
// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
    // Set global defaults for all ASPX to PDF conversions
    AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
    AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
    AspxToPdf.GlobalSettings.EnableJavaScript = true;
    AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;

    // Custom headers and footers
    AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
    {
        HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
        Height = 25
    };
}
$vbLabelText   $csharpLabel

IronPDF 的 ASPX 轉 PDF 功能保留了以下資訊:

  • ViewState和表單值
  • 會話狀態數據
  • CSS樣式和佈局
  • JavaScript渲染的內容
  • 母版頁佈局

ASPX 替代方案,使用 PDFTron

PDFTron 不提供直接的 ASPX 支持,需要採用間接方法:

// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
    // Render ASPX to string first
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    // Render the page to HTML
    this.RenderControl(hw);
    string htmlContent = sw.ToString();

    // Then use PDFTron's HTML2PDF
    PDFNet.Initialize("your-license-key");

    using (PDFDoc doc = new PDFDoc())
    {
        HTML2PDF converter = new HTML2PDF();
        converter.InsertFromHtmlString(htmlContent);
        converter.Convert(doc);

        // Send to browser
        byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(pdfBytes);
        Response.End();
    }
}
// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
    // Render ASPX to string first
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    // Render the page to HTML
    this.RenderControl(hw);
    string htmlContent = sw.ToString();

    // Then use PDFTron's HTML2PDF
    PDFNet.Initialize("your-license-key");

    using (PDFDoc doc = new PDFDoc())
    {
        HTML2PDF converter = new HTML2PDF();
        converter.InsertFromHtmlString(htmlContent);
        converter.Convert(doc);

        // Send to browser
        byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(pdfBytes);
        Response.End();
    }
}
$vbLabelText   $csharpLabel

如何將圖片轉換為PDF?

圖片轉PDF對於文件歸檔和作品集創建至關重要。 這兩個庫都以不同的方式實現了此功能。

使用 IronPDF 將影像轉換為 PDF

IronPDF 提供了一個專用的ImageToPdfConverter類,用於高效率的批次處理:

using IronPdf;
using System.IO;
using System.Linq;

public class ImagePdfGenerator
{
    public static void CreatePhotoAlbum(string imageFolder, string outputPath)
    {
        // Get all supported image files
        var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
        var imageFiles = Directory.GetFiles(imageFolder)
            .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
            .OrderBy(f => f);

        // Convert images to PDF with options
        var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);

        // Add metadata
        pdf.MetaData.Title = "Photo Album";
        pdf.MetaData.Author = "Photography Department";
        pdf.MetaData.CreationDate = DateTime.Now;

        // Apply compression for smaller file size
        pdf.CompressImages(80); // 80% quality

        // Save the PDF
        pdf.SaveAs(outputPath);
    }

    public static void CreateThumbnailCatalog(List<ProductImage> images)
    {
        var renderer = new ChromePdfRenderer();

        // Build HTML with image grid
        var html = @"
        <html>
        <head>
            <style>
                .image-grid {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 20px;
                    padding: 20px;
                }
                .image-item {
                    text-align: center;
                }
                .image-item img {
                    max-width: 100%;
                    height: 200px;
                    object-fit: cover;
                    border: 1px solid #ddd;
                }
                .image-caption {
                    margin-top: 10px;
                    font-size: 12px;
                }
            </style>
        </head>
        <body>
            <h1>Product Catalog</h1>
            <div class='image-grid'>";

        foreach (var image in images)
        {
            html += $@"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>";
        }

        html += "</div></body></html>";

        // Render with optimal settings for images
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("product-catalog.pdf");
    }
}
using IronPdf;
using System.IO;
using System.Linq;

public class ImagePdfGenerator
{
    public static void CreatePhotoAlbum(string imageFolder, string outputPath)
    {
        // Get all supported image files
        var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
        var imageFiles = Directory.GetFiles(imageFolder)
            .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
            .OrderBy(f => f);

        // Convert images to PDF with options
        var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);

        // Add metadata
        pdf.MetaData.Title = "Photo Album";
        pdf.MetaData.Author = "Photography Department";
        pdf.MetaData.CreationDate = DateTime.Now;

        // Apply compression for smaller file size
        pdf.CompressImages(80); // 80% quality

        // Save the PDF
        pdf.SaveAs(outputPath);
    }

    public static void CreateThumbnailCatalog(List<ProductImage> images)
    {
        var renderer = new ChromePdfRenderer();

        // Build HTML with image grid
        var html = @"
        <html>
        <head>
            <style>
                .image-grid {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 20px;
                    padding: 20px;
                }
                .image-item {
                    text-align: center;
                }
                .image-item img {
                    max-width: 100%;
                    height: 200px;
                    object-fit: cover;
                    border: 1px solid #ddd;
                }
                .image-caption {
                    margin-top: 10px;
                    font-size: 12px;
                }
            </style>
        </head>
        <body>
            <h1>Product Catalog</h1>
            <div class='image-grid'>";

        foreach (var image in images)
        {
            html += $@"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>";
        }

        html += "</div></body></html>";

        // Render with optimal settings for images
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("product-catalog.pdf");
    }
}
$vbLabelText   $csharpLabel

進階影像處理功能:

  • SVG 轉 PDF,保持向量質量
  • 帶記憶體優化的批次處理
  • 可自訂尺寸和定位選項
  • EXIF 資料保存

使用 PDFTron (Apryse) 將影像轉換為 PDF

PDFTron 使用其轉換 API 進行影像處理:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronImageConverter
{
    public static void ConvertImageToPdf(string imagePath, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Use Convert API for image to PDF
            pdftron.PDF.Convert.ToPdf(doc, imagePath);

            // Additional image processing
            PageIterator itr = doc.GetPageIterator();
            while (itr.HasNext())
            {
                Page page = itr.Current();

                // Adjust page size to image
                Rect crop_box = page.GetCropBox();
                page.SetMediaBox(crop_box);

                itr.Next();
            }

            // Save optimized PDF
            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }

    public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            ElementBuilder builder = new ElementBuilder();
            ElementWriter writer = new ElementWriter();

            foreach (string imagePath in imagePaths)
            {
                // Create a new page for each image
                Page page = doc.PageCreate();
                writer.Begin(page);

                // Add image to page
                Image img = Image.Create(doc, imagePath);
                Element element = builder.CreateImage(img, 0, 0, 612, 792);
                writer.WritePlacedElement(element);

                writer.End();
                doc.PagePushBack(page);
            }

            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronImageConverter
{
    public static void ConvertImageToPdf(string imagePath, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Use Convert API for image to PDF
            pdftron.PDF.Convert.ToPdf(doc, imagePath);

            // Additional image processing
            PageIterator itr = doc.GetPageIterator();
            while (itr.HasNext())
            {
                Page page = itr.Current();

                // Adjust page size to image
                Rect crop_box = page.GetCropBox();
                page.SetMediaBox(crop_box);

                itr.Next();
            }

            // Save optimized PDF
            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }

    public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            ElementBuilder builder = new ElementBuilder();
            ElementWriter writer = new ElementWriter();

            foreach (string imagePath in imagePaths)
            {
                // Create a new page for each image
                Page page = doc.PageCreate();
                writer.Begin(page);

                // Add image to page
                Image img = Image.Create(doc, imagePath);
                Element element = builder.CreateImage(img, 0, 0, 612, 792);
                writer.WritePlacedElement(element);

                writer.End();
                doc.PagePushBack(page);
            }

            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }
}
$vbLabelText   $csharpLabel

有哪些授權選項和費用?

了解許可規定對於預算編制和合規性至關重要。 這兩個圖書館的定價模式截然不同。

IronPDF 許可

IronPDF 有 3 個定價版本,從$799到$2,399 。 IronPDF也提供免費試用版。 IronPDF提供透明且公開的價格(截至2025年):

許可證等級: -精簡版授權: $799

  • 1 位開發者
  • 1 個地點
  • 1 個項目
  • 非常適合個人開發者或小型專案
  • Plus License: $1,199
    • 3 位開發者
    • 3 個地點
    • 3 個項目
    • 非常適合小型團隊

-專業授權: $2,399

  • 10 位開發者
  • 10 個地點
  • 10 個項目
  • 最適合成長型團隊

-無限制許可:客製化定價

  • 無限開發者
  • 地點不限
  • 項目數量不限

其他選項:

  • 免版稅再分發:+ $2,399 )
  • 提供 SaaS/OEM 許可 Iron Suite套裝:購買10件產品,只需支付2件產品的價格。

所有團隊許可證均不可轉讓,禁止在組織或機構/客戶關係之外共享許可證。

PDFTron(Apryse)許可

PDFTron的授權許可採報價方式,不公開定價。 基於用戶回饋和行業報告:

預計價格範圍:

  • 小型企業:年營業額 5,000 美元至 15,000 美元
  • 企業級:年收入 3 萬美元至 10 萬美元以上
  • 其他模組需要單獨的授權。

PDFTRON 的價格透明度是一個很大的缺點。 所有產品均為附加產品,需要特定的授權條款和合約。 用戶報告:

  • 我們在 PDFTRON 上投資了 6500 美元,但他們的產品根本沒有像廣告宣傳的那樣工作,讓我們血本無歸,而且還得收拾我們產品裡的爛攤子。 需要進行複雜的許可談判。 按模組定價會增加總成本 退款政策有限

主要區別:

IronPDF:永久授權,一次付款 PDFTron:通常採用訂閱或年費模式。 IronPDF:基礎許可包含所有功能

  • PDFTron:核心功能及付費插件

各種支援選項有何區別?

開發人員的支持對於專案進度至關重要。 以下是各供應商提供客戶服務的方式。

IronPDF 支持

IronPDF 的所有許可證均包含專業支援:

  • 透過電子郵件提供 24/5 全天候工程支持
  • 直接聯絡開發團隊
  • 通常反應時間:24-48 小時 -全面文檔 -活躍的社區論壇
  • 影片教學和程式碼範例

IronPDF 庫可在 Azure WebApps、Functions 和 WebJobs 中使用。 它在 Linux 和 Windows 系統下均可運行,但我建議使用 Windows 版本的 Functions 和 WebApps,因為它們經過了更充分的測試,安裝也更加簡單。

PDFTron(Apryse)支持

PDFTron提供的支援服務因許可等級而異:

PDFTron的成本很高。 對我們業務的重要性足以抵消其成本,但在將該產品與其他 PDF 網路解決方案進行比較時,這無疑是我們的一個障礙。

  • 透過論壇為基本授權提供支持
  • 提供付費支援計劃
  • 有時可能會缺乏支持,開發人員只能自己努力解決問題。 回應時間因支援等級而異

性能特點是什麼?

效能會影響使用者體驗和伺服器成本。 讓我們來看看實際的效能數據。

IronPDF 性能

最近的改進顯著提升了IronPDF的性能:

// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
    var renderer = new ChromePdfRenderer();

    // Configure for performance
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
    renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
    renderer.RenderingOptions.Timeout = 30; // 30 second timeout

    // Enable parallel processing
    var tasks = new List<Task<PdfDocument>>();
    var urls = GetUrlsToConvert();

    // Process in parallel with throttling
    using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
    {
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();

            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    return await renderer.RenderUrlAsPdfAsync(url);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }

        var results = await Task.WhenAll(tasks);

        // Merge results if needed
        var merged = PdfDocument.Merge(results);
        merged.SaveAs("batch-output.pdf");
    }
}
// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
    var renderer = new ChromePdfRenderer();

    // Configure for performance
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
    renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
    renderer.RenderingOptions.Timeout = 30; // 30 second timeout

    // Enable parallel processing
    var tasks = new List<Task<PdfDocument>>();
    var urls = GetUrlsToConvert();

    // Process in parallel with throttling
    using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
    {
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();

            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    return await renderer.RenderUrlAsPdfAsync(url);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }

        var results = await Task.WhenAll(tasks);

        // Merge results if needed
        var merged = PdfDocument.Merge(results);
        merged.SaveAs("batch-output.pdf");
    }
}
$vbLabelText   $csharpLabel

生產環境性能指標:

  • 簡單 HTML:200-400 毫秒
  • 包含 CSS/JS 的複雜 HTML:800-1200 毫秒
  • IronPDF 確實有非同步渲染方法的變體,例如這裡記錄的ironpdf.com/examples/async 。 在我的用例中,使用Parallel.ForEach是批量渲染 HTML 轉 PDF 效能最高的策略。

PDFTron(Apryse)效能

PDFTron 通常能為簡單的轉換提供更快的原始資料處理速度:

  • 基本 HTML:100-300 毫秒
  • 辦公室文檔:500-1000毫秒
  • 更低的記憶體佔用
  • 更適合處理大量簡單文檔

但是,使用者反映在複雜場景下會出現問題:

  • 漏洞時有發生。有時甚至是一些相當嚴重的漏洞,這些漏洞本應在品質保證測試中被發現。 這些問題最終可能需要一段時間才能解決。

現代 CSS 框架與 Bootstrap 支持

隨著企業應用程式越來越多地採用 Bootstrap、Tailwind 和 Foundation 等現代 CSS 框架,能否準確地將這些框架轉換為 PDF 成為 PDF 函式庫的關鍵選擇標準。

IronPDF:完全支援基於 Chromium 的框架

IronPDF 的 Chrome V8 渲染引擎全面支援所有現代 CSS 架構和 Web 標準:

  • Bootstrap 5:完全支援 Flexbox 和 CSS Grid,以及所有響應式工具
  • Bootstrap 4:完全相容於卡片組件、導航系統和表單佈局
  • Tailwind CSS:所有實用類別、響應式修飾符和 JIT 編譯模式 -基礎:完整的網格系統和組件庫支持 現代CSS3: Flexbox、CSS Grid、CSS變數、動畫、變換與過渡
  • JavaScript 框架: React、Vue、Angular 元件渲染,並支援完整的互動功能

生產環境驗證: Bootstrap 首頁官方模板的瀏覽器相容性達到 98% 以上。

程式碼範例:帶有資料表的企業儀錶板

using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container-fluid py-4'>
        <div class='d-flex justify-content-between align-items-center mb-4'>
            <h1>Sales Dashboard - Q1 2025</h1>
            <span class='badge bg-success fs-5'>+15.3% YoY</span>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Total Revenue</h6>
                        <h2 class='text-primary'>$1.2M</h2>
                        <small class='text-success'>↑ 12%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>New Customers</h6>
                        <h2 class='text-info'>1,847</h2>
                        <small class='text-success'>↑ 8%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Avg Order Value</h6>
                        <h2 class='text-warning'>$649</h2>
                        <small class='text-danger'>↓ 3%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Conversion Rate</h6>
                        <h2 class='text-success'>3.2%</h2>
                        <small class='text-success'>↑ 0.4%</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Top Products by Revenue</h5>
            </div>
            <div class='card-body p-0'>
                <table class='table table-striped table-hover mb-0'>
                    <thead class='table-light'>
                        <tr>
                            <th>Product</th>
                            <th>Category</th>
                            <th>Units Sold</th>
                            <th class='text-end'>Revenue</th>
                            <th class='text-end'>Growth</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>Professional License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>1,234</td>
                            <td class='text-end'>$369,000</td>
                            <td class='text-end'><span class='badge bg-success'>+18%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Plus License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>2,891</td>
                            <td class='text-end'>$289,000</td>
                            <td class='text-end'><span class='badge bg-success'>+15%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Support Package</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>892</td>
                            <td class='text-end'>$178,000</td>
                            <td class='text-end'><span class='badge bg-success'>+22%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Training Program</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>456</td>
                            <td class='text-end'>$91,000</td>
                            <td class='text-end'><span class='badge bg-warning'>+5%</span></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container-fluid py-4'>
        <div class='d-flex justify-content-between align-items-center mb-4'>
            <h1>Sales Dashboard - Q1 2025</h1>
            <span class='badge bg-success fs-5'>+15.3% YoY</span>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Total Revenue</h6>
                        <h2 class='text-primary'>$1.2M</h2>
                        <small class='text-success'>↑ 12%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>New Customers</h6>
                        <h2 class='text-info'>1,847</h2>
                        <small class='text-success'>↑ 8%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Avg Order Value</h6>
                        <h2 class='text-warning'>$649</h2>
                        <small class='text-danger'>↓ 3%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Conversion Rate</h6>
                        <h2 class='text-success'>3.2%</h2>
                        <small class='text-success'>↑ 0.4%</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Top Products by Revenue</h5>
            </div>
            <div class='card-body p-0'>
                <table class='table table-striped table-hover mb-0'>
                    <thead class='table-light'>
                        <tr>
                            <th>Product</th>
                            <th>Category</th>
                            <th>Units Sold</th>
                            <th class='text-end'>Revenue</th>
                            <th class='text-end'>Growth</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>Professional License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>1,234</td>
                            <td class='text-end'>$369,000</td>
                            <td class='text-end'><span class='badge bg-success'>+18%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Plus License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>2,891</td>
                            <td class='text-end'>$289,000</td>
                            <td class='text-end'><span class='badge bg-success'>+15%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Support Package</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>892</td>
                            <td class='text-end'>$178,000</td>
                            <td class='text-end'><span class='badge bg-success'>+22%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Training Program</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>456</td>
                            <td class='text-end'>$91,000</td>
                            <td class='text-end'><span class='badge bg-warning'>+5%</span></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
$vbLabelText   $csharpLabel

輸出:一個專業的企業儀錶盤,採用 Bootstrap 的 flexbox 指標卡、響應式網格佈局和样式化資料表——所有內容在 PDF 中都能完美呈現。

PDFTron(Apryse):具有框架限制的 HTML2PDF 模組

PDFTron 的 HTML 轉 PDF 功能是透過 HTML2PDF 模組實現的,該模組使用自訂渲染引擎,但對現代 CSS 框架存在一些特定的限制:

-自訂引擎:並非基於 Chromium,這意味著 CSS3 支援是選擇性的,而非全面的。

  • Flexbox 支援:部分實現,Bootstrap 4/5 Flexbox 佈局可能無法正確渲染。
  • CSS Grid:對 CSS Grid 佈局規範的支援有限
  • JavaScript 的限制:與完整的瀏覽器引擎相比,JavaScript 的執行能力有限
  • Bootstrap 3:由於採用了基於表格的佈局,通常比 Bootstrap 4/5 表現更好。 -框架測試不可或缺:複雜的 Bootstrap 元件需要進行廣泛的測試,並找出可能的解決方案。

根據開發者報告,使用 Bootstrap 的 PDFTron 使用者會遇到以下問題:

  • 基於 Flexbox 的導覽列渲染存在對齊問題
  • 需要進行 CSS 調整的卡片組和網格系統
  • PDF 輸出中未採用響應式實用程式 需要簡化 Bootstrap 元件或使用備用 CSS

企業考量:對於基於現代 Bootstrap 版本(4+)建立的應用程序,PDFTron 可能需要大量的額外開發工作來處理佈局轉換,這可能會抵消其其他效能優勢。 採用自訂引擎意味著你無法獲得與真實瀏覽器相同的渲染保真度。

有關 Bootstrap 框架的全面支援和測試指南,請參閱Bootstrap 和 Flexbox CSS 指南

我該何時選擇哪個圖書館?

做出正確的選擇取決於您的特定需求和限制條件。

選擇 IronPDF 的情況:

HTML/CSS 保真度至關重要

  • 具有複雜佈局的現代 Web 應用程式
  • 大量使用 JavaScript 的內容 需要保留的響應式設計

快速發展是首要任務

簡單的 API 可縮短開發時間 -大量程式碼範例 學習曲線極窄

預算透明度至關重要

公開定價有助於準確預算。 無任何意外費用或隱藏費用

  • 包含基礎許可中的所有功能

您需要特定功能

何時選擇 PDFTron (Apryse):

企業文件工作流程

  • 支援 XFA 的複雜表單處理
  • CAD 檔案轉換(DWG、DXF)
  • 高階辦公室文件處理

性能優於功能

  • 大批量簡單文件處理
  • 更低的記憶體需求
  • 基本 HTML 轉換需求

特殊要求

  • 內建文件檢視器組件
  • 豐富的註釋類型(30+)
  • 遺留系統集成

大型企業環境

  • 專屬支援合約
  • 客製化功能開發
  • 合規認證

總結與結論

IronPDF 和 PDFTron (Apryse) 都是功能強大的 PDF 庫,但它們服務於不同的市場領域和使用情境。

IronPDF 的優勢在於:

  • 支援現代網路技術(HTML5、CSS3、JavaScript)
  • 對開發者友善的 API 設計 價格透明、實惠。 快速應用開發
  • 雲端和容器化部署

PDFTron(Apryse)的優點包括: 企業文件工作流程

  • CAD 和專用格式支持
  • 降低資源消耗
  • 強大的註釋功能
  • 舊系統相容性

對於大多數建立現代應用程式的 .NET 開發人員來說,IronPDF 提供了功能、易用性和價值的最佳組合。 其基於 Chrome 的渲染引擎可確保將 HTML 完美轉換為 PDF,而簡單易用的 API 則可加快開發速度。

PDFTron 仍然適用於對 CAD 轉換、複雜表單處理或處理舊版文件格式有特定要求的企業。 然而,缺乏定價透明度和模組化授權結構可能會顯著增加總成本。

入門

試試 IronPDF: 下載免費試用版 查看文件 -瀏覽程式碼範例

探索 PDFTron: -請求評估

在做出決定之前,請務必根據您的特定使用情況對兩種方案進行全面評估。 除了技術能力之外,還要考慮長期成本、支援品質和功能路線圖等因素。

!{--01001100010010010100001001010010010000010101001001011001010 111110100011101000101010101010001011111010100110101010001000001 010100100101010001000101010001000101111101010111010010010101010 001001000010111110101000001010101000010010000101111101010000010 1001001001111010001000101010101000011010101010001011111010101000101001001001001010101010001010010010010010100001010101010101 010101011000010101000100010101001110010001000101010001000101111101000010010011000100111110100010010011000100111100

請注意PDFTron 是其各自所有者的註冊商標。 本網站與 PDFTron 無任何關聯,亦未獲得其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 文中比較僅供參考,反映的是撰寫本文時可公開取得的資訊。

常見問題解答

如何在C#中將HTML轉換為PDF?

您可以使用 IronPDF 的RenderHtmlAsPdf方法將 HTML 字串轉換為 PDF。您也可以使用RenderHtmlFileAsPdf將 HTML 檔案轉換為 PDF。

IronPDF 和 PDFTron 在 HTML 轉 PDF 效能上有何不同?

IronPDF 基於 Chrome 引擎,能夠為複雜的網頁內容提供卓越的渲染效果,並對 JavaScript 和 CSS3 提供更好的支援。 PDFTron 雖然處理簡單的 HTML 速度更快,但在處理複雜內容方面可能不如 IronPDF 有效。

IronPDF 和 PDFTron 的授權許可選項有哪些?

IronPDF 提供透明且永久的許可,包含所有功能,起價為 749 美元。而 PDFTron 則需要客製化許可報價,每年的費用從 5,000 美元到 100,000 美元以上不等。

是否可以使用這些函式庫將 ASPX 頁面轉換為 PDF?

是的,IronPDF 可以使用AspxToPdf.RenderThisPageAsPdf方法,只需一行程式碼即可將 ASPX 頁面轉換為 PDF。 PDFTron 不直接支援 ASPX 頁面轉換。

哪個函式庫更適合像 Azure 這樣的雲端環境?

IronPDF 針對雲端環境(包括 Azure 和 AWS)進行了最佳化,並可與 Functions 和 WebApps 無縫協作。 PDFTron 可能需要額外的配置才能達到最佳的雲端部署效果。

IronPDF 或 PDFTron 可以建立可填寫的 PDF 表單嗎?

是的,這兩個庫都支援建立可填寫的 PDF 表單。 IronPDF 使用CreatePdfFormsFromHtml實作 HTML 表單的自動轉換。 PDFTron 提供豐富的表單欄位類型,但需要更複雜的整合。

IronPDF 和 PDFTron 用戶可以獲得哪些支援選項?

IronPDF 提供每週 5 天、每天 24 小時的工程支持,可直接聯繫開發人員,通常回應時間為 24-48 小時。 PDFTron 的支援選項會根據授權等級而有所不同,包括基本的論壇支援和付費的直接協助。

IronPDF 和 PDFTron 在處理受密碼保護的網站上有何不同?

IronPDF 支援透過ChromeHttpLoginCredentials進行身份驗證,以處理登入表單和 HTTP 驗證,而 PDFTron 對此功能的支援有限。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。