跳至页脚内容
产品比较

IronPDF 与 PDFTron (Apryse):2025 年完整的 C# PDF 库比较

正在为您的.NET项目寻找合适的PDF库吗? 这份IronPDF与PDFTron(现为Apryse)的详细对比分析了功能、定价、性能和开发者体验,以帮助您做出明智的决策。 无论您是在构建Web应用程序、桌面软件还是云服务,选择合适的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.2s 通常(Chrome 引擎) 0.3-0.5s 通常(简单 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应用程序(Model-View-Controller)”或“Web API”
  6. 确保选择“.NET 8.0”或更高版本以获得最佳兼容性

Visual Studio的新项目对话框显示ASP.NET Core Web应用程序选择 Visual Studio的新项目对话框显示用于PDF库集成的ASP.NET项目模板

对于Web Forms应用程序:

  • 选择“ASP.NET Web 应用程序 (.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"

  1. 单击IronPDF包的“安装”

解决方案资源管理器上下文菜单显示管理NuGet包选项 通过Visual Studio解决方案资源管理器访问NuGet包管理器进行IronPDF安装

Visual Studio中显示包管理选项的项目菜单 通过Visual Studio的项目菜单以其他方式访问NuGet包管理器

显示IronPDF安装的NuGet包管理器界面 通过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. 使用许可证密钥初始化

    // 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属性

Visual Studio中将PDFTron Copy Local属性设置为False 将PDFNet.dll的Copy Local属性设置为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

与ComPDFKit的10多种类型相比,PDFTron 提供30多种注释类型。然而,这个广泛的功能集在安装过程中需要仔细选择模块。

如何使用这些库将URL转换为PDF?

这两个库都提供URL到PDF转换功能,但方法和功能不同。 让我们来看看每个库的实现细节和性能特点。

使用IronPDF进行URL到PDF转换

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");
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的单页应用程序(SPAs)
  • 使用媒体查询的响应式设计
  • Web字体和外部样式表
  • 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是基于技术广度(API,功能)和发行范围(外部或内部用户)进行报价的。
  • 与浏览器引擎相比,JavaScript支持有限
  • 对于复杂的布局可能需要额外的配置
  • 更适合简单的HTML文档

如何从HTML字符串创建PDF?

从HTML字符串创建PDF对于生成动态报表、发票和文档是必不可少的。 这两个库对此有不同的处理方式。

使用IronPDF将HTML字符串转换为PDF

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,包括flexbox和网格布局
  • Google字体和Web字体集成
  • 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);
            }
        }
    }
}
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捆绑包:以2个产品的价格获得10个产品

所有团队许可证均不可转让,且禁止在组织或代理/客户关系之外分享许可证。

PDFTron (Apryse)许可

PDFTron的许可是基于报价的,没有已发布的定价。 根据用户反馈和行业报告:

估计定价范围:

  • 小型企业:每年5000 - 15000美元
  • 企业:每年30000 - 100000+美元
  • 额外的模块需要单独的许可证

PDFTRON的定价透明度是一个很大的缺点。 所有功能都是附加功能,需要具体的许可条款和合同。 用户报告:

  • 在PDFTRON上投资了6500美元,他们的产品根本没按宣传运作,导致我们一无所获,并且我们的产品一片混乱。
  • 需要复杂的许可谈判
  • 每个模块的定价会增加总成本
  • 退货政策有限

关键差异:

  • IronPDF:永久许可证,一次付费
  • PDFTron:通常是基于订阅或年费
  • IronPDF:所有功能都包含在基本许可证中
  • PDFTron:核心功能加付费附加功能

支持选项如何比较?

开发人员的支持可以影响项目的时间表。 以下是每个供应商的客户协助方法。

IronPDF支持

IronPDF为所有许可证提供专业支持:

IronPDF库在Azure WebApps、Functions和WebJobs中运行。 它可以在Linux和Windows版本中运行,不过我建议使用Windows版本的Functions和WebApps,测试更彻底,安装更容易。

PDFTron (Apryse)支持

PDFTron的支持因许可证级别而异:

  • PDFTron的成本很高。 对我们的业务来说,这个成本很重要,但在将此产品与其他PDF Web解决方案进行比较时,确实是一个障碍。
  • 针对基本许可证的论坛支持
  • 提供付费支持计划
  • 有时候支持可能不足,让开发人员自己去解决困难。
  • 响应时间因支持级别而异

性能特征是什么?

性能影响用户体验和服务器成本。 让我们看看真实世界的性能数据。

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-400ms
  • 复杂的带有CSS/JS的HTML:800-1200ms
  • IronPDF确实有异步变体的呈现方法,纪录在ironpdf.com/examples/async。 使用Parallel.ForEach是我处理Html转换成PDF时性能最佳的策略

PDFTron (Apryse)性能

PDFTron通常为简单转换提供更快的原始性能:

  • 基本HTML:100-300ms
  • Office文档:500-1000ms
  • 内存占用更低
  • 更适合高容量简单文档

然而,用户报告在复杂场景中问题频出:

  • 有时会出现一些相当严重的问题,这应在质量保证测试中被发现。 修复这些问题可能需要一些时间。

现代CSS框架和Bootstrap支持

随着企业应用程序越来越多地采用诸如Bootstrap、Tailwind和Foundation等现代CSS框架,能够准确转换这些框架到PDF成为一个PDF库的关键选择标准。

IronPDF:全面的Chromium框架支持

IronPDF的Chrome V8渲染引擎为所有现代CSS框架和Web标准提供全面支持:

  • Bootstrap 5:完整的flexbox和CSS Grid支持,带有所有响应式工具
  • Bootstrap 4:与卡片组件、导航系统和表单布局完全兼容
  • Tailwind CSS:所有实用程序类、响应修饰符和即时编译模式
  • Foundation: 完整的网格系统和组件库支持。
  • 现代CSS3:Flexbox、CSS Grid、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的flexbox指标卡、响应式网格布局和样式化的数据表 - 所有的在PDF中完美呈现。

PDFTron (Apryse):带有框架限制的HTML2PDF模块

PDFTron的HTML到PDF转换通过HTML2PDF模块提供,该模块使用具有特定现代CSS框架限制的自定义渲染引擎:

  • 自定义引擎:不是基于Chromium,这意味着对于CSS3的支持是选择性的而不是全面的
  • Flexbox支持:部分实现,Bootstrap 4/5的flexbox布局可能无法正确渲染
  • CSS Grid:对CSS网格布局规范的支持有限
  • 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内容繁重
  • 需要保留的响应设计

快速开发是优先事项

预算透明很重要

  • 发布的定价使预算准确
  • 没有意外成本或隐藏费用
  • 包括在基本许可证中的所有功能

您需要特定功能

何时选择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加快了开发速度。

PDFTron对于具有CAD转换、复杂表单处理或与遗留文档格式相关的具体需求的企业仍然可行。 然而,缺乏定价透明度和模块化许可结构可能会显著增加总成本。

快速入门

试用IronPDF:

探索PDFTron:

请务必在做出决定前,根据特定用例彻底评估这两个选项。 结合技术能力考虑长期成本、支持质量和功能路线图等因素。

立即开始使用 IronPDF。
green arrow pointer

[{i:(PDFTron是其各自所有者的注册商标。 本网站与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 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 IronSuite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。