跳過到頁腳內容
產品比較

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

正在尋找適合您的 .NET 項目的 PDF 庫嗎? 這份 IronPDF 和 PDFTron(現為 Apryse)之間的全面比較分析了功能、定價、性能和開發者體驗,以幫助您做出明智的決定。 無論您是在構建網頁應用程序、桌面軟件還是雲服務,選擇正確的 PDF 工具包都可以顯著影響您的開發速度和項目成功。

快速比較總結

類別 功能/方面 IronPDF PDFTron (Apryse) 主要優勢
核心架構 設計哲學 簡單優先,Chrome 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 渲染引擎 完整的 Chrome V8 引擎 自定義引擎(通過 HTML2PDF 模塊) IronPDF:98%+ 瀏覽器相似性
JavaScript 支持 完全集成支持,渲染延遲 有限支持 IronPDF:動態內容設置
MS Office 支持 DOCX 至 PDF 內建 DocxToPdfRenderer PDFTron:更好的 Office 精確性
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:更低内存消耗
授權和定價 入門級 Lite: $799(1 位開發者,1 個專案) 自定義報價(估計 ,000-,000+) IronPDF:價格透明
企業級 Professional: $2,399(10 位開發人員) 自定義報價(估算 ,000+) IronPDF:最高可省 90% 成本
支持 支持包括 是,24/5 工程支持 隨著授權級別不同而不同 IronPDF:支持包括
最佳用途 使用案例 現代網頁應用,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 Application (.NET Framework)”
  • 從模板選項中選擇“Web Forms”
  • 單擊“創建”以生成項目結構

Visual Studio 項目創建向導中的 Web Forms 模板選擇 選擇具有 PDF 功能的傳統 ASP.NET 應用程序的 Web Forms 模板

如何在我的 C# 項目中安裝 IronPDF?

IronPDF 提供多種安裝方法以適應不同的開發工作流程。 在 Visual Studio 中,右鍵單擊“解決方案資源管理器”中的項目,然後選擇“管理 NuGet 包...”。 從那裡,只需搜索 IronPDF 並安裝最新版本。

方法 1:使用 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,包含版本信息和依賴項

方法 2:使用包管理器控制台

適用於更喜歡命令行工具的開發人員:

# 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

方法 3:直接下載安裝

適用於無法訪問 NuGet 的環境:

  1. IronPDF 的官方網站 下載
  2. 將 ZIP 文件解壓到你的項目目錄
  3. 在 Visual Studio 中,右鍵單擊“引用”→“添加引用”
  4. 瀏覽並選擇 IronPdf.dll

方法 4:使用 .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. 使用 License Key 初始化

    // 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
    ' 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. 配置 Copy Local 屬性

PDFTron 在 Visual Studio 中設置 Local Copy 屬性為 False 設置 PDFNet.dll 的 Local Copy 屬性為 False 以正確部署 PDFTron

  1. 更新 App.config

    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    XML
  2. 配置後組建事件

    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 將 URL 轉換為 PDF

IronPDF 的 Chrome 渲染引擎為現代網絡標準提供了非凡的支持:

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");
Imports IronPdf

' Initialize the Chrome renderer with advanced options
Private 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() With {
	.Username = "user@domain.com",
	.Password = "secure_password"
}

' Render URL to PDF with full browser capabilities
Dim 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 模塊來進行 Web 內容轉換:

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");
            }
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Friend Class UrlToPdfConverter
	Public Shared Sub ConvertUrlToPdf(ByVal url As String, ByVal outputPath As String)
		' Initialize PDFTron with license
		PDFNet.Initialize("your-license-key")

		' Create a new PDF document
		Using doc As New PDFDoc()
			' Initialize HTML2PDF converter
			Dim converter As New HTML2PDF()

			' Configure conversion settings
			Dim settings As 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) Then
				' Save the resulting PDF
				doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
				Console.WriteLine($"Successfully converted {url} to {outputPath}")
			Else
				Console.WriteLine("Conversion failed")
			End If
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

