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: 更低的記憶體佔用量 | |
| Licensing & Pricing | 入門級 | Lite: $999 (1 dev, 1 project) | 自訂報價(估計 5,000 美元至 10,000 美元以上) | IronPDF:價格透明 |
| 企業 | Professional: $2,999 (10 devs) | 自訂報價 (估計 $30,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 專案?
無論您選擇哪一種函式庫,設定 ASP.NET 專案以產生 PDF 都需要適當的設定。 按照以下步驟建立 IronPDF 或 PDFTron 整合的基礎:
1.開啟 Visual Studio 2022 或更新版本 2.按一下"建立新專案 3.選擇"ASP.NET Core Web App"(建議使用 .NET 6.0 或更新版本) 4.選擇專案名稱和地點 5.根據您的需求選擇"Web 應用程式 (模型-視圖-控制器)"或"Web API"。 6.確保選擇".NET 8.0 "或更新版本以獲得最佳相容性
。
Visual Studio 的"新增專案"對話方塊顯示 PDF 資料庫整合的 ASP.NET 專案範本
適用於 Web 表單應用程式:
- 選擇 "ASP.NET Web 應用程式 (.NET Framework)"。
- 從模板選項中選擇"Web 表單
- 按一下"建立"以產生專案結構
。
為具有 PDF 功能的傳統 ASP.NET 應用程式選擇 Web 表單範本
如何在我的 C# 專案中安裝 IronPDF?
IronPDF 提供多種安裝方式,以適應不同的開發工作流程。 在 Visual Studio 中,以滑鼠右鍵按一下解決方案資源管理器中的項目,然後選擇"管理 NuGet 套件..."。 然後,只需搜尋 IronPDF 並安裝最新版本即可。
方法 1:使用 Visual Studio 套件管理員
最直接的方法是使用 Visual Studio 內建的 NuGet Package Manager:
1.在"解決方案總管"中右鍵按一下專案 2.選擇"管理 NuGet 套件"。 3.按一下"瀏覽"並搜尋"IronPDF"。 4.在 IronPDF 套件上按一下"安裝"。
。
透過 Visual Studio 的解決方案總管存取 NuGet 套件管理員以進行 IronPDF 安裝。
!Visual Studio 中的專案選單顯示套件管理選項。 透過 Visual Studio 的專案功能表存取 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
方法 3:直接下載安裝
適用於無法存取 NuGet 的環境:
1.從 IronPDF 官方網站下載 2.解壓縮 ZIP 檔案到您的專案目錄 3.在 Visual Studio 中,右鍵按一下"參考資料"→"新增參考資料
- 瀏覽並選擇
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
如何安裝 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/
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
3.複製所需的程式庫
將 PDFNET_BASE 中的 Lib 資料夾複製到您的專案目錄中
- 新增
PDFNetLoader.dll和平台特定PDFNet.dll的引用
4.設定複製本機屬性
將 PDFNet.dll 的複製本機屬性設為 False,以正確部署 PDFTron
5.更新 App.config。
<configuration>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
</configuration>
<configuration>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
</configuration>
6.設定建立後事件。
xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
NuGet 安裝(簡體版)
如需更精簡的方法:
1.開啟 NuGet 套件管理程式 2.搜尋"PDFTron.NET.x64"或特定平台套件 3.針對您的架構安裝適當的套件
。
透過 NuGet 套件管理程式安裝 PDFTron 與平台特定的套件
相較於 ComPDFKit 的 10+ 種類型,PDFTron 提供了更廣泛的 30 多種註解類型。然而,如此廣泛的功能集需要在安裝時仔細選擇模組。
如何使用這些函式庫將 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")
IronPDF 中的 Chrome 渲染器可處理複雜的情況,包括:
- 使用大量 JavaScript 的單頁應用程式 (SPA)
- 使用媒體查詢的回應式設計
- 網頁字型與外部樣式表
- AJAX 內容載入
- CSS 動畫和轉場
IronPDF 主分支現在支援所有這些功能:NuGet.org/packages/IronPdf。 最近的效能改善已大幅提升渲染速度,尤其是複雜的網頁應用程式。
使用 PDFTron (Apryse) 將 URL 轉換為 PDF
PDFTron 需要 HTML2PDF 模組來進行網頁內容轉換:
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
class UrlToPdfConverter
{
public static void ConvertUrlToPdf(string url, string outputPath)
{
// Initialize PDFTron with license
PDFNet.Initialize("your-license-key");
// Create a new PDF document
using (PDFDoc doc = new PDFDoc())
{
// Initialize HTML2PDF converter
HTML2PDF converter = new HTML2PDF();
// Configure conversion settings
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
// Set page dimensions
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetMargins(0.5, 0.5, 0.5, 0.5);
// Insert URL content
converter.InsertFromURL(url);
// Perform conversion
if (converter.Convert(doc))
{
// Save the resulting PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
Console.WriteLine($"Successfully converted {url} to {outputPath}");
}
else
{
Console.WriteLine("Conversion failed");
}
}
}
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
class UrlToPdfConverter
{
public static void ConvertUrlToPdf(string url, string outputPath)
{
// Initialize PDFTron with license
PDFNet.Initialize("your-license-key");
// Create a new PDF document
using (PDFDoc doc = new PDFDoc())
{
// Initialize HTML2PDF converter
HTML2PDF converter = new HTML2PDF();
// Configure conversion settings
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
// Set page dimensions
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetMargins(0.5, 0.5, 0.5, 0.5);
// Insert URL content
converter.InsertFromURL(url);
// Perform conversion
if (converter.Convert(doc))
{
// Save the resulting PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
Console.WriteLine($"Successfully converted {url} to {outputPath}");
}
else
{
Console.WriteLine("Conversion failed");
}
}
}
}
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
PDFTron HTML2PDF 的重要注意事項:
- PDFTron 的 SDK 會根據技術的廣度(API、功能)和分發範圍(外部或內部使用者)進行報價。
- 與瀏覽器引擎相比,JavaScript 支援有限
- 複雜的佈局可能需要額外的設定
- 更適合較簡單的 HTML 文件
如何從 HTML 字串建立 PDF?
從 HTML 字串建立 PDF 對於產生動態報告、發票和文件是非常重要的。 這兩個函式庫的處理方式各有不同。
使用 IronPDF 將 HTML 字串轉換為 PDF.
IronPDF 擅長渲染複雜的 HTML,並完全支援 CSS3 和 JavaScript:
using IronPdf;
using System.Text;
public class HtmlStringToPdfConverter
{
public static PdfDocument GenerateInvoice(InvoiceData data)
{
// Build dynamic HTML with modern CSS
var html = new StringBuilder();
html.Append(@"
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
margin: 0;
padding: 20px;
color: #333;
}
.invoice-header {
display: flex;
justify-content: space-between;
border-bottom: 2px solid #007bff;
padding-bottom: 20px;
margin-bottom: 30px;
}
.company-logo {
width: 150px;
height: auto;
}
.invoice-details {
text-align: right;
}
.invoice-number {
font-size: 24px;
font-weight: 700;
color: #007bff;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
.total-row {
font-weight: 700;
font-size: 18px;
background-color: #e9ecef;
}
@media print {
body { margin: 0; }
.no-print { display: none; }
}
</style>
</head>
<body>
");
// Add invoice header
html.Append($@"
<div class='invoice-header'>
<div>
<img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
<h2>{data.CompanyName}</h2>
<p>{data.CompanyAddress}</p>
</div>
<div class='invoice-details'>
<div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
<p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
<p>Due: {data.DueDate:yyyy-MM-dd}</p>
</div>
</div>
");
// Add line items table
html.Append(@"
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
");
foreach (var item in data.LineItems)
{
html.Append($@"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>
");
}
html.Append($@"
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='3'>Total</td>
<td>${data.Total:F2}</td>
</tr>
</tfoot>
</table>
</body>
</html>
");
// Configure renderer for optimal output
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Generate PDF with proper base path for assets
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// Add security if needed
pdf.SecuritySettings.UserPassword = data.CustomerEmail;
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
return pdf;
}
}
using IronPdf;
using System.Text;
public class HtmlStringToPdfConverter
{
public static PdfDocument GenerateInvoice(InvoiceData data)
{
// Build dynamic HTML with modern CSS
var html = new StringBuilder();
html.Append(@"
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
margin: 0;
padding: 20px;
color: #333;
}
.invoice-header {
display: flex;
justify-content: space-between;
border-bottom: 2px solid #007bff;
padding-bottom: 20px;
margin-bottom: 30px;
}
.company-logo {
width: 150px;
height: auto;
}
.invoice-details {
text-align: right;
}
.invoice-number {
font-size: 24px;
font-weight: 700;
color: #007bff;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
.total-row {
font-weight: 700;
font-size: 18px;
background-color: #e9ecef;
}
@media print {
body { margin: 0; }
.no-print { display: none; }
}
</style>
</head>
<body>
");
// Add invoice header
html.Append($@"
<div class='invoice-header'>
<div>
<img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
<h2>{data.CompanyName}</h2>
<p>{data.CompanyAddress}</p>
</div>
<div class='invoice-details'>
<div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
<p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
<p>Due: {data.DueDate:yyyy-MM-dd}</p>
</div>
</div>
");
// Add line items table
html.Append(@"
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
");
foreach (var item in data.LineItems)
{
html.Append($@"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>
");
}
html.Append($@"
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='3'>Total</td>
<td>${data.Total:F2}</td>
</tr>
</tfoot>
</table>
</body>
</html>
");
// Configure renderer for optimal output
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Generate PDF with proper base path for assets
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// Add security if needed
pdf.SecuritySettings.UserPassword = data.CustomerEmail;
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
return pdf;
}
}
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
IronPDF HTML 渲染的主要優勢:
- 完整的 CSS3 支援,包括 flexbox 和網格佈局
- Google 字型與網頁字型整合
- 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
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
如需對渲染過程進行更多控制:
// 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
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
如何將圖片轉換為 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
先進的影像處理功能:
- 保留向量品質的 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
有哪些授權選項和費用?
瞭解授權對於預算和合規性至關重要。 這兩個函式庫的定價模式大不相同。
IronPDF 授權。
IronPDF 有 3 個定價版本,從 $999 到 $2,999。 您也可以免費試用 IronPDF。 IronPDF 提供透明、公佈的價格(截至 2025 年):
授權層級: -精簡版許可證: $999
- 1 名開發人員
- 1 位置
- 1 個專案
- 適用於個別開發人員或小型專案
- Plus 許可證: $1,499
- 3 名開發人員
- 3 個地點
- 3 個專案
- 非常適合小型團隊
專業許可證: $2,999
- 10 位開發人員
- 10 個地點
- 10 個專案
- 最適合成長中的團隊
-無限制許可:客製化定價
- 不限開發人員
- 地點不限
- 無限制的專案
其他選項:
- 免版稅再分發:+$2,999(一次性)
- 提供 SaaS/OEM 授權
- Iron Suite 捆綁版:以 2 個產品的價格獲得 10 個產品
所有 Team License 均不可轉讓,且禁止在組織或代理/客戶關係之外共用授權。
PDFTron (Apryse) 授權
PDFTron 的授權以報價為基礎,沒有公佈定價。 以使用者回饋和產業報告為基礎:
估計定價範圍:
- 小型企業:每年 5,000 - 15,000 美元
- 企業:每年 30,000 美元 - 100,000 美元以上
- 附加模組需要獨立授權
價格透明度是 PDFTRON 的一大弊端。 所有東西都是附加元件,需要特定的授權條款和合約。 使用者報告:
- 在 PDFTRON 上投資了 6500 美元之後,他們的產品根本無法像宣傳的那樣運作,讓我們空手而回,還要在我們的產品中清理一大堆爛攤子。
- 需要進行複雜的授權談判
- 每個模組的定價增加了總成本
- 有限退款政策
主要差異:
- IronPDF:永久授權,一次性付款
- PDFTron: 通常以訂閱或年費為基礎
- IronPDF:基本授權中包含的所有功能
- PDFTron: 核心功能與付費附加元件
支援選項如何比較?
開發人員的支援可能會影響專案的時程。 以下是各家廠商提供客戶協助的方式。
IronPDF 支援。
IronPDF 包含所有 License 的專業支援:
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
來自生產環境的效能指標:
- 簡單的 HTML:200-400 毫秒
- 使用 CSS/JS 的複雜 HTML:800-1200ms
- IronPDF 確有 Async 變異的 render 方法,例如這裡的 ironpdf.com/examples/async。 在我的用例中,使用
Parallel.ForEach是批次渲染 HTML 轉 PDF 效能最高的策略。
PDFTron (Apryse) 的效能
PDFTron 通常可為簡單的轉換提供更快的原始效能:
- 基本 HTML:100-300 毫秒
- 辦公室文件:500-1000ms
- 較低的記憶體佔用量
- 更適合大量的簡單文件
然而,使用者反映在複雜的情況下會出現問題:
- Bug 不時會出現。有時甚至是非常有害的 Bug,而這些 Bug 應該在 QA 測試中就已經發現了。 他們可能需要一段時間才能最終修好。
現代 CSS 框架和 Bootstrap 支援。
隨著企業應用程式越來越多地採用 Bootstrap、Tailwind 和 Foundation 等現代 CSS 框架,能否準確地將這些框架轉換為 PDF 成為 PDF 函式庫的重要選擇標準。
IronPDF:完整的 Chromium 架構支援。
IronPDF 的 Chrome V8 渲染引擎全面支援所有現代 CSS 框架和 Web 標準:
- Bootstrap 5:完全支援 Flexbox 和 CSS Grid,以及所有響應式工具
- Bootstrap 4:完全相容於卡片組件、導航系統和表單佈局
- Tailwind CSS:所有實用類別、響應式修飾符和 JIT 編譯模式 -基礎:完整的網格系統和組件庫支持 現代CSS3: Flexbox、CSS Grid、CSS變數、動畫、變換與過渡
- JavaScript 框架: React、Vue、Angular 元件渲染,並支援完整的互動功能
生產驗證:Bootstrap首頁和官方範本的瀏覽器轉換保真度達98%以上。
程式碼範例:具有資料表的企業儀表板。
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<h1>Sales Dashboard - Q1 2025</h1>
<span class='badge bg-success fs-5'>+15.3% YoY</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Total Revenue</h6>
<h2 class='text-primary'>$1.2M</h2>
<small class='text-success'>↑ 12%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>New Customers</h6>
<h2 class='text-info'>1,847</h2>
<small class='text-success'>↑ 8%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Avg Order Value</h6>
<h2 class='text-warning'>$649</h2>
<small class='text-danger'>↓ 3%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Conversion Rate</h6>
<h2 class='text-success'>3.2%</h2>
<small class='text-success'>↑ 0.4%</small>
</div>
</div>
</div>
</div>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Top Products by Revenue</h5>
</div>
<div class='card-body p-0'>
<table class='table table-striped table-hover mb-0'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Category</th>
<th>Units Sold</th>
<th class='text-end'>Revenue</th>
<th class='text-end'>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Professional License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>1,234</td>
<td class='text-end'>$369,000</td>
<td class='text-end'><span class='badge bg-success'>+18%</span></td>
</tr>
<tr>
<td><strong>Plus License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>2,891</td>
<td class='text-end'>$289,000</td>
<td class='text-end'><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Support Package</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>892</td>
<td class='text-end'>$178,000</td>
<td class='text-end'><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Training Program</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>456</td>
<td class='text-end'>$91,000</td>
<td class='text-end'><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<h1>Sales Dashboard - Q1 2025</h1>
<span class='badge bg-success fs-5'>+15.3% YoY</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Total Revenue</h6>
<h2 class='text-primary'>$1.2M</h2>
<small class='text-success'>↑ 12%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>New Customers</h6>
<h2 class='text-info'>1,847</h2>
<small class='text-success'>↑ 8%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Avg Order Value</h6>
<h2 class='text-warning'>$649</h2>
<small class='text-danger'>↓ 3%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Conversion Rate</h6>
<h2 class='text-success'>3.2%</h2>
<small class='text-success'>↑ 0.4%</small>
</div>
</div>
</div>
</div>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Top Products by Revenue</h5>
</div>
<div class='card-body p-0'>
<table class='table table-striped table-hover mb-0'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Category</th>
<th>Units Sold</th>
<th class='text-end'>Revenue</th>
<th class='text-end'>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Professional License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>1,234</td>
<td class='text-end'>$369,000</td>
<td class='text-end'><span class='badge bg-success'>+18%</span></td>
</tr>
<tr>
<td><strong>Plus License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>2,891</td>
<td class='text-end'>$289,000</td>
<td class='text-end'><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Support Package</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>892</td>
<td class='text-end'>$178,000</td>
<td class='text-end'><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Training Program</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>456</td>
<td class='text-end'>$91,000</td>
<td class='text-end'><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim bootstrapDashboard As String = "
<!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>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard)
pdf.SaveAs("sales-dashboard.pdf")
輸出:一個專業的企業儀錶盤,採用 Bootstrap 的 flexbox 指標卡、響應式網格佈局和样式化資料表——所有內容在 PDF 中都能完美呈現。
PDFTron(Apryse):具有框架限制的 HTML2PDF 模組。
PDFTron 的 HTML 至 PDF 轉換是透過 HTML2PDF 模組提供的,該模組使用自訂的渲染引擎,對現代 CSS 框架有特定的限制:
-自訂引擎:並非基於 Chromium,這意味著 CSS3 支援並非全面,而是有選擇性的。
- Flexbox 支援:部分實現,Bootstrap 4/5 Flexbox 佈局可能無法正確渲染。
- CSS Grid:對 CSS Grid 佈局規範的支援有限
- JavaScript 的限制:與完整的瀏覽器引擎相比,JavaScript 的執行能力有限
- Bootstrap 3:由於採用了基於表格的佈局,通常比 Bootstrap 4/5 表現更好。 -框架測試不可或缺:複雜的 Bootstrap 元件需要進行廣泛的測試,並找出可能的解決方案。
根據開發人員的報告,使用 Bootstrap 的 PDFTron 使用者會遇到以下問題:
- 基於 Flexbox 的導覽列呈現對齊問題
- 需要調整 CSS 的卡牌和網格系統
- 在 PDF 輸出中不尊重回應式公用程式
- 需要簡化 Bootstrap 元件或使用回退 CSS
企業考量:對於基於現代 Bootstrap 版本(4+)建立的應用程序,PDFTron 可能需要大量的額外開發工作來處理佈局轉換,這可能會抵消其其他效能優勢。 自訂引擎方式意味著您無法獲得與真實瀏覽器相同的呈現保真度。
如需全面的 Bootstrap 框架支援與測試指南,請參閱 Bootstrap & Flexbox CSS 指南。
何時應該選擇每個函式庫?
做出正確的選擇取決於您的特定需求和限制。
選擇 IronPDF 時:。
HTML/CSS保真度是關鍵。
- 具有複雜佈局的現代網路應用程式
- JavaScript 較多的內容
- 需要保留的回應式設計
以快速開發為優先。
- 簡單的 API 可縮短開發時間
- 廣泛的程式碼範例。
- 最小的學習曲線
預算透明很重要。
- 公佈定價有助於準確預算
- 無驚喜成本或隱藏費用
- 包含基本授權中的所有功能
您需要特定的功能。
- ASPX 至 PDF 轉換。
- Azure 與雲端最佳化。
- 全面的 HTML/CSS/JS 支援
選擇 PDFTron (Apryse) 時:
企業文件工作流程。
- 支援 XFA 的複雜表單處理
- CAD 檔案轉換 (DWG、DXF)
- 進階 Office 文件處理
效能優於功能。
- 大量簡單文件處理
- 較低的記憶體需求
- 基本 HTML 轉換需求
專業需求。
- 內建文件檢視器元件
- 廣泛的注釋類型 (30+)
- 舊系統整合
大型企業環境。
- 專屬支援合約
- 自訂功能開發
- 合規認證
摘要與結論
IronPDF 和 PDFTron (Apryse) 都是功能強大的 PDF 函式庫,但它們服務於不同的市場區隔和使用個案。
IronPDF 擅長於
- 支援現代網路技術(HTML5、CSS3、JavaScript)
- 開發人員友善的 API 設計
- 透明、可負擔的定價
- 快速應用程式開發
- 雲端與容器化部署
PDFTron (Apryse) 優勢包括:
- 企業文件工作流程
- CAD 和專業格式支援
- 降低資源消耗
- 廣泛的注釋功能
- 舊系統相容性
對於大多數建立現代應用程式的 .NET 開發人員而言,IronPDF 提供了功能、易用性和價值的最佳組合。 其基於 Chrome 的渲染引擎可確保像素完美的 HTML 至 PDF 轉換,而直接的 API 則可加速開發。
PDFTron 對於有 CAD 轉換、複雜表單處理或使用傳統文件格式等特定需求的企業而言,仍然是可行的。 然而,缺乏定價透明度和模組化的授權結構會大幅增加總成本。
開始
試用 IronPDF:
探索 PDFTron:
請記住,在做出決定之前,請徹底評估這兩個選項與您的特定使用個案。 除了技術能力之外,還要考慮長期成本、支援品質和功能路線圖等因素。
!{--01001100010010010100001001010010010000010101001001011001010 111110100011101000101010101010001011111010100110101010001000001 010100100101010001000101010001000101111101010111010010010101010 001001000010111110101000001010101000010010000101111101010000010 1001001001111010001000101010101000011010101010001011111010101000101001001001001010101010001010010010010010100001010101010101 010101011000010101000100010101001110010001000101010001000101111101000010010011000100111110100010010011000100111100
常見問題解答
怎樣在 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 對此功能的支持有限。