PDFTron HTML2PDF 的重要考慮因素:

  • PDFTron 的 SDK 根據技術的廣泛性(APIs,功能)和分發範圍(外部或內部用戶)進行報價。
  • 相比於瀏覽器引擎,JavaScript 支持有限
  • 對於複雜佈局可能需要額外配置
  • 更適合簡單的 HTML 文檔

如何從 HTML 字符串創建 PDF?

從 HTML 字符串創建 PDF 對於生成動態報告、發票和文檔至關重要。 兩個庫對此處理方式不同。

HTML 字符串到 PDF 與 IronPDF

IronPDF 擅長於渲染具有全 CSS3 和 JavaScript 支持的複雜 HTML:

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;
    }
}
Imports IronPdf
Imports System.Text

Public Class HtmlStringToPdfConverter
	Public Shared Function GenerateInvoice(ByVal data As InvoiceData) As PdfDocument
		' Build dynamic HTML with modern CSS
		Dim 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>
        ")

		For Each 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>
            ")
		Next item

		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
		Dim renderer = New ChromePdfRenderer()
		renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
		renderer.RenderingOptions.EnableJavaScript = True
		renderer.RenderingOptions.CreatePdfFormsFromHtml = True

		' Generate PDF with proper base path for assets
		Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())

		' Add security if needed
		pdf.SecuritySettings.UserPassword = data.CustomerEmail
		pdf.SecuritySettings.AllowUserPrinting = True
		pdf.SecuritySettings.AllowUserCopyPasteContent = False

		Return pdf
	End Function
End Class
$vbLabelText   $csharpLabel

IronPDF HTML 渲染的主要優勢:

  • 全 CSS3 支持,包括彈性盒子和網格佈局
  • Google 字體和網絡字體集成
  • JavaScript 圖表庫(Chart.js,D3.js)完美呈現
  • 帶有視口控製的響應設計支持
  • 用於自包含文檔的 Base64 圖像嵌入

HTML 字符串到 PDF 與 PDFTron(Apryse)

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);
            }
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Public Class PdfTronHtmlConverter
	Public Shared Sub ConvertHtmlString(ByVal htmlContent As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			' Create HTML2PDF converter instance
			Dim converter As 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
			Dim settings As 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) Then
				' Post-processing options
				doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
			End If
		End Using
	End Sub
End Class
$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
            });
    }
}
Imports IronPdf

Partial Public Class InvoicePage
	Inherits System.Web.UI.Page

	Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
		' Render the current ASPX page as PDF on page load
		If Request.QueryString("pdf") = "true" Then
			' Configure PDF output options
			AspxToPdf.RenderThisPageAsPdf(AspxToPdf.FileBehavior.InBrowser, "Invoice_" & DateTime.Now.ToString("yyyyMMdd") & ".pdf")
		End If
	End Sub

	Protected Sub ExportToPdfButton_Click(ByVal sender As Object, ByVal e As EventArgs)
		' Advanced configuration for ASPX to PDF
		IronPdf.AspxToPdf.RenderThisPageAsPdf(IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", New ChromePdfRenderOptions() With {
			.PaperSize = PdfPaperSize.A4,
			.MarginTop = 20,
			.MarginBottom = 20,
			.CssMediaType = PdfCssMediaType.Print,
			.EnableJavaScript = True,
			.CreatePdfFormsFromHtml = True,
			.FitToPaper = True
		})
	End Sub
End Class
$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
    };
}
' In Global.asax.cs or Startup.cs
Public Shared Sub 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() With {
		.HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
		.Height = 25
	}
End Sub
$vbLabelText   $csharpLabel

IronPDF 的 ASPX 到 PDF 功能 保留了:

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

PDFTron 的 ASPX 替代方法

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();
    }
}
' Capture ASPX output as HTML, then convert
Public Sub ConvertAspxWithPdfTron()
	' Render ASPX to string first
	Dim sw As New StringWriter()
	Dim hw As New HtmlTextWriter(sw)

	' Render the page to HTML
	Me.RenderControl(hw)
	Dim htmlContent As String = sw.ToString()

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

	Using doc As New PDFDoc()
		Dim converter As New HTML2PDF()
		converter.InsertFromHtmlString(htmlContent)
		converter.Convert(doc)

		' Send to browser
		Dim pdfBytes() As Byte = doc.Save(SDFDoc.SaveOptions.e_linearized)
		Response.ContentType = "application/pdf"
		Response.BinaryWrite(pdfBytes)
		Response.End()
	End Using
End Sub
$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");
    }
}
Imports IronPdf
Imports System.IO
Imports System.Linq

Public Class ImagePdfGenerator
	Public Shared Sub CreatePhotoAlbum(ByVal imageFolder As String, ByVal outputPath As String)
		' Get all supported image files
		Dim supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" }
		Dim imageFiles = Directory.GetFiles(imageFolder).Where(Function(f) supportedExtensions.Contains(Path.GetExtension(f).ToLower())).OrderBy(Function(f) f)

		' Convert images to PDF with options
		Dim 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)
	End Sub

	Public Shared Sub CreateThumbnailCatalog(ByVal images As List(Of ProductImage))
		Dim renderer = New ChromePdfRenderer()

		' Build HTML with image grid
		Dim 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'>"

		For Each image In images
			html &= $"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>"
		Next image

		html &= "</div></body></html>"

		' Render with optimal settings for images
		renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
		Dim pdf = renderer.RenderHtmlAsPdf(html)
		pdf.SaveAs("product-catalog.pdf")
	End Sub
End Class
$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);
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Public Class PdfTronImageConverter
	Public Shared Sub ConvertImageToPdf(ByVal imagePath As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			' Use Convert API for image to PDF
			pdftron.PDF.Convert.ToPdf(doc, imagePath)

			' Additional image processing
			Dim itr As PageIterator = doc.GetPageIterator()
			Do While itr.HasNext()
				Dim page As Page = itr.Current()

				' Adjust page size to image
				Dim crop_box As Rect = page.GetCropBox()
				page.SetMediaBox(crop_box)

				itr.Next()
			Loop

			' Save optimized PDF
			doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
		End Using
	End Sub

	Public Shared Sub CreateMultiPageImagePdf(ByVal imagePaths() As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			Dim builder As New ElementBuilder()
			Dim writer As New ElementWriter()

			For Each imagePath As String In imagePaths
				' Create a new page for each image
				Dim page As Page = doc.PageCreate()
				writer.Begin(page)

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

				writer.End()
				doc.PagePushBack(page)
			Next imagePath

			doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

授權選項和成本有哪些?

了解授權對於預算和合規至關重要。 這兩個庫的定價模式截然不同。

IronPDF授權

IronPDF 有 3 種定價版,從 $799 到 $2,399。 IronPDF 也有免費試用版。 IronPDF 提供透明的,已發布的定價(截至 2025 年):

許可級別:

  • Lite License:$799

    • 1 名開發者
    • 1 個地點
    • 1 個項目
    • 適合個人開發者或小型項目
  • Plus License:$1,199

    • 3 名開發者
    • 3 個地點
    • 3 個項目
    • 適合小型團隊
  • Professional License:$2,399

    • 10 名開發者
    • 10 個地點
    • 10 個項目
    • 適合成長中的團隊
  • 無限許可:自定價格
    • 無限開發者
    • 無限位置
    • 無限制專案

附加選項:

  • 免版稅再分配:+$2,399(一次性)
  • 可用SaaS/OEM授權
  • Iron Suite Bundle:購買兩個產品的價格獲得 10 個產品

所有團隊許可都是不可轉讓的,禁止在組織或代理/客戶關係之外共享許可。

PDFTron(Apryse)許可

PDFTron 的許可是基於報價的,沒有已發布的定價。 根據用戶反饋和行業報告:

估算價格範圍:

  • 小型企業:每年 5,000 - 15,000 美元
  • 企業:每年 30,000 - 100,000+ 美元
  • 附加模塊需要單獨的許可

定價透明度是 PDFTRON 的一大缺點。 所有東西都是附加選項,需要具體的許可條款和合同。 用戶報告:

  • 在 PDFTRON 上投入了 6500 美元後,他們的產品根本沒有按廣告宣傳那樣運行,讓我們空手而歸,我們的產品中一團糟。
  • 需要複雜的許可談判
  • 按模塊定價增加總成本
  • 退貨政策有限

主要區別:

  • IronPDF:永久許可,一次性付款
  • PDFTron:通常基於訂閱或年費
  • IronPDF:所有功能都包含在基本許可中
  • PDFTron:核心功能加收費附加項

支持選項如何比較?

開發人員支持可能會影響或破壞項目時間表。 以下是每個供應商的客戶協助方式。

IronPDF 支持

IronPDF 包括所有許可的專業支持:

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");
    }
}
' Optimized batch processing example
Public Async Function BatchConvertWithPerformanceMonitoring() As Task
	Dim 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
	Dim tasks = New List(Of Task(Of PdfDocument))()
	Dim urls = GetUrlsToConvert()

	' Process in parallel with throttling
	Using semaphore = New SemaphoreSlim(4) ' Max 4 concurrent
		For Each url In urls
			Await semaphore.WaitAsync()

			tasks.Add(Task.Run(Async Function()
				Try
					Return Await renderer.RenderUrlAsPdfAsync(url)
				Finally
					semaphore.Release()
				End Try
			End Function))
		Next url

		Dim results = Await Task.WhenAll(tasks)

		' Merge results if needed
		Dim merged = PdfDocument.Merge(results)
		merged.SaveAs("batch-output.pdf")
	End Using
End Function
$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 毫秒
  • Office 文檔:500-1000 毫秒
  • 較低的內存佔用
  • 更適合高容量簡單文件

然而,用戶報告更複雜場景存在問題:

  • 有時會出現 bug。一些應該在 QA 測試中注意到的重大 bug 會偶爾出現。 修復可能需要一段時間。

現代 CSS 框架和 Bootstrap 支持

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

IronPDF:全面的 Chromium 基於框架支持

IronPDF 的 Chrome V8 渲染引擎提供了對所有現代 CSS 框架和 Web 標准的全面支持:

  • Bootstrap 5:完整的彈性盒子和 CSS 網格支持,帶有所有響應式功能
  • Bootstrap 4:與卡片組件、導航系統和表單佈局完全兼容
  • Tailwind CSS:所有的工具類、響應式修飾符和 JIT 編譯模式
  • Foundation:完整的網格系統和組件庫支持
  • 現代 CSS3:彈性盒子、CSS 網格、CSS 變量、動畫、變換和過渡
  • JavaScript 框架:React、Vue、Angular 組件渲染,具有完整的交互支持

Production validation: The Bootstrap homepage and official templates convert with 98%+ browser fidelity.

代碼示例:帶有數據表的企業儀表板

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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

輸出:使用 Bootstrap 的彈性盒子指標卡、響應式網格佈局和樣式化數據表的專業企業儀表板,所有這些都在 PDF 中完美呈現。

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

PDFTron 的 HTML 到 PDF 轉換是通過 HTML2PDF 模塊提供的,它使用一個具有現代 CSS 框架特定限制的自定義渲染引擎:

  • 自定義引擎:不是基於 Chromium 的,這意味着 CSS3 支持是選擇性的而不是全面的
  • 彈性盒子支持:部分實施,Bootstrap 4/5 的彈性盒子佈局可能無法正常渲染
  • CSS 網格:對 CSS 網格佈局規範的支持有限
  • JavaScript 限制:相比完整的瀏覽器引擎,JavaScript 執行受到限制
  • Bootstrap 3:由於基於表格的佈局,通常比 Bootstrap 4/5 更有效
  • 需要框架測試:複雜的 Bootstrap 組件需要廣泛的測試和潛在的解決方案

根據開發者報告,使用 Bootstrap 的 PDFTron 用戶會遇到:

  • 基於彈性盒子的導航欄渲染時會出現對齊問題
  • 卡片組和網格系統需要 CSS 調整
  • PDF 輸出中未能遵循響應性工具
  • 需要簡化 Bootstrap 組件或使用後備 CSS

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

要獲得全面的 Bootstrap 框架支持和測試指導,請參見 Bootstrap & Flexbox CSS 指南

什麼時候應該選擇每個庫?

做出正確選擇取決於你的具體要求和限制。

選擇IronPDF當:

HTML/CSS 保真度至關重要

  • 現代 Web 應用,具有複雜佈局
  • JavaScript 密集的內容
  • 需要保存的響應設計

快速開發是優先事項

預算透明度很重要

  • 發布的定價使準確預算編制成為可能
  • 沒有隱藏的成本或額外的費用
  • 所有功能包含在基本許可中

你需要特定功能

選擇 PDFTron(Apryse)的時候:

企業文檔工作流程

  • 複雜的表單處理,支持 XFA
  • CAD 文件轉換(DWG、DXF)
  • 高級 Office 文檔處理

在性能優於功能時

  • 高容量簡單文檔處理
  • 較低的內存需求
  • 基本的 HTML 轉換需求

專門的需求

  • 內置文檔查看器組件
  • 超過 30 種注釋類型
  • 與舊系統的集成

大型企業環境

  • 專用支持合同
  • 定制功能開發
  • 合規認證

總結與結論

IronPDF 和 PDFTron(Apryse)都是強大的 PDF 庫,但它們服務於不同的市場和使用案例。

IronPDF 擅長於:

  • 現代 Web 技術支持(HTML5,CSS3,JavaScript)
  • 對開發者友好的 API 設計
  • 透明且合理的價格
  • 快速應用程序開發
  • 雲和容器化部署

PDFTron(Apryse) 的優勢包括:

  • 企業文檔工作流程
  • CAD 和專用格式支持
  • 较低的资源消耗
  • 广泛的注释能力
  • 遗留系统兼容性

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

對於那些需要 CAD 轉換、複雜表單處理或與遺留文檔格式一起工作的企業,PDFTron 仍然是可行的選擇。 但是,缺乏價格透明性和模塊化許可結構可能會顯著增加總成本。

開始了解

嘗試 IronPDF:

探索 PDFTron:

在選擇之前,請務必根據你的具體用例對這兩個選項進行詳細評估。 將長期成本、支持質量和功能路線圖與技術能力一起考慮。

立即開始使用 IronPDF。
green arrow pointer

請注意PDFTron 是其各自所有者的註冊商標。 本網站與 PDFTron 無關,不代表其觀點,並未獲得其批准或贊助。 所有產品名稱、徽標和品牌均為其各自所有者的財產。 比較僅供信息參考,並反映撰寫時公開可用的信息。

常見問題解答

怎樣在 C# 中將 HTML 轉換為 PDF?

您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字符串轉換為 PDF。您還可以使用 RenderHtmlFileAsPdf 將 HTML 文件轉換為 PDF。

IronPDF 和 PDFTron 在 HTML 轉換為 PDF 的效能差異是什麼?

IronPDF 提供優越的 Chrome 引擎渲染,對複雜網頁內容提供更好的 JavaScript 和 CSS3 支援。PDFTron 對簡單 HTML 的轉換較快,但可能無法有效處理複雜內容。

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 提供 24/5 工程支援,直接連接開發者,通常 24-48 小時內回覆。PDFTron 的支援選項則取決於授權層級,提供基本的論壇支援和付費的直接協助。

IronPDF 和 PDFTron 在處理具密碼保護的網站時如何比較?

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

Jacob Mellor, Team Iron 首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & IronSuite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。