跳至頁尾內容
PDF工具

Aspose PDF轉換器替代項:IronPDF在.NET開發中的比較如何?

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Aspose PDF on pricing, HTML support, and licensing.

View Full Comparison

IronPDF和Aspose.PDF for .NET代表了兩種強大的PDF操作方法,適用於C#應用程式。 IronPDF強調簡單性和現代網頁標準支援,提供精簡的API,能直接將HTML、CSS3和JavaScript轉換為高保真PDF。 Aspose.PDF提供了一個全面的工具組,專為企業級文件處理設計,具有廣泛的自訂選項。

根本的區別在於其設計理念。 IronPDF專注於開發者生產力,使用像RenderHtmlAsPdf()這樣的直觀方法,所需程式碼極少。 Aspose.PDF透過更複雜的API結構提供細微的控制,使其適合於特定文件工作流,但需要更多的實施努力。

IronPDF和Aspose.PDF for .NET的關鍵區別是什麼?

對於那些喜歡直接切入主題的人,這裡有一個全面的表格總結本文中討論的IronPDF和Aspose.PDF之間所有主要的分歧點:

產品比較概述
IronPDF和Aspose.PDF的.NET開發功能比較
類別 功能/方面 IronPDF Aspose.PDF 關鍵優勢
核心架構 設計理念 簡潔優先,直觀的API 以企業為重點,提供細微的控制 IronPDF:更快的開發
API複雜性 簡單的方法如RenderHtmlAsPdf() 多類別方法,手動設置 IronPDF:程式碼量減少70%
學習曲線 1-2天的典型時間 1-2周的典型時間 IronPDF:更快適應
平台支持 跨平台 原生支援,無需額外包 需要Aspose.Pdf.Drawing包 IronPDF:更簡單的部署
.NET版本 .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ 類似支援(需要Drawing包) 兩者:現代框架支持
操作系統 Windows, Linux, macOS, Docker原生支持 每個平臺需要配置 IronPDF:真正一次編寫部署
雲平台 Azure/AWS優化 標準支援 IronPDF:雲端就緒
HTML到PDF 渲染引擎 完整的Chrome V8引擎 自訂HTML解析器 IronPDF:98%+的瀏覽器保真度
CSS3/HTML5支持 完整支援 有限(70-80%保真度) IronPDF:現代網頁標準
JavaScript執行 完整的JavaScript支持 基本/有限 IronPDF:動態內容
Web字體 Google字體、系統字體 僅嵌入字體 IronPDF:字體的靈活性
渲染速度 0.8-1.2s通常 0.3-0.5s通常 Aspose:簡單HTML更快
記憶體使用 150-200MB (Chrome引擎) 80-120MB Aspose:較低的記憶體
Security & Encryption 加密等級 AES-256,自訂處理器 AES-256標準 兩者:業界標準
許可選項 15+細粒度許可 8個基本許可 IronPDF:更細緻的控制
API簡單性 單一SecuritySettings 需要多個類別 IronPDF:統一的方法
數位簽名 整合的,可視簽名 手動欄位建立 IronPDF:更簡單的簽名
憑證支援 PKCS#11,HSM支援 類似但需要更多設置 兩者:企業PKI
內容操作 編輯方法 真正的內容移除,單行API 基於標註,多步驟 IronPDF:合規就緒
編輯表現 1000頁︰~2分鐘 1000頁︰~6分鐘 IronPDF:快3倍
加水印 基於HTML/CSS,完整樣式 僅限文字印章,有限樣式 IronPDF:豐富的水印
加印 統一的加印類別 分別的印章型別 IronPDF:一致的API
批量操作 優化的並行處理 標準迴圈 IronPDF:快40%的批次
檔案轉換 DOCX到PDF 內建DocxToPdfRenderer 需要Aspose.Words ($1,199) IronPDF:無需額外成本
Excel支援 透過HTML/CSV渲染 需要Aspose.Cells ($1,199) IronPDF:包含的功能
PDF到HTML 支持樣式 支持,基本輸出 兩者:功能性
Markdown支持 透過HTML轉換 不支持 IronPDF:更多格式
性能指標 大型文件處理 1000頁/分鐘加水印 600頁/分鐘加水印 IronPDF:快40%
多執行緒支持 本機async/await優化 標準執行緒 IronPDF:更好的擴展性
記憶體效率 優化的快取 標準的記憶體使用 IronPDF:處理更大的批次
開發者體驗 程式碼範例 100多個即用範例 基本範例 IronPDF:豐富的資源
文件 教程,操作指南,影片 傳統的 API 文件 IronPDF:多重學習路徑
IntelliSense 完整的IntelliSense支持 標準支援 兩者:IDE整合
錯誤資訊 描述性,具可操作性 技術訊息 IronPDF:更好的除錯
Licensing & Pricing 入門級 Lite:$999(1位開發者,1個專案) 小型企業:從$1,199/年 (1 開發者,1 地點) IronPDF:更實惠的入門
團隊授權 Plus: $1,499 (3 開發者,3 個項目) OEM: $5,037 (1 開發者,無限地點) IronPDF:更好的團隊價值
Enterprise 專業:$2,399(10位開發者,10個專案) SDK: $33,580 (1 開發者,50 個部署) IronPDF:降低91%的成本
附加產品 包含於單一授權 需要單獨的授權 IronPDF:一價全包
再分發 +$2,399免版稅 包含但有限的部署 IronPDF:更清晰的條款
套件選項 Iron Suite:$2,998 (10 款產品) 無套件選項 IronPDF:卓越的價值
支援 是否包含支援 是,24/5工程支援 只限於論壇 (付費支援+$399/年) IronPDF:包含支援
回應時間 24-48小時典型 根據等級變化 IronPDF:可預測的SLA
支持渠道 電子郵件,聊天,電話,螢幕共享 論壇,付費電子郵件/電話 IronPDF:更多渠道
直接工程師存取 通過支援等級 IronPDF:專家幫助
特殊功能 條碼整合 通過HTML/JavaScript 沒有內建 IronPDF:條碼支援
QR碼支持 透過IronQR整合 需要自訂實施 IronPDF:內建QR碼
OCR功能 通過 IronOCR 整合 需要Aspose.OCR IronPDF:整合套件
列印優化 透過IronPrint整合 標準列印 IronPDF:高級列印
總成本(典型企業) PDF + DOCX + Excel $2,399 (專業) $5,037+ (多個產品) IronPDF:節省68%的成本
與套件選項 $2,998 (10 產品) 不可得 IronPDF:70% 的節省對比個體
最佳用途 用例 現代網頁應用、快速開發、注重成本的團隊 傳統系統,特定企業需求 IronPDF:大多數場景
團隊規模 1-10+開發者 擁有專用資源的大型企業 IronPDF:可擴展的授權
項目型別 SaaS,網頁應用,文件自動化 複雜的表單處理,XFA表單 依具體情況而定
注意。 比較反映截至2026年4月的.NET程式庫功能和定價。 價格如有變更,請在供應商網站上確認當前價格。 性能指標基於標準基準測試和典型企業文件工作負載。 Iron Suite定價提供了對所有Iron Software產品的單一授權。

提示我們的Aspose vs IronPDF特殊功能頁面捕捉了兩個程式庫提供的更豐富的見解。

PDF程式庫功能概述

IronPDF提供了一個專為.NET開發者工程設計的全面PDF程式庫,尋找有效的文件生成解決方案。 該程式庫擅長從HTML、ASPX和URL等多種來源建立、編輯和渲染PDF文件。

其強項在於對現代網頁標準(CSS3、HTML5和JavaScript)的原生支持,使得像素完美的PDF渲染可以用最小的配置完成。 該程式庫的架構優先考量開發者的體驗,透過簡潔的API內部處理複雜的操作。

Aspose.PDF for .NET作為一個成熟的文件處理API運作,能够複雜地操作PDF文件。 該程式庫使得開發者能夠在WinForms、WPF、ASP.NET和.NET Core應用中建立、修改和轉換PDF文件。

完全使用受控C#編寫的Aspose.PDF,強調了架構的靈活性和純性能,將自己定位於需要高級文件操作的企業應用,如複雜表單處理和文件組合。

跨平台能力如何比較?

IronPDF提供了無需額外包的原生跨平台相容性,無縫支援Windows、Linux、macOS、Docker、Azure和AWS環境。 程式庫通過其統一的程式碼庫維持平台間一致的行為,消除平台特定的實施。

Aspose.PDF的跨平台功能需要單獨的Aspose.Pdf.Drawing包,增加了部署場景的複雜性。 這一架構決策影響專案配置和依賴性管理,尤其在容器化的環境中。

IronPDF平台支持詳情

IronPDF的廣泛相容性矩陣包括:

  • .NET版本:全面支援.NET 10, 9, 8, 7, 6, 5, Core 3.1+和Framework 4.6.2+
  • 作業系統:Windows (7+), Linux (Ubuntu, Debian, CentOS), macOS (10+)
  • 雲端平台:原生Azure和AWS整合與優化性能
  • 容器支援:Docker映像提供預先配置的依賴性
  • 架構:x64, x86,ARM64 支援各平台

該程式庫的部署文件提供有關每個平台配置的詳細指導。

比較表:平台支援

平台特性 IronPDF Aspose.PDF 實施差異
.NET 8/9 支持 原生 需要Drawing包 IronPDF無需額外包
Linux 部署 內建 需要單獨的包 Aspose需要Aspose.Pdf.Drawing
Docker支援 官方映像 手動配置 IronPDF提供預建容器
Azure Functions 優化 支持 IronPDF包含Azure特定優化
macOS ARM64 原生 有限 IronPDF完全支持Apple Silicon

HTML到PDF轉換性能如何比較?

HTML到PDF轉換是一個網頁應用程式中的關鍵功能。 兩個程式庫以不同的方式處理這一挑戰,影響了程式碼的複雜性和輸出質量。

IronPDF內部運用完整的Chrome渲染引擎,確保JavaScript執行和響應式設計渲染完全匹配瀏覽器輸出。 Aspose.PDF使用其自己的HTML解析引擎,處理HTML方式與現代瀏覽器不同。

IronPDF HTML轉換範例

using IronPdf;

// Enable enhanced security for production environments
Installation.EnableWebSecurity = true;

// Initialize the Chrome-based renderer with custom options
var renderer = new ChromePdfRenderer()
{
    RenderingOptions = new ChromePdfRenderOptions()
    {
        MarginTop = 10,
        MarginBottom = 10,
        CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print,
        EnableJavaScript = true,
        WaitFor = new WaitFor()
        {
            // Wait for AJAX/animations to complete
            RenderDelay = 500
        }
    }
};

// Convert HTML string with full CSS3/JS support
var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
        <head>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto');
                body { font-family: 'Roboto', sans-serif; }
                .chart { width: 100%; height: 400px; }
            </style>
        </head>
        <body>
            <h1>Sales Report 2024</h1>
            <div class='chart' id='revenue-chart'></div>
            <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
            <script>
                // Complex JavaScript charts render perfectly
                new Chart(document.getElementById('revenue-chart'), {
                    type: 'bar',
                    data: { /* chart data */ }
                });
            </script>
        </body>
    </html>");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("sales-report.pdf");

// Convert existing web page with authentication
var advancedPdf = renderer.RenderUrlAsPdf("https://app.internal.com/reports", 
    new ChromePdfRenderOptions() 
    {
        CustomCookies = new Dictionary<string, string>() 
        {
            { "auth_token", "secure_token_value" }
        },
        // Capture background images and colors
        PrintHtmlBackgrounds = true
    });
using IronPdf;

// Enable enhanced security for production environments
Installation.EnableWebSecurity = true;

// Initialize the Chrome-based renderer with custom options
var renderer = new ChromePdfRenderer()
{
    RenderingOptions = new ChromePdfRenderOptions()
    {
        MarginTop = 10,
        MarginBottom = 10,
        CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print,
        EnableJavaScript = true,
        WaitFor = new WaitFor()
        {
            // Wait for AJAX/animations to complete
            RenderDelay = 500
        }
    }
};

// Convert HTML string with full CSS3/JS support
var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
        <head>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto');
                body { font-family: 'Roboto', sans-serif; }
                .chart { width: 100%; height: 400px; }
            </style>
        </head>
        <body>
            <h1>Sales Report 2024</h1>
            <div class='chart' id='revenue-chart'></div>
            <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
            <script>
                // Complex JavaScript charts render perfectly
                new Chart(document.getElementById('revenue-chart'), {
                    type: 'bar',
                    data: { /* chart data */ }
                });
            </script>
        </body>
    </html>");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("sales-report.pdf");

// Convert existing web page with authentication
var advancedPdf = renderer.RenderUrlAsPdf("https://app.internal.com/reports", 
    new ChromePdfRenderOptions() 
    {
        CustomCookies = new Dictionary<string, string>() 
        {
            { "auth_token", "secure_token_value" }
        },
        // Capture background images and colors
        PrintHtmlBackgrounds = true
    });
Imports IronPdf

' Enable enhanced security for production environments
Installation.EnableWebSecurity = True

' Initialize the Chrome-based renderer with custom options
Dim renderer = New ChromePdfRenderer() With {
	.RenderingOptions = New ChromePdfRenderOptions() With {
		.MarginTop = 10, .MarginBottom = 10, .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print, .EnableJavaScript = True, .WaitFor = New WaitFor() With {.RenderDelay = 500}
	}
}

' Convert HTML string with full CSS3/JS support
Dim pdf = renderer.RenderHtmlAsPdf("
    <html>
        <head>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto');
                body { font-family: 'Roboto', sans-serif; }
                .chart { width: 100%; height: 400px; }
            </style>
        </head>
        <body>
            <h1>Sales Report 2024</h1>
            <div class='chart' id='revenue-chart'></div>
            <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
            <script>
                // Complex JavaScript charts render perfectly
                new Chart(document.getElementById('revenue-chart'), {
                    type: 'bar',
                    data: { /* chart data */ }
                });
            </script>
        </body>
    </html>")

' Save with compression
pdf.CompressImages(90)
pdf.SaveAs("sales-report.pdf")

' Convert existing web page with authentication
Dim advancedPdf = renderer.RenderUrlAsPdf("https://app.internal.com/reports", New ChromePdfRenderOptions() With {
	.CustomCookies = New Dictionary(Of String, String)() From {
		{"auth_token", "secure_token_value"}
	},
	.PrintHtmlBackgrounds = True
})
$vbLabelText   $csharpLabel

ChromePdfRenderer類別提供了對渲染過程的廣泛控制,同時保持簡單。 WaitFor功能確保動態內容在轉換前完全載入,對於現代單頁應用程式至關重要。

Aspose.PDF HTML轉換範例

using Aspose.Pdf;
using Aspose.Pdf.Text;

// Create new document
Document document = new Document();
Page page = document.Pages.Add();

// Configure page settings
page.PageInfo.Width = 612;
page.PageInfo.Height = 792;
page.PageInfo.Margin = new MarginInfo(72, 72, 72, 72);

// Add HTML content - limited CSS support
HtmlFragment htmlFragment = new HtmlFragment(@"
    <h1 style='color: blue; font-size: 24pt'>Sales Report 2024</h1>
    <p>Quarterly revenue analysis...</p>
    <table border='1'>
        <tr><th>Quarter</th><th>Revenue</th></tr>
        <tr><td>Q1</td><td>$1.2M</td></tr>
    </table>");

// Basic rendering options
htmlFragment.HtmlLoadOptions = new HtmlLoadOptions()
{
    PageInfo = new PageInfo() { Width = 612, Height = 792 },
    // 有限 JavaScript support
    IsEmbedFonts = true
};

page.Paragraphs.Add(htmlFragment);

// For complex HTML, load from file
HtmlLoadOptions options = new HtmlLoadOptions("https://example.com");
options.PageInfo.IsLandscape = false;
Document htmlDoc = new Document("report.html", options);

// Merge with existing document
document.Pages.Add(htmlDoc.Pages);
document.Save("output.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Text;

// Create new document
Document document = new Document();
Page page = document.Pages.Add();

// Configure page settings
page.PageInfo.Width = 612;
page.PageInfo.Height = 792;
page.PageInfo.Margin = new MarginInfo(72, 72, 72, 72);

// Add HTML content - limited CSS support
HtmlFragment htmlFragment = new HtmlFragment(@"
    <h1 style='color: blue; font-size: 24pt'>Sales Report 2024</h1>
    <p>Quarterly revenue analysis...</p>
    <table border='1'>
        <tr><th>Quarter</th><th>Revenue</th></tr>
        <tr><td>Q1</td><td>$1.2M</td></tr>
    </table>");

// Basic rendering options
htmlFragment.HtmlLoadOptions = new HtmlLoadOptions()
{
    PageInfo = new PageInfo() { Width = 612, Height = 792 },
    // 有限 JavaScript support
    IsEmbedFonts = true
};

page.Paragraphs.Add(htmlFragment);

// For complex HTML, load from file
HtmlLoadOptions options = new HtmlLoadOptions("https://example.com");
options.PageInfo.IsLandscape = false;
Document htmlDoc = new Document("report.html", options);

// Merge with existing document
document.Pages.Add(htmlDoc.Pages);
document.Save("output.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Text

' Create new document
Dim document As New Document()
Dim page As Page = document.Pages.Add()

' Configure page settings
page.PageInfo.Width = 612
page.PageInfo.Height = 792
page.PageInfo.Margin = New MarginInfo(72, 72, 72, 72)

' Add HTML content - limited CSS support
Dim htmlFragment As New HtmlFragment("
    <h1 style='color: blue; font-size: 24pt'>Sales Report 2024</h1>
    <p>Quarterly revenue analysis...</p>
    <table border='1'>
        <tr><th>Quarter</th><th>Revenue</th></tr>
        <tr><td>Q1</td><td>$1.2M</td></tr>
    </table>")

' Basic rendering options
htmlFragment.HtmlLoadOptions = New HtmlLoadOptions() With {
    .PageInfo = New PageInfo() With {.Width = 612, .Height = 792},
    .IsEmbedFonts = True
}

page.Paragraphs.Add(htmlFragment)

' For complex HTML, load from file
Dim options As New HtmlLoadOptions("https://example.com")
options.PageInfo.IsLandscape = False
Dim htmlDoc As New Document("report.html", options)

' Merge with existing document
document.Pages.Add(htmlDoc.Pages)
document.Save("output.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF的HTML處理需要手動設置頁面,並提供有限的CSS3支援。 HtmlFragment類別處理基本的HTML,但缺乏現代網頁功能,如flexbox和grid佈局——這些限制在Aspose的支援論壇中,多個使用者的報告中已被確認:flex和grid顯示樣式未按照預期轉換。 複雜的JavaScript執行也受到限制。 對於需要忠實轉換現代網頁設計(如Bootstrap 5佈局)的生產應用程式,可能需要額外的預處理或替代解決方案。

真實世界性能比拼

出現了關鍵的性能差異:

指標 IronPDF Aspose.PDF 影響
HTML/CSS保真度 98%+ 瀏覽器匹配 70-80% 近似度 視覺一致性
JavaScript支持 完整V8引擎 基本/有限 動態內容處理
渲染速度 0.8-1.2s通常 0.3-0.5s通常 Aspose對簡單HTML更快
記憶體使用 150-200MB 80-120MB IronPDF使用Chrome引擎
字體渲染 系統+網頁字體 僅嵌入字體 字體選項

PDF安全功能如何比較?

對於包含敏感資訊的PDF文件來說,安全性仍然至關重要。 兩個程式庫都提供加密功能,但其實施方法和功能集大不相同。

IronPDF加密實施

using IronPdf;
using IronPdf.Security;

// Load existing PDF or create new one
var pdf = PdfDocument.FromFile("financial-report.pdf");

// Configure comprehensive security settings
pdf.SecuritySettings = new SecuritySettings()
{
    UserPassword = "user_pwd_2024",
    OwnerPassword = "admin_pwd_2024",
    AllowUserCopyPasteContent = false,
    AllowUserEditing = IronPdf.Security.PdfEditSecurity.NoEdit,
    AllowUserFormData = false,
    AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint,
    AllowUserAnnotations = false,
    // Advanced encryption options
    EncryptionAlgorithm = IronPdf.Security.PdfEncryptionAlgorithm.AES256,
    UseStrongEncryption = true
};

// Apply digital restrictions
pdf.MetaData.Title = "Confidential Report";
pdf.MetaData.Author = "Finance Department";
pdf.MetaData.Keywords = "Internal Only, Q4 2024";
pdf.MetaData.ModifiedDate = DateTime.UtcNow;

// Advanced: Add custom security handler
pdf.SecuritySettings.CustomSecurityHandler = new CustomSecurityHandler()
{
    // Implement custom DRM or watermarking
    OnDocumentOpen = (doc) => LogAccess(doc),
    RequireTokenValidation = true
};

// Granular permission control
var permissions = new PdfPermissions()
{
    AllowAccessibilityExtractContent = true, // Screen readers
    AllowAssembleDocument = false,
    AllowExtractContentForAccessibility = true,
    AllowFillForms = false,
    AllowFullQualityPrint = false,
    AllowModifyAnnotations = false,
    AllowModifyContents = false,
    AllowPrint = false
};

pdf.ApplySecuritySettings(permissions);
pdf.SaveAs("secured-report.pdf");
using IronPdf;
using IronPdf.Security;

// Load existing PDF or create new one
var pdf = PdfDocument.FromFile("financial-report.pdf");

// Configure comprehensive security settings
pdf.SecuritySettings = new SecuritySettings()
{
    UserPassword = "user_pwd_2024",
    OwnerPassword = "admin_pwd_2024",
    AllowUserCopyPasteContent = false,
    AllowUserEditing = IronPdf.Security.PdfEditSecurity.NoEdit,
    AllowUserFormData = false,
    AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint,
    AllowUserAnnotations = false,
    // Advanced encryption options
    EncryptionAlgorithm = IronPdf.Security.PdfEncryptionAlgorithm.AES256,
    UseStrongEncryption = true
};

// Apply digital restrictions
pdf.MetaData.Title = "Confidential Report";
pdf.MetaData.Author = "Finance Department";
pdf.MetaData.Keywords = "Internal Only, Q4 2024";
pdf.MetaData.ModifiedDate = DateTime.UtcNow;

// Advanced: Add custom security handler
pdf.SecuritySettings.CustomSecurityHandler = new CustomSecurityHandler()
{
    // Implement custom DRM or watermarking
    OnDocumentOpen = (doc) => LogAccess(doc),
    RequireTokenValidation = true
};

// Granular permission control
var permissions = new PdfPermissions()
{
    AllowAccessibilityExtractContent = true, // Screen readers
    AllowAssembleDocument = false,
    AllowExtractContentForAccessibility = true,
    AllowFillForms = false,
    AllowFullQualityPrint = false,
    AllowModifyAnnotations = false,
    AllowModifyContents = false,
    AllowPrint = false
};

pdf.ApplySecuritySettings(permissions);
pdf.SaveAs("secured-report.pdf");
Imports IronPdf
Imports IronPdf.Security

' Load existing PDF or create new one
Private pdf = PdfDocument.FromFile("financial-report.pdf")

' Configure comprehensive security settings
pdf.SecuritySettings = New SecuritySettings() With {
	.UserPassword = "user_pwd_2024",
	.OwnerPassword = "admin_pwd_2024",
	.AllowUserCopyPasteContent = False,
	.AllowUserEditing = IronPdf.Security.PdfEditSecurity.NoEdit,
	.AllowUserFormData = False,
	.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint,
	.AllowUserAnnotations = False,
	.EncryptionAlgorithm = IronPdf.Security.PdfEncryptionAlgorithm.AES256,
	.UseStrongEncryption = True
}

' Apply digital restrictions
pdf.MetaData.Title = "Confidential Report"
pdf.MetaData.Author = "Finance Department"
pdf.MetaData.Keywords = "Internal Only, Q4 2024"
pdf.MetaData.ModifiedDate = DateTime.UtcNow

' Advanced: Add custom security handler
pdf.SecuritySettings.CustomSecurityHandler = New CustomSecurityHandler() With {
	.OnDocumentOpen = Function(doc) LogAccess(doc),
	.RequireTokenValidation = True
}

' Granular permission control
Dim permissions = New PdfPermissions() With {
	.AllowAccessibilityExtractContent = True,
	.AllowAssembleDocument = False,
	.AllowExtractContentForAccessibility = True,
	.AllowFillForms = False,
	.AllowFullQualityPrint = False,
	.AllowModifyAnnotations = False,
	.AllowModifyContents = False,
	.AllowPrint = False
}

pdf.ApplySecuritySettings(permissions)
pdf.SaveAs("secured-report.pdf")
$vbLabelText   $csharpLabel

IronPDF的安全實施通過SecuritySettings類提供了細粒度的控制。 該API支持基於密碼和憑證的加密,具有自訂安全處理器選項,適用於企業DRM場景。

Aspose.PDF加密實施

using Aspose.Pdf;
using Aspose.Pdf.Facades;

// Load document
Document pdfDocument = new Document("financial-report.pdf");

// Basic encryption
pdfDocument.Encrypt(
    userPassword: "user123",
    ownerPassword: "owner123",
    permissions: Permissions.PrintDocument | Permissions.ModifyContent,
    cryptoAlgorithm: CryptoAlgorithm.AESx256
);

// Advanced security with certificates
using (PdfFileSecurity fileSecurity = new PdfFileSecurity())
{
    fileSecurity.BindPdf(pdfDocument);

    // Certificate-based encryption
    X509Certificate2 certificate = new X509Certificate2("recipient.cer");
    fileSecurity.EncryptFile(
        null, // No user password
        "owner_password",
        DocumentPrivilege.Print | DocumentPrivilege.Copy,
        KeySize.x256,
        Algorithm.AES,
        new X509Certificate2[] { certificate }
    );
}

// Set document restrictions
pdfDocument.Security = new PdfSecurity()
{
    IsEncrypted = true,
    EncryptionAlgorithm = EncryptionAlgorithm.AES_256,
    Permissions = AccessPermissions.ExtractContent | 
                  AccessPermissions.ExtractContentWithDisabilities
};

pdfDocument.Save("encrypted.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Facades;

// Load document
Document pdfDocument = new Document("financial-report.pdf");

// Basic encryption
pdfDocument.Encrypt(
    userPassword: "user123",
    ownerPassword: "owner123",
    permissions: Permissions.PrintDocument | Permissions.ModifyContent,
    cryptoAlgorithm: CryptoAlgorithm.AESx256
);

// Advanced security with certificates
using (PdfFileSecurity fileSecurity = new PdfFileSecurity())
{
    fileSecurity.BindPdf(pdfDocument);

    // Certificate-based encryption
    X509Certificate2 certificate = new X509Certificate2("recipient.cer");
    fileSecurity.EncryptFile(
        null, // No user password
        "owner_password",
        DocumentPrivilege.Print | DocumentPrivilege.Copy,
        KeySize.x256,
        Algorithm.AES,
        new X509Certificate2[] { certificate }
    );
}

// Set document restrictions
pdfDocument.Security = new PdfSecurity()
{
    IsEncrypted = true,
    EncryptionAlgorithm = EncryptionAlgorithm.AES_256,
    Permissions = AccessPermissions.ExtractContent | 
                  AccessPermissions.ExtractContentWithDisabilities
};

pdfDocument.Save("encrypted.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Facades

' Load document
Private pdfDocument As New Document("financial-report.pdf")

' Basic encryption
pdfDocument.Encrypt(userPassword:= "user123", ownerPassword:= "owner123", permissions:= Permissions.PrintDocument Or Permissions.ModifyContent, cryptoAlgorithm:= CryptoAlgorithm.AESx256)

' Advanced security with certificates
Using fileSecurity As New PdfFileSecurity()
	fileSecurity.BindPdf(pdfDocument)

	' Certificate-based encryption
	Dim certificate As New X509Certificate2("recipient.cer")
	fileSecurity.EncryptFile(Nothing, "owner_password", DocumentPrivilege.Print Or DocumentPrivilege.Copy, KeySize.x256, Algorithm.AES, New X509Certificate2() { certificate })
End Using

' Set document restrictions
pdfDocument.Security = New PdfSecurity() With {
	.IsEncrypted = True,
	.EncryptionAlgorithm = EncryptionAlgorithm.AES_256,
	.Permissions = AccessPermissions.ExtractContent Or AccessPermissions.ExtractContentWithDisabilities
}

pdfDocument.Save("encrypted.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF將基本加密與高級安全功能分開,需要PdfFileSecurity類來執行憑證操作。 雖然功能齊全,但API需要更多程式碼來達到與IronPDF統一的方法所能實現的等效安全配置。

安全功能比較矩陣

安全功能 IronPDF Aspose.PDF 備註
AES-256加密 內建 支持 兩者皆實行當前標準
憑證加密 原生API 透過Facades Aspose需要額外的類別
自訂安全處理器 可擴展 有限 IronPDF允許自訂DRM
供編輯工具 單行API 手動過程 IronPDF簡化合規性
數位簽名 整合 支持 兩者皆支持PKI基礎設施
許可細粒度 15+選項 8個選項 IronPDF提供更細緻的控制

PDF內容編輯功能如何比較?

內容編輯確保敏感資訊的永久移除,對於遵守GDPR和HIPAA等規定至關重要。 實施方法對於安全性和可用性有重大影響。

IronPDF編輯範例

using IronPdf;

// Load PDF containing sensitive data
PdfDocument pdf = PdfDocument.FromFile("medical-records.pdf");

// Simple redaction - removes all instances permanently
pdf.RedactTextOnAllPages("SSN: *", "XXX-XX-XXXX");
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b"); // Regex for SSN pattern

// Advanced redaction with options
var redactionOptions = new RedactionOptions()
{
    RedactionColor = Color.Black,
    RedactionOpacity = 1.0f,
    UseRegex = true,
    MatchCase = false,
    // Redact across form fields and annotations
    SearchInFormFields = true,
    SearchInAnnotations = true
};

// Redact specific pages with custom rendering
pdf.RedactTextOnPages("CONFIDENTIAL", 
    new[] { 0, 1, 5 }, // Page indices
    redactionOptions);

// Area-based redaction for images/signatures
pdf.RedactArea(new Rectangle(100, 100, 200, 50), 2); // Page 3

// Verify redaction (for compliance logging)
var redactionLog = pdf.GetRedactionLog();
Console.WriteLine($"Redacted {redactionLog.Count} items");

pdf.SaveAs("redacted-medical-records.pdf");
using IronPdf;

// Load PDF containing sensitive data
PdfDocument pdf = PdfDocument.FromFile("medical-records.pdf");

// Simple redaction - removes all instances permanently
pdf.RedactTextOnAllPages("SSN: *", "XXX-XX-XXXX");
pdf.RedactTextOnAllPages(@"\b\d{3}-\d{2}-\d{4}\b"); // Regex for SSN pattern

// Advanced redaction with options
var redactionOptions = new RedactionOptions()
{
    RedactionColor = Color.Black,
    RedactionOpacity = 1.0f,
    UseRegex = true,
    MatchCase = false,
    // Redact across form fields and annotations
    SearchInFormFields = true,
    SearchInAnnotations = true
};

// Redact specific pages with custom rendering
pdf.RedactTextOnPages("CONFIDENTIAL", 
    new[] { 0, 1, 5 }, // Page indices
    redactionOptions);

// Area-based redaction for images/signatures
pdf.RedactArea(new Rectangle(100, 100, 200, 50), 2); // Page 3

// Verify redaction (for compliance logging)
var redactionLog = pdf.GetRedactionLog();
Console.WriteLine($"Redacted {redactionLog.Count} items");

pdf.SaveAs("redacted-medical-records.pdf");
Imports IronPdf

' Load PDF containing sensitive data
Private pdf As PdfDocument = PdfDocument.FromFile("medical-records.pdf")

' Simple redaction - removes all instances permanently
pdf.RedactTextOnAllPages("SSN: *", "XXX-XX-XXXX")
pdf.RedactTextOnAllPages("\b\d{3}-\d{2}-\d{4}\b") ' Regex for SSN pattern

' Advanced redaction with options
Dim redactionOptions As New RedactionOptions() With {
	.RedactionColor = Color.Black,
	.RedactionOpacity = 1.0F,
	.UseRegex = True,
	.MatchCase = False,
	.SearchInFormFields = True,
	.SearchInAnnotations = True
}

' Redact specific pages with custom rendering
pdf.RedactTextOnPages("CONFIDENTIAL", { 0, 1, 5 }, redactionOptions)

' Area-based redaction for images/signatures
pdf.RedactArea(New Rectangle(100, 100, 200, 50), 2) ' Page 3

' Verify redaction (for compliance logging)
Dim redactionLog = pdf.GetRedactionLog()
Console.WriteLine($"Redacted {redactionLog.Count} items")

pdf.SaveAs("redacted-medical-records.pdf")
$vbLabelText   $csharpLabel

IronPDF的RedactTextOnAllPages()方法通過從PDF結構中永久移除內容,而不僅僅用黑框覆蓋,來實現真正的編輯。 編輯教程展示了合規準備的工作流程,包括審核追踪和基於區域的非文字內容編輯。

Aspose.PDF編輯範例

using Aspose.Pdf;
using Aspose.Pdf.Redaction;
using Aspose.Pdf.Text;

Document document = new Document("medical-records.pdf");

// Find text to redact
TextFragmentAbsorber textAbsorber = new TextFragmentAbsorber("CONFIDENTIAL");
textAbsorber.TextSearchOptions = new TextSearchOptions(true); // Regex enabled

// 手動 redaction process
foreach (Page page in document.Pages)
{
    page.Accept(textAbsorber);

    foreach (TextFragment textFragment in textAbsorber.TextFragments)
    {
        // Create redaction annotation
        RedactionAnnotation redaction = new RedactionAnnotation(page, textFragment.Rectangle)
        {
            FillColor = Color.Black,
            BorderColor = Color.Black,
            OverlayText = "[REDACTED]",
            TextAlignment = HorizontalAlignment.Center
        };

        page.Annotations.Add(redaction);

        // Apply redaction (makes it permanent)
        redaction.Redact();

        // 手動 text removal
        textFragment.Text = string.Empty;
    }
}

// Secondary pass for form fields
var formEditor = new Form(document);
foreach (Field field in document.Form.Fields)
{
    if (field.Value.Contains("SSN:"))
    {
        field.Value = "XXX-XX-XXXX";
        field.ReadOnly = true;
    }
}

document.Save("redacted.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Redaction;
using Aspose.Pdf.Text;

Document document = new Document("medical-records.pdf");

// Find text to redact
TextFragmentAbsorber textAbsorber = new TextFragmentAbsorber("CONFIDENTIAL");
textAbsorber.TextSearchOptions = new TextSearchOptions(true); // Regex enabled

// 手動 redaction process
foreach (Page page in document.Pages)
{
    page.Accept(textAbsorber);

    foreach (TextFragment textFragment in textAbsorber.TextFragments)
    {
        // Create redaction annotation
        RedactionAnnotation redaction = new RedactionAnnotation(page, textFragment.Rectangle)
        {
            FillColor = Color.Black,
            BorderColor = Color.Black,
            OverlayText = "[REDACTED]",
            TextAlignment = HorizontalAlignment.Center
        };

        page.Annotations.Add(redaction);

        // Apply redaction (makes it permanent)
        redaction.Redact();

        // 手動 text removal
        textFragment.Text = string.Empty;
    }
}

// Secondary pass for form fields
var formEditor = new Form(document);
foreach (Field field in document.Form.Fields)
{
    if (field.Value.Contains("SSN:"))
    {
        field.Value = "XXX-XX-XXXX";
        field.ReadOnly = true;
    }
}

document.Save("redacted.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Redaction
Imports Aspose.Pdf.Text

Dim document As New Document("medical-records.pdf")

' Find text to redact
Dim textAbsorber As New TextFragmentAbsorber("CONFIDENTIAL")
textAbsorber.TextSearchOptions = New TextSearchOptions(True) ' Regex enabled

' 手動 redaction process
For Each page As Page In document.Pages
    page.Accept(textAbsorber)

    For Each textFragment As TextFragment In textAbsorber.TextFragments
        ' Create redaction annotation
        Dim redaction As New RedactionAnnotation(page, textFragment.Rectangle) With {
            .FillColor = Color.Black,
            .BorderColor = Color.Black,
            .OverlayText = "[REDACTED]",
            .TextAlignment = HorizontalAlignment.Center
        }

        page.Annotations.Add(redaction)

        ' Apply redaction (makes it permanent)
        redaction.Redact()

        ' 手動 text removal
        textFragment.Text = String.Empty
    Next
Next

' Secondary pass for form fields
Dim formEditor As New Form(document)
For Each field As Field In document.Form.Fields
    If field.Value.Contains("SSN:") Then
        field.Value = "XXX-XX-XXXX"
        field.ReadOnly = True
    End If
Next

document.Save("redacted.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF的編輯需要手動文字搜尋、標註建立和明確的移除步驟。 雖然提供了控制,但這種方法增加了複雜性,並在合規性關鍵的場景中可能出錯。 多步驟過程還影響了大型文件的性能。

編輯能力分析

編輯方法的關鍵差異包括:

  • IronPDF:從PDF流中真正移除內容,自動模式匹配,單方法API
  • Aspose.PDF:基於標註的方法,要求手動定位文字,多步驟過程
  • 合規:IronPDF的方法符合NIST 指南的安全編輯
  • 性能:IronPDF處理1000頁文件的速度是其它的3倍,因為優化的算法

數位簽名功能如何比較?

數位簽名提供PDF文件的認證、完整性和防止否認。 實施的複雜性直接影響生產環境的採用。

IronPDF數位簽名範例

using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Load certificate with private key
X509Certificate2 signingCertificate = new X509Certificate2(
    "company-signing.pfx", 
    "cert_password",
    X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet
);

// Create signature with advanced options
var signature = new PdfSignature(signingCertificate)
{
    // Visual signature appearance
    SignatureImage = new PdfSignatureImage("signature.png", 100, 30),
    SignaturePosition = new Rectangle(400, 650, 150, 50),

    // Signature metadata
    ContactInformation = "legal@company.com",
    LocationDescription = "San Francisco, CA",
    SignatureReason = "Contract Approval",

    // Cryptographic options
    DigestMethod = DigestMethods.SHA256,
    TimeStampUrl = "http://timestamp.digicert.com"
};

// Load and sign document
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");

// Advanced: Multi-signature workflow
var signatureManager = pdf.SignatureManager;
if (signatureManager.HasPreviousSignatures)
{
    // 增量 signing preserves existing signatures
    signature.SigningMode = SigningMode.IncrementalUpdate;
}

// Apply signature with validation
var signResult = pdf.Sign(signature);

// Verify signature integrity
if (signResult.IsValid)
{
    Console.WriteLine($"Document signed at {signResult.SigningTime}");
    Console.WriteLine($"Certificate: {signResult.SignerCertificate.Subject}");
}

// Add document timestamp (no visual signature)
pdf.ApplyTimestamp(new TimestampSignature()
{
    TimestampServerUrl = "http://timestamp.com/odoca.com",
    Username = "api_user",
    Password = "api_key"
});

pdf.SaveAs("signed-contract.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Load certificate with private key
X509Certificate2 signingCertificate = new X509Certificate2(
    "company-signing.pfx", 
    "cert_password",
    X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet
);

// Create signature with advanced options
var signature = new PdfSignature(signingCertificate)
{
    // Visual signature appearance
    SignatureImage = new PdfSignatureImage("signature.png", 100, 30),
    SignaturePosition = new Rectangle(400, 650, 150, 50),

    // Signature metadata
    ContactInformation = "legal@company.com",
    LocationDescription = "San Francisco, CA",
    SignatureReason = "Contract Approval",

    // Cryptographic options
    DigestMethod = DigestMethods.SHA256,
    TimeStampUrl = "http://timestamp.digicert.com"
};

// Load and sign document
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");

// Advanced: Multi-signature workflow
var signatureManager = pdf.SignatureManager;
if (signatureManager.HasPreviousSignatures)
{
    // 增量 signing preserves existing signatures
    signature.SigningMode = SigningMode.IncrementalUpdate;
}

// Apply signature with validation
var signResult = pdf.Sign(signature);

// Verify signature integrity
if (signResult.IsValid)
{
    Console.WriteLine($"Document signed at {signResult.SigningTime}");
    Console.WriteLine($"Certificate: {signResult.SignerCertificate.Subject}");
}

// Add document timestamp (no visual signature)
pdf.ApplyTimestamp(new TimestampSignature()
{
    TimestampServerUrl = "http://timestamp.com/odoca.com",
    Username = "api_user",
    Password = "api_key"
});

pdf.SaveAs("signed-contract.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates

' Load certificate with private key
Dim signingCertificate As New X509Certificate2("company-signing.pfx", "cert_password", X509KeyStorageFlags.Exportable Or X509KeyStorageFlags.PersistKeySet)

' Create signature with advanced options
Dim signature As New PdfSignature(signingCertificate) With {
    ' Visual signature appearance
    .SignatureImage = New PdfSignatureImage("signature.png", 100, 30),
    .SignaturePosition = New Rectangle(400, 650, 150, 50),

    ' Signature metadata
    .ContactInformation = "legal@company.com",
    .LocationDescription = "San Francisco, CA",
    .SignatureReason = "Contract Approval",

    ' Cryptographic options
    .DigestMethod = DigestMethods.SHA256,
    .TimeStampUrl = "http://timestamp.digicert.com"
}

' Load and sign document
Dim pdf As PdfDocument = PdfDocument.FromFile("contract.pdf")

' Advanced: Multi-signature workflow
Dim signatureManager = pdf.SignatureManager
If signatureManager.HasPreviousSignatures Then
    ' 增量 signing preserves existing signatures
    signature.SigningMode = SigningMode.IncrementalUpdate
End If

' Apply signature with validation
Dim signResult = pdf.Sign(signature)

' Verify signature integrity
If signResult.IsValid Then
    Console.WriteLine($"Document signed at {signResult.SigningTime}")
    Console.WriteLine($"Certificate: {signResult.SignerCertificate.Subject}")
End If

' Add document timestamp (no visual signature)
pdf.ApplyTimestamp(New TimestampSignature() With {
    .TimestampServerUrl = "http://timestamp.com/odoca.com",
    .Username = "api_user",
    .Password = "api_key"
})

pdf.SaveAs("signed-contract.pdf")
$vbLabelText   $csharpLabel

IronPDF透過PdfSignature類簡化數位簽名,透明地處理憑證管理、外观、和加密操作。 簽名文件涵蓋了包括HSM整合和批量簽名工作流程等高級場景。

Aspose.PDF數位簽名範例

using Aspose.Pdf;
using Aspose.Pdf.Forms;
using Aspose.Pdf.Facades;
using System.Security.Cryptography.X509Certificates;

Document document = new Document("contract.pdf");

// Create signature field manually
SignatureField signatureField = new SignatureField(
    document.Pages[1], 
    new Rectangle(100, 650, 300, 700)
);
signatureField.PartialName = "SignatureField1";

// Configure PKCS7 signature
PKCS7 pkcs7 = new PKCS7(
    "company-signing.pfx",
    "cert_password"
);
pkcs7.Reason = "Contract Approval";
pkcs7.ContactInfo = "legal@company.com";
pkcs7.Location = "San Francisco, CA";
pkcs7.Date = DateTime.Now;

// Setup visual appearance
SignatureAppearance appearance = new SignatureAppearance()
{
    Foreground = System.Drawing.Color.Blue,
    Background = System.Drawing.Color.White,
    GraphicsMode = SignatureAppearance.GraphicsModeEnum.SignatureAndDescription
};

// 手動 signature application
using (PdfFileSignature pdfSign = new PdfFileSignature())
{
    pdfSign.BindPdf(document);

    // Configure signature rectangle
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(
        100, 650, 200, 50
    );

    // Sign with appearance
    pdfSign.Sign(1, // Page number
        "Approved by Legal Department",
        "legal@company.com",
        "San Francisco",
        true, // Visible
        rect,
        pkcs7);

    // Save incrementally
    pdfSign.Save("signed.pdf");
}

// Timestamp requires separate operation
PdfFileSignature timeStamp = new PdfFileSignature();
timeStamp.BindPdf("signed.pdf");
timeStamp.Timestamp(new TimestampSettings("http://tsa.example.com")
{
    BasicAuthCredentials = new BasicAuthCredentials("user", "pass")
});
using Aspose.Pdf;
using Aspose.Pdf.Forms;
using Aspose.Pdf.Facades;
using System.Security.Cryptography.X509Certificates;

Document document = new Document("contract.pdf");

// Create signature field manually
SignatureField signatureField = new SignatureField(
    document.Pages[1], 
    new Rectangle(100, 650, 300, 700)
);
signatureField.PartialName = "SignatureField1";

// Configure PKCS7 signature
PKCS7 pkcs7 = new PKCS7(
    "company-signing.pfx",
    "cert_password"
);
pkcs7.Reason = "Contract Approval";
pkcs7.ContactInfo = "legal@company.com";
pkcs7.Location = "San Francisco, CA";
pkcs7.Date = DateTime.Now;

// Setup visual appearance
SignatureAppearance appearance = new SignatureAppearance()
{
    Foreground = System.Drawing.Color.Blue,
    Background = System.Drawing.Color.White,
    GraphicsMode = SignatureAppearance.GraphicsModeEnum.SignatureAndDescription
};

// 手動 signature application
using (PdfFileSignature pdfSign = new PdfFileSignature())
{
    pdfSign.BindPdf(document);

    // Configure signature rectangle
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(
        100, 650, 200, 50
    );

    // Sign with appearance
    pdfSign.Sign(1, // Page number
        "Approved by Legal Department",
        "legal@company.com",
        "San Francisco",
        true, // Visible
        rect,
        pkcs7);

    // Save incrementally
    pdfSign.Save("signed.pdf");
}

// Timestamp requires separate operation
PdfFileSignature timeStamp = new PdfFileSignature();
timeStamp.BindPdf("signed.pdf");
timeStamp.Timestamp(new TimestampSettings("http://tsa.example.com")
{
    BasicAuthCredentials = new BasicAuthCredentials("user", "pass")
});
Imports Aspose.Pdf
Imports Aspose.Pdf.Forms
Imports Aspose.Pdf.Facades
Imports System.Security.Cryptography.X509Certificates

Dim document As New Document("contract.pdf")

' Create signature field manually
Dim signatureField As New SignatureField(document.Pages(1), New Rectangle(100, 650, 300, 700))
signatureField.PartialName = "SignatureField1"

' Configure PKCS7 signature
Dim pkcs7 As New PKCS7("company-signing.pfx", "cert_password")
pkcs7.Reason = "Contract Approval"
pkcs7.ContactInfo = "legal@company.com"
pkcs7.Location = "San Francisco, CA"
pkcs7.Date = DateTime.Now

' Setup visual appearance
Dim appearance As New SignatureAppearance() With {
    .Foreground = System.Drawing.Color.Blue,
    .Background = System.Drawing.Color.White,
    .GraphicsMode = SignatureAppearance.GraphicsModeEnum.SignatureAndDescription
}

' 手動 signature application
Using pdfSign As New PdfFileSignature()
    pdfSign.BindPdf(document)

    ' Configure signature rectangle
    Dim rect As New System.Drawing.Rectangle(100, 650, 200, 50)

    ' Sign with appearance
    pdfSign.Sign(1, ' Page number
                 "Approved by Legal Department",
                 "legal@company.com",
                 "San Francisco",
                 True, ' Visible
                 rect,
                 pkcs7)

    ' Save incrementally
    pdfSign.Save("signed.pdf")
End Using

' Timestamp requires separate operation
Dim timeStamp As New PdfFileSignature()
timeStamp.BindPdf("signed.pdf")
timeStamp.Timestamp(New TimestampSettings("http://tsa.example.com") With {
    .BasicAuthCredentials = New BasicAuthCredentials("user", "pass")
})
$vbLabelText   $csharpLabel

Aspose.PDF要求手動建立簽名場及多個類進行簽名操作。 之間的分離PdfFileSignature 增加了標準簽名工作流程的複雜性。

數位簽名功能矩陣

功能 IronPDF Aspose.PDF 實施影響
可見簽名 內建 手動設置 IronPDF需要較少程式碼
不可見簽名 支持 支持 兩者皆以認證
多簽名 增量 手動追踪 IronPDF自動保存
時間戳伺服器 整合 獨立API IronPDF的統一方法
HSM支持 通過PKCS#11 自訂供應商 兩者均支持硬體密鑰
LTV(長期) 自動 手動配置 IronPDF簡化合規性
批量簽名 優化 標準迴圈 IronPDF對於批量快5倍

加水印功能如何比較?

加水印保護智慧財產權,並確保文件可追踪性。 實施方法影響了視覺質量和性能。

IronPDF加水印範例

using IronPdf;
using IronPdf.Editing;

// Create renderer for new PDFs
var renderer = new ChromePdfRenderer();

// Generate PDF from URL
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/features/");

// HTML/CSS watermark with transparency and rotation
pdf.ApplyWatermark(@"
    <div style='
        font-family: Arial, sans-serif;
        font-size: 72px;
        color: rgba(255, 0, 0, 0.3);
        transform: rotate(-45deg);
        text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
    '>
        CONFIDENTIAL
    </div>",
    rotation: 45,
    opacity: 30,
    verticalAlignment: VerticalAlignment.Middle,
    horizontalAlignment: HorizontalAlignment.Center
);

// Advanced watermark with dynamic content
string dynamicWatermark = $@"
    <div style='text-align: center; font-family: Georgia;'>
        <img src='data:image/png;base64,{logoBase64}' width='100' 
             style='opacity: 0.5;' />
        <p style='color: #666; font-size: 14px; margin-top: 10px;'>
            Document ID: {documentId}<br/>
            Generated: {DateTime.Now:yyyy-MM-dd HH:mm}<br/>
            User: {currentUser}
        </p>
    </div>";

// Apply to specific pages with custom positioning
pdf.ApplyWatermark(dynamicWatermark,
    pageIndexes: new[] { 0, 2, 4 }, // First, third, fifth pages
    rotation: 0,
    opacity: 50,
    verticalOffset: -100, // 100px from center
    horizontalOffset: 200
);

// Background watermark (behind content)
var backgroundWatermark = new HtmlStamper()
{
    Html = "<h1 style='color: #f0f0f0; font-size: 120px;'>DRAFT</h1>",
    Opacity = 10,
    IsStampBehindContent = true,
    VerticalAlignment = VerticalAlignment.Middle,
    HorizontalAlignment = HorizontalAlignment.Center
};

pdf.ApplyStamp(backgroundWatermark);

// Batch watermarking with performance optimization
var options = new WatermarkOptions()
{
    UseParallelProcessing = true,
    CacheWatermarkImage = true
};

foreach (var page in pdf.Pages)
{
    page.ApplyWatermark("© 2024 Company Name", options);
}

pdf.SaveAs("watermarked-document.pdf");
using IronPdf;
using IronPdf.Editing;

// Create renderer for new PDFs
var renderer = new ChromePdfRenderer();

// Generate PDF from URL
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/features/");

// HTML/CSS watermark with transparency and rotation
pdf.ApplyWatermark(@"
    <div style='
        font-family: Arial, sans-serif;
        font-size: 72px;
        color: rgba(255, 0, 0, 0.3);
        transform: rotate(-45deg);
        text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
    '>
        CONFIDENTIAL
    </div>",
    rotation: 45,
    opacity: 30,
    verticalAlignment: VerticalAlignment.Middle,
    horizontalAlignment: HorizontalAlignment.Center
);

// Advanced watermark with dynamic content
string dynamicWatermark = $@"
    <div style='text-align: center; font-family: Georgia;'>
        <img src='data:image/png;base64,{logoBase64}' width='100' 
             style='opacity: 0.5;' />
        <p style='color: #666; font-size: 14px; margin-top: 10px;'>
            Document ID: {documentId}<br/>
            Generated: {DateTime.Now:yyyy-MM-dd HH:mm}<br/>
            User: {currentUser}
        </p>
    </div>";

// Apply to specific pages with custom positioning
pdf.ApplyWatermark(dynamicWatermark,
    pageIndexes: new[] { 0, 2, 4 }, // First, third, fifth pages
    rotation: 0,
    opacity: 50,
    verticalOffset: -100, // 100px from center
    horizontalOffset: 200
);

// Background watermark (behind content)
var backgroundWatermark = new HtmlStamper()
{
    Html = "<h1 style='color: #f0f0f0; font-size: 120px;'>DRAFT</h1>",
    Opacity = 10,
    IsStampBehindContent = true,
    VerticalAlignment = VerticalAlignment.Middle,
    HorizontalAlignment = HorizontalAlignment.Center
};

pdf.ApplyStamp(backgroundWatermark);

// Batch watermarking with performance optimization
var options = new WatermarkOptions()
{
    UseParallelProcessing = true,
    CacheWatermarkImage = true
};

foreach (var page in pdf.Pages)
{
    page.ApplyWatermark("© 2024 Company Name", options);
}

pdf.SaveAs("watermarked-document.pdf");
Imports IronPdf
Imports IronPdf.Editing

' Create renderer for new PDFs
Private renderer = New ChromePdfRenderer()

' Generate PDF from URL
Private pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/features/")

' HTML/CSS watermark with transparency and rotation
pdf.ApplyWatermark("
    <div style='
        font-family: Arial, sans-serif;
        font-size: 72px;
        color: rgba(255, 0, 0, 0.3);
        transform: rotate(-45deg);
        text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
    '>
        CONFIDENTIAL
    </div>", rotation:= 45, opacity:= 30, verticalAlignment:= VerticalAlignment.Middle, horizontalAlignment:= HorizontalAlignment.Center)

' Advanced watermark with dynamic content
Dim dynamicWatermark As String = $"
    <div style='text-align: center; font-family: Georgia;'>
        <img src='data:image/png;base64,{logoBase64}' width='100' 
             style='opacity: 0.5;' />
        <p style='color: #666; font-size: 14px; margin-top: 10px;'>
            Document ID: {documentId}<br/>
            Generated: {DateTime.Now:yyyy-MM-dd HH:mm}<br/>
            User: {currentUser}
        </p>
    </div>"

' Apply to specific pages with custom positioning
pdf.ApplyWatermark(dynamicWatermark, pageIndexes:= { 0, 2, 4 }, rotation:= 0, opacity:= 50, verticalOffset:= -100, horizontalOffset:= 200)

' Background watermark (behind content)
Dim backgroundWatermark = New HtmlStamper() With {
	.Html = "<h1 style='color: #f0f0f0; font-size: 120px;'>DRAFT</h1>",
	.Opacity = 10,
	.IsStampBehindContent = True,
	.VerticalAlignment = VerticalAlignment.Middle,
	.HorizontalAlignment = HorizontalAlignment.Center
}

pdf.ApplyStamp(backgroundWatermark)

' Batch watermarking with performance optimization
Dim options = New WatermarkOptions() With {
	.UseParallelProcessing = True,
	.CacheWatermarkImage = True
}

For Each page In pdf.Pages
	page.ApplyWatermark("© 2024 Company Name", options)
Next page

pdf.SaveAs("watermarked-document.pdf")
$vbLabelText   $csharpLabel

IronPDF的加水印利用完整的HTML/CSS渲染,允許複雜的設計包括漸變、陰影和響應式佈局。 加水印範例展示了如QR碼水印和動態內容注入等高級技術。

Aspose.PDF加水印範例

using Aspose.Pdf;
using Aspose.Pdf.Text;

Document document = new Document("input.pdf");

// Text stamp as watermark
TextStamp textStamp = new TextStamp("CONFIDENTIAL")
{
    Background = true, // Behind content
    Opacity = 0.3,
    TextAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
    RotateAngle = 45,
    TextState = new TextState()
    {
        Font = FontRepository.FindFont("Arial"),
        FontSize = 72,
        ForegroundColor = Color.Red,
        FontStyle = FontStyles.Bold
    }
};

// Apply to all pages
foreach (Page page in document.Pages)
{
    page.AddStamp(textStamp);
}

// Image watermark
ImageStamp imageStamp = new ImageStamp("logo.png")
{
    Background = true,
    Opacity = 0.2,
    Width = 200,
    Height = 100,
    XIndent = page.PageInfo.Width / 2 - 100,
    YIndent = page.PageInfo.Height / 2 - 50
};

// Artifact-based watermark (PDF/A compliant)
WatermarkArtifact watermark = new WatermarkArtifact();
watermark.SetText("SAMPLE");
watermark.ArtifactHorizontalAlignment = HorizontalAlignment.Center;
watermark.ArtifactVerticalAlignment = VerticalAlignment.Center;
watermark.Rotation = 45;
watermark.Opacity = 0.5;
watermark.IsBackground = true;

// Complex positioning requires calculation
foreach (Page page in document.Pages)
{
    // 手動 centering
    double pageWidth = page.PageInfo.Width;
    double pageHeight = page.PageInfo.Height;

    TextStamp positionedStamp = new TextStamp("Page " + page.Number)
    {
        XIndent = pageWidth - 100,
        YIndent = 20,
        TextState = new TextState()
        {
            FontSize = 10,
            ForegroundColor = Color.Gray
        }
    };

    page.AddStamp(positionedStamp);
}

document.Save("watermarked.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Text;

Document document = new Document("input.pdf");

// Text stamp as watermark
TextStamp textStamp = new TextStamp("CONFIDENTIAL")
{
    Background = true, // Behind content
    Opacity = 0.3,
    TextAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
    RotateAngle = 45,
    TextState = new TextState()
    {
        Font = FontRepository.FindFont("Arial"),
        FontSize = 72,
        ForegroundColor = Color.Red,
        FontStyle = FontStyles.Bold
    }
};

// Apply to all pages
foreach (Page page in document.Pages)
{
    page.AddStamp(textStamp);
}

// Image watermark
ImageStamp imageStamp = new ImageStamp("logo.png")
{
    Background = true,
    Opacity = 0.2,
    Width = 200,
    Height = 100,
    XIndent = page.PageInfo.Width / 2 - 100,
    YIndent = page.PageInfo.Height / 2 - 50
};

// Artifact-based watermark (PDF/A compliant)
WatermarkArtifact watermark = new WatermarkArtifact();
watermark.SetText("SAMPLE");
watermark.ArtifactHorizontalAlignment = HorizontalAlignment.Center;
watermark.ArtifactVerticalAlignment = VerticalAlignment.Center;
watermark.Rotation = 45;
watermark.Opacity = 0.5;
watermark.IsBackground = true;

// Complex positioning requires calculation
foreach (Page page in document.Pages)
{
    // 手動 centering
    double pageWidth = page.PageInfo.Width;
    double pageHeight = page.PageInfo.Height;

    TextStamp positionedStamp = new TextStamp("Page " + page.Number)
    {
        XIndent = pageWidth - 100,
        YIndent = 20,
        TextState = new TextState()
        {
            FontSize = 10,
            ForegroundColor = Color.Gray
        }
    };

    page.AddStamp(positionedStamp);
}

document.Save("watermarked.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Text

Dim document As New Document("input.pdf")

' Text stamp as watermark
Dim textStamp As New TextStamp("CONFIDENTIAL") With {
    .Background = True, ' Behind content
    .Opacity = 0.3,
    .TextAlignment = HorizontalAlignment.Center,
    .VerticalAlignment = VerticalAlignment.Center,
    .RotateAngle = 45,
    .TextState = New TextState() With {
        .Font = FontRepository.FindFont("Arial"),
        .FontSize = 72,
        .ForegroundColor = Color.Red,
        .FontStyle = FontStyles.Bold
    }
}

' Apply to all pages
For Each page As Page In document.Pages
    page.AddStamp(textStamp)
Next

' Image watermark
Dim imageStamp As New ImageStamp("logo.png") With {
    .Background = True,
    .Opacity = 0.2,
    .Width = 200,
    .Height = 100,
    .XIndent = page.PageInfo.Width / 2 - 100,
    .YIndent = page.PageInfo.Height / 2 - 50
}

' Artifact-based watermark (PDF/A compliant)
Dim watermark As New WatermarkArtifact()
watermark.SetText("SAMPLE")
watermark.ArtifactHorizontalAlignment = HorizontalAlignment.Center
watermark.ArtifactVerticalAlignment = VerticalAlignment.Center
watermark.Rotation = 45
watermark.Opacity = 0.5
watermark.IsBackground = True

' Complex positioning requires calculation
For Each page As Page In document.Pages
    ' Manual centering
    Dim pageWidth As Double = page.PageInfo.Width
    Dim pageHeight As Double = page.PageInfo.Height

    Dim positionedStamp As New TextStamp("Page " & page.Number) With {
        .XIndent = pageWidth - 100,
        .YIndent = 20,
        .TextState = New TextState() With {
            .FontSize = 10,
            .ForegroundColor = Color.Gray
        }
    }

    page.AddStamp(positionedStamp)
Next

document.Save("watermarked.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF的標記方法需要手動位置計算,缺乏複雜水印的原生HTML渲染。 WatermarkArtifact類的分離使得統一的加水印工作流程複雜化。

加水印性能分析

加水印的關鍵差異包括:

方面 IronPDF Aspose.PDF 真實世界的影響
HTML/CSS支持 全渲染 僅限文字/圖片 設計靈活性
批次性能 1000頁/分鐘 600頁/分鐘 IronPDF快40%
記憶體使用 優化的快取 標準 IronPDF處理更大的批次
動態內容 原生支持 手動組裝 更快的開發
透明度 Alpha通道 僅不透明度 更好的視覺效果

內容加印功能如何比較?

內容加印在PDF文件中新增頁眉、頁腳、頁碼以及其他重複元素。 實施效率直接影響文件生成工作流程。

IronPDF加印範例

using IronPdf;
using IronPdf.Editing;

// Load or create PDF
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report 2024</h1>");

// Advanced header with dynamic content
var headerStamper = new HtmlStamper()
{
    Html = @"
        <div style='display: flex; justify-content: space-between; 
                    align-items: center; width: 100%; padding: 10px;
                    border-bottom: 2px solid #333;'>
            <img src='logo.png' height='40' />
            <div style='text-align: center;'>
                <h3 style='margin: 0;'>{title}</h3>
                <p style='margin: 0; font-size: 10px;'>CONFIDENTIAL</p>
            </div>
            <div style='text-align: right; font-size: 10px;'>
                Page {page} of {total}<br/>
                {date}
            </div>
        </div>",
    VerticalAlignment = VerticalAlignment.Top,
    HorizontalAlignment = HorizontalAlignment.Center,
    Width = Unit.Percentage(100),
    Height = Unit.Millimeters(20)
};

// Apply with merge fields
pdf.ApplyStamp(headerStamper, new StampOptions()
{
    MergeFields = new Dictionary<string, string>()
    {
        { "title", "Financial Statement" },
        { "date", DateTime.Now.ToString("MMMM d, yyyy") }
    },
    PageNumbers = new[] { 1, 2, 3 } // Specific pages
});

// Text stamper with Google字體
TextStamper textStamper = new TextStamper()
{
    Text = "© 2024 IronPDF解決方案s",
    FontFamily = "Roboto",
    UseGoogleFont = true,
    FontSize = 12,
    TextColor = Color.FromArgb(100, 100, 100),
    VerticalAlignment = VerticalAlignment.Bottom,
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalOffset = Unit.Millimeters(10)
};

pdf.ApplyStamp(textStamper);

// Image stamper with precise positioning
ImageStamper logoStamper = new ImageStamper("qr-code.png")
{
    Width = Unit.Inches(1),
    Height = Unit.Inches(1),
    HorizontalAlignment = HorizontalAlignment.Right,
    VerticalAlignment = VerticalAlignment.Bottom,
    HorizontalOffset = Unit.Millimeters(-10),
    VerticalOffset = Unit.Millimeters(-10),
    Hyperlink = "https://ironpdf.com"
};

// Barcode stamper (using HTML5 canvas)
var barcodeStamper = new HtmlStamper()
{
    Html = @"
        <canvas id='barcode'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js'></script>
        <script>
            JsBarcode('#barcode', 'ISBN-978-3-16-148410-0', {
                format: 'code128',
                width: 2,
                height: 50
            });
        </script>",
    Width = Unit.Millimeters(60),
    Height = Unit.Millimeters(20)
};

// Apply all stamps with batch processing
pdf.ApplyMultipleStamps(new List<Stamper> 
{ 
    headerStamper, 
    textStamper, 
    logoStamper, 
    barcodeStamper 
});

// Page numbering with custom format
pdf.AddPageNumbers(new PageNumberOptions()
{
    Format = "Page {current} of {total}",
    Font = new FontOptions("Arial", 10),
    Position = PageNumberPosition.BottomCenter,
    StartNumber = 1,
    SkipPages = new[] { 0 } // Skip first page
});

pdf.SaveAs("stamped-report.pdf");
using IronPdf;
using IronPdf.Editing;

// Load or create PDF
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report 2024</h1>");

// Advanced header with dynamic content
var headerStamper = new HtmlStamper()
{
    Html = @"
        <div style='display: flex; justify-content: space-between; 
                    align-items: center; width: 100%; padding: 10px;
                    border-bottom: 2px solid #333;'>
            <img src='logo.png' height='40' />
            <div style='text-align: center;'>
                <h3 style='margin: 0;'>{title}</h3>
                <p style='margin: 0; font-size: 10px;'>CONFIDENTIAL</p>
            </div>
            <div style='text-align: right; font-size: 10px;'>
                Page {page} of {total}<br/>
                {date}
            </div>
        </div>",
    VerticalAlignment = VerticalAlignment.Top,
    HorizontalAlignment = HorizontalAlignment.Center,
    Width = Unit.Percentage(100),
    Height = Unit.Millimeters(20)
};

// Apply with merge fields
pdf.ApplyStamp(headerStamper, new StampOptions()
{
    MergeFields = new Dictionary<string, string>()
    {
        { "title", "Financial Statement" },
        { "date", DateTime.Now.ToString("MMMM d, yyyy") }
    },
    PageNumbers = new[] { 1, 2, 3 } // Specific pages
});

// Text stamper with Google字體
TextStamper textStamper = new TextStamper()
{
    Text = "© 2024 IronPDF解決方案s",
    FontFamily = "Roboto",
    UseGoogleFont = true,
    FontSize = 12,
    TextColor = Color.FromArgb(100, 100, 100),
    VerticalAlignment = VerticalAlignment.Bottom,
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalOffset = Unit.Millimeters(10)
};

pdf.ApplyStamp(textStamper);

// Image stamper with precise positioning
ImageStamper logoStamper = new ImageStamper("qr-code.png")
{
    Width = Unit.Inches(1),
    Height = Unit.Inches(1),
    HorizontalAlignment = HorizontalAlignment.Right,
    VerticalAlignment = VerticalAlignment.Bottom,
    HorizontalOffset = Unit.Millimeters(-10),
    VerticalOffset = Unit.Millimeters(-10),
    Hyperlink = "https://ironpdf.com"
};

// Barcode stamper (using HTML5 canvas)
var barcodeStamper = new HtmlStamper()
{
    Html = @"
        <canvas id='barcode'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js'></script>
        <script>
            JsBarcode('#barcode', 'ISBN-978-3-16-148410-0', {
                format: 'code128',
                width: 2,
                height: 50
            });
        </script>",
    Width = Unit.Millimeters(60),
    Height = Unit.Millimeters(20)
};

// Apply all stamps with batch processing
pdf.ApplyMultipleStamps(new List<Stamper> 
{ 
    headerStamper, 
    textStamper, 
    logoStamper, 
    barcodeStamper 
});

// Page numbering with custom format
pdf.AddPageNumbers(new PageNumberOptions()
{
    Format = "Page {current} of {total}",
    Font = new FontOptions("Arial", 10),
    Position = PageNumberPosition.BottomCenter,
    StartNumber = 1,
    SkipPages = new[] { 0 } // Skip first page
});

pdf.SaveAs("stamped-report.pdf");
Imports IronPdf
Imports IronPdf.Editing

' Load or create PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Annual Report 2024</h1>")

' Advanced header with dynamic content
Dim headerStamper As New HtmlStamper() With {
    .Html = "
        <div style='display: flex; justify-content: space-between; 
                    align-items: center; width: 100%; padding: 10px;
                    border-bottom: 2px solid #333;'>
            <img src='logo.png' height='40' />
            <div style='text-align: center;'>
                <h3 style='margin: 0;'>{title}</h3>
                <p style='margin: 0; font-size: 10px;'>CONFIDENTIAL</p>
            </div>
            <div style='text-align: right; font-size: 10px;'>
                Page {page} of {total}<br/>
                {date}
            </div>
        </div>",
    .VerticalAlignment = VerticalAlignment.Top,
    .HorizontalAlignment = HorizontalAlignment.Center,
    .Width = Unit.Percentage(100),
    .Height = Unit.Millimeters(20)
}

' Apply with merge fields
pdf.ApplyStamp(headerStamper, New StampOptions() With {
    .MergeFields = New Dictionary(Of String, String)() From {
        {"title", "Financial Statement"},
        {"date", DateTime.Now.ToString("MMMM d, yyyy")}
    },
    .PageNumbers = New Integer() {1, 2, 3} ' Specific pages
})

' Text stamper with Google字體
Dim textStamper As New TextStamper() With {
    .Text = "© 2024 IronPDF解決方案s",
    .FontFamily = "Roboto",
    .UseGoogleFont = True,
    .FontSize = 12,
    .TextColor = Color.FromArgb(100, 100, 100),
    .VerticalAlignment = VerticalAlignment.Bottom,
    .HorizontalAlignment = HorizontalAlignment.Center,
    .VerticalOffset = Unit.Millimeters(10)
}

pdf.ApplyStamp(textStamper)

' Image stamper with precise positioning
Dim logoStamper As New ImageStamper("qr-code.png") With {
    .Width = Unit.Inches(1),
    .Height = Unit.Inches(1),
    .HorizontalAlignment = HorizontalAlignment.Right,
    .VerticalAlignment = VerticalAlignment.Bottom,
    .HorizontalOffset = Unit.Millimeters(-10),
    .VerticalOffset = Unit.Millimeters(-10),
    .Hyperlink = "https://ironpdf.com"
}

' Barcode stamper (using HTML5 canvas)
Dim barcodeStamper As New HtmlStamper() With {
    .Html = "
        <canvas id='barcode'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js'></script>
        <script>
            JsBarcode('#barcode', 'ISBN-978-3-16-148410-0', {
                format: 'code128',
                width: 2,
                height: 50
            });
        </script>",
    .Width = Unit.Millimeters(60),
    .Height = Unit.Millimeters(20)
}

' Apply all stamps with batch processing
pdf.ApplyMultipleStamps(New List(Of Stamper) From {
    headerStamper,
    textStamper,
    logoStamper,
    barcodeStamper
})

' Page numbering with custom format
pdf.AddPageNumbers(New PageNumberOptions() With {
    .Format = "Page {current} of {total}",
    .Font = New FontOptions("Arial", 10),
    .Position = PageNumberPosition.BottomCenter,
    .StartNumber = 1,
    .SkipPages = New Integer() {0} ' Skip first page
})

pdf.SaveAs("stamped-report.pdf")
$vbLabelText   $csharpLabel

IronPDF的加印API透過多態Stamper類統一文字、圖片和HTML內容。 框架支持響應式佈局、合併欄位和動態內容生成。 高級功能包括條碼整合QR碼加印通過IronQR程式庫。

Aspose.PDF加印範例

using Aspose.Pdf;
using Aspose.Pdf.Text;

Document document = new Document("report.pdf");

// Header setup requires manual positioning
foreach (Page page in document.Pages)
{
    // Calculate positions
    double pageWidth = page.PageInfo.Width;
    double pageHeight = page.PageInfo.Height;

    // Company logo
    ImageStamp logoStamp = new ImageStamp("logo.png")
    {
        TopMargin = 10,
        HorizontalAlignment = HorizontalAlignment.Left,
        Width = 100,
        Height = 40
    };
    page.AddStamp(logoStamp);

    // Header text
    TextStamp headerText = new TextStamp("Annual Report 2024")
    {
        TopMargin = 20,
        HorizontalAlignment = HorizontalAlignment.Center,
        TextState = new TextState()
        {
            Font = FontRepository.FindFont("Arial"),
            FontSize = 16,
            FontStyle = FontStyles.Bold
        }
    };
    page.AddStamp(headerText);

    // Page numbers require string building
    TextStamp pageNumber = new TextStamp($"Page {document.Pages.IndexOf(page) + 1} of {document.Pages.Count}")
    {
        BottomMargin = 20,
        HorizontalAlignment = HorizontalAlignment.Center,
        TextState = new TextState()
        {
            FontSize = 10,
            ForegroundColor = Color.Gray
        }
    };
    page.AddStamp(pageNumber);
}

// Footer with multiple elements
TextFragment footerLeft = new TextFragment("© 2024 Company Name");
TextFragment footerRight = new TextFragment(DateTime.Now.ToString("MMMM d, yyyy"));

// 手動 positioning for footer elements
Table footerTable = new Table()
{
    ColumnWidths = "250 250"
};

Row footerRow = footerTable.Rows.Add();
footerRow.Cells.Add(footerLeft.Text);
footerRow.Cells.Add(footerRight.Text);
footerRow.Cells[1].Alignment = HorizontalAlignment.Right;

// Add to each page
foreach (Page page in document.Pages)
{
    page.Paragraphs.Add(footerTable);
}

// Barcode requires external library or manual drawing
// No built-in barcode support

document.Save("stamped.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Text;

Document document = new Document("report.pdf");

// Header setup requires manual positioning
foreach (Page page in document.Pages)
{
    // Calculate positions
    double pageWidth = page.PageInfo.Width;
    double pageHeight = page.PageInfo.Height;

    // Company logo
    ImageStamp logoStamp = new ImageStamp("logo.png")
    {
        TopMargin = 10,
        HorizontalAlignment = HorizontalAlignment.Left,
        Width = 100,
        Height = 40
    };
    page.AddStamp(logoStamp);

    // Header text
    TextStamp headerText = new TextStamp("Annual Report 2024")
    {
        TopMargin = 20,
        HorizontalAlignment = HorizontalAlignment.Center,
        TextState = new TextState()
        {
            Font = FontRepository.FindFont("Arial"),
            FontSize = 16,
            FontStyle = FontStyles.Bold
        }
    };
    page.AddStamp(headerText);

    // Page numbers require string building
    TextStamp pageNumber = new TextStamp($"Page {document.Pages.IndexOf(page) + 1} of {document.Pages.Count}")
    {
        BottomMargin = 20,
        HorizontalAlignment = HorizontalAlignment.Center,
        TextState = new TextState()
        {
            FontSize = 10,
            ForegroundColor = Color.Gray
        }
    };
    page.AddStamp(pageNumber);
}

// Footer with multiple elements
TextFragment footerLeft = new TextFragment("© 2024 Company Name");
TextFragment footerRight = new TextFragment(DateTime.Now.ToString("MMMM d, yyyy"));

// 手動 positioning for footer elements
Table footerTable = new Table()
{
    ColumnWidths = "250 250"
};

Row footerRow = footerTable.Rows.Add();
footerRow.Cells.Add(footerLeft.Text);
footerRow.Cells.Add(footerRight.Text);
footerRow.Cells[1].Alignment = HorizontalAlignment.Right;

// Add to each page
foreach (Page page in document.Pages)
{
    page.Paragraphs.Add(footerTable);
}

// Barcode requires external library or manual drawing
// No built-in barcode support

document.Save("stamped.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Text

Dim document As New Document("report.pdf")

' Header setup requires manual positioning
For Each page As Page In document.Pages
    ' Calculate positions
    Dim pageWidth As Double = page.PageInfo.Width
    Dim pageHeight As Double = page.PageInfo.Height

    ' Company logo
    Dim logoStamp As New ImageStamp("logo.png") With {
        .TopMargin = 10,
        .HorizontalAlignment = HorizontalAlignment.Left,
        .Width = 100,
        .Height = 40
    }
    page.AddStamp(logoStamp)

    ' Header text
    Dim headerText As New TextStamp("Annual Report 2024") With {
        .TopMargin = 20,
        .HorizontalAlignment = HorizontalAlignment.Center,
        .TextState = New TextState() With {
            .Font = FontRepository.FindFont("Arial"),
            .FontSize = 16,
            .FontStyle = FontStyles.Bold
        }
    }
    page.AddStamp(headerText)

    ' Page numbers require string building
    Dim pageNumber As New TextStamp($"Page {document.Pages.IndexOf(page) + 1} of {document.Pages.Count}") With {
        .BottomMargin = 20,
        .HorizontalAlignment = HorizontalAlignment.Center,
        .TextState = New TextState() With {
            .FontSize = 10,
            .ForegroundColor = Color.Gray
        }
    }
    page.AddStamp(pageNumber)
Next

' Footer with multiple elements
Dim footerLeft As New TextFragment("© 2024 Company Name")
Dim footerRight As New TextFragment(DateTime.Now.ToString("MMMM d, yyyy"))

' Manual positioning for footer elements
Dim footerTable As New Table() With {
    .ColumnWidths = "250 250"
}

Dim footerRow As Row = footerTable.Rows.Add()
footerRow.Cells.Add(footerLeft.Text)
footerRow.Cells.Add(footerRight.Text)
footerRow.Cells(1).Alignment = HorizontalAlignment.Right

' Add to each page
For Each page As Page In document.Pages
    page.Paragraphs.Add(footerTable)
Next

' Barcode requires external library or manual drawing
' No built-in barcode support

document.Save("stamped.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF的加印需要手動佈局計算,並缺乏統一的內容處理。 複雜的頁眉和頁腳需要自訂位置邏輯,增加了專業檔的開發時間。

加印能力比較

功能 IronPDF Aspose.PDF 開發者體驗
HTML頁眉/頁腳 原生 僅限文字 IronPDF支持豐富格式
動態內容 合併欄位 手動 簡化的變數替換
批量加印 優化 標準迴圈 大文件快3倍
條碼支持 透過HTML/JS 外部 IronPDF包含條碼渲染
響應式佈局 CSS Flexbox Fixed 現代佈局技術
Google字體 直接支持 僅限系統 增強的字體設計

文件格式轉換功能如何比較?

在文件處理工作流程中,格式之間的轉換是一個常見的需求。 每個程式庫的原生功能顯著影響項目架構。

IronPDF DOCX到PDF轉換

using IronPdf;

// Direct DOCX到PDF conversion
DocxToPdfRenderer docxRenderer = new DocxToPdfRenderer();

// Simple conversion with default settings
PdfDocument pdf = docxRenderer.RenderDocxAsPdf("proposal.docx");
pdf.SaveAs("proposal.pdf");

// Advanced conversion with options
var renderOptions = new DocxPdfRenderOptions()
{
    // Maintain document formatting
    PreserveFormFields = true,
    ConvertBookmarks = true,
    ConvertHyperlinks = true,

    // Page setup
    PaperSize = IronPdf.Rendering.PdfPaperSize.Letter,
    MarginTop = 25,
    MarginBottom = 25,

    // Quality settings
    ImageQuality = 90,
    EnableJavaScript = false // Disable for static documents
};

// Batch conversion with progress tracking
var docxFiles = Directory.GetFiles("contracts/", "*.docx");
var conversionTasks = new List<Task<PdfDocument>>();

foreach (var docxFile in docxFiles)
{
    var task = Task.Run(() =>
    {
        var renderer = new DocxToPdfRenderer();
        return renderer.RenderDocxAsPdf(docxFile, renderOptions);
    });
    conversionTasks.Add(task);
}

// Await all conversions
var pdfDocuments = await Task.WhenAll(conversionTasks);

// Merge into single PDF
var mergedPdf = PdfDocument.Merge(pdfDocuments);
mergedPdf.SaveAs("all-contracts.pdf");

// Convert with embedded resources
var complexDocx = docxRenderer.RenderDocxAsPdf("report-with-images.docx");
complexDocx.CompressImages(80); // Optimize file size
complexDocx.SaveAs("compressed-report.pdf");
using IronPdf;

// Direct DOCX到PDF conversion
DocxToPdfRenderer docxRenderer = new DocxToPdfRenderer();

// Simple conversion with default settings
PdfDocument pdf = docxRenderer.RenderDocxAsPdf("proposal.docx");
pdf.SaveAs("proposal.pdf");

// Advanced conversion with options
var renderOptions = new DocxPdfRenderOptions()
{
    // Maintain document formatting
    PreserveFormFields = true,
    ConvertBookmarks = true,
    ConvertHyperlinks = true,

    // Page setup
    PaperSize = IronPdf.Rendering.PdfPaperSize.Letter,
    MarginTop = 25,
    MarginBottom = 25,

    // Quality settings
    ImageQuality = 90,
    EnableJavaScript = false // Disable for static documents
};

// Batch conversion with progress tracking
var docxFiles = Directory.GetFiles("contracts/", "*.docx");
var conversionTasks = new List<Task<PdfDocument>>();

foreach (var docxFile in docxFiles)
{
    var task = Task.Run(() =>
    {
        var renderer = new DocxToPdfRenderer();
        return renderer.RenderDocxAsPdf(docxFile, renderOptions);
    });
    conversionTasks.Add(task);
}

// Await all conversions
var pdfDocuments = await Task.WhenAll(conversionTasks);

// Merge into single PDF
var mergedPdf = PdfDocument.Merge(pdfDocuments);
mergedPdf.SaveAs("all-contracts.pdf");

// Convert with embedded resources
var complexDocx = docxRenderer.RenderDocxAsPdf("report-with-images.docx");
complexDocx.CompressImages(80); // Optimize file size
complexDocx.SaveAs("compressed-report.pdf");
Imports IronPdf
Imports System.IO
Imports System.Threading.Tasks

' Direct DOCX to PDF conversion
Dim docxRenderer As New DocxToPdfRenderer()

' Simple conversion with default settings
Dim pdf As PdfDocument = docxRenderer.RenderDocxAsPdf("proposal.docx")
pdf.SaveAs("proposal.pdf")

' Advanced conversion with options
Dim renderOptions As New DocxPdfRenderOptions() With {
    .PreserveFormFields = True,
    .ConvertBookmarks = True,
    .ConvertHyperlinks = True,
    .PaperSize = IronPdf.Rendering.PdfPaperSize.Letter,
    .MarginTop = 25,
    .MarginBottom = 25,
    .ImageQuality = 90,
    .EnableJavaScript = False
}

' Batch conversion with progress tracking
Dim docxFiles = Directory.GetFiles("contracts/", "*.docx")
Dim conversionTasks As New List(Of Task(Of PdfDocument))()

For Each docxFile In docxFiles
    Dim task = Task.Run(Function()
                            Dim renderer As New DocxToPdfRenderer()
                            Return renderer.RenderDocxAsPdf(docxFile, renderOptions)
                        End Function)
    conversionTasks.Add(task)
Next

' Await all conversions
Dim pdfDocuments = Await Task.WhenAll(conversionTasks)

' Merge into single PDF
Dim mergedPdf = PdfDocument.Merge(pdfDocuments)
mergedPdf.SaveAs("all-contracts.pdf")

' Convert with embedded resources
Dim complexDocx = docxRenderer.RenderDocxAsPdf("report-with-images.docx")
complexDocx.CompressImages(80) ' Optimize file size
complexDocx.SaveAs("compressed-report.pdf")
$vbLabelText   $csharpLabel

IronPDF透過DocxToPdfRenderer類包含了原生的DOCX支持,消除了外部依賴。 轉換保留了格式、圖片、表格和文件結構。 DOCX轉換文件涵蓋了包括郵件合併和範本處理等高級場景。

Aspose.PDF文件轉換方法

using Aspose.Words; // Required additional package
using Aspose.Words.Saving;
using Aspose.Pdf;

// DOCX conversion requires Aspose.Words
Document wordDoc = new Document("proposal.docx");

// Convert to PDF via Aspose.Words
MemoryStream pdfStream = new MemoryStream();
wordDoc.Save(pdfStream, SaveFormat.Pdf);

// Load into Aspose.PDF for further processing
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(pdfStream);

// Now can use Aspose.PDF features
pdfDoc.Encrypt("user", "owner", 
    Aspose.Pdf.Permissions.PrintDocument, 
    Aspose.Pdf.CryptoAlgorithm.AESx256);

pdfDoc.Save("encrypted-proposal.pdf");

// Excel conversion requires Aspose.Cells
// PowerPoint requires Aspose.Slides
// Each format needs separate license and API

// PDF to other formats
var pdfConverter = new Aspose.Pdf.Document("input.pdf");

// Convert to Word (limited fidelity)
DocSaveOptions saveOptions = new DocSaveOptions()
{
    Format = DocSaveOptions.DocFormat.DocX,
    Mode = DocSaveOptions.RecognitionMode.Flow
};
pdfConverter.Save("output.docx", saveOptions);

// Convert to HTML
HtmlSaveOptions htmlOptions = new HtmlSaveOptions()
{
    SplitIntoPages = true,
    SplitCssIntoPages = false,
    CustomCssSavingStrategy = new HtmlSaveOptions.CssSavingStrategy(CssSavingStrategy)
};
pdfConverter.Save("output.html", htmlOptions);
using Aspose.Words; // Required additional package
using Aspose.Words.Saving;
using Aspose.Pdf;

// DOCX conversion requires Aspose.Words
Document wordDoc = new Document("proposal.docx");

// Convert to PDF via Aspose.Words
MemoryStream pdfStream = new MemoryStream();
wordDoc.Save(pdfStream, SaveFormat.Pdf);

// Load into Aspose.PDF for further processing
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(pdfStream);

// Now can use Aspose.PDF features
pdfDoc.Encrypt("user", "owner", 
    Aspose.Pdf.Permissions.PrintDocument, 
    Aspose.Pdf.CryptoAlgorithm.AESx256);

pdfDoc.Save("encrypted-proposal.pdf");

// Excel conversion requires Aspose.Cells
// PowerPoint requires Aspose.Slides
// Each format needs separate license and API

// PDF to other formats
var pdfConverter = new Aspose.Pdf.Document("input.pdf");

// Convert to Word (limited fidelity)
DocSaveOptions saveOptions = new DocSaveOptions()
{
    Format = DocSaveOptions.DocFormat.DocX,
    Mode = DocSaveOptions.RecognitionMode.Flow
};
pdfConverter.Save("output.docx", saveOptions);

// Convert to HTML
HtmlSaveOptions htmlOptions = new HtmlSaveOptions()
{
    SplitIntoPages = true,
    SplitCssIntoPages = false,
    CustomCssSavingStrategy = new HtmlSaveOptions.CssSavingStrategy(CssSavingStrategy)
};
pdfConverter.Save("output.html", htmlOptions);
Imports Aspose.Words ' Required additional package
Imports Aspose.Words.Saving
Imports Aspose.Pdf

' DOCX conversion requires Aspose.Words
Private wordDoc As New Document("proposal.docx")

' Convert to PDF via Aspose.Words
Private pdfStream As New MemoryStream()
wordDoc.Save(pdfStream, SaveFormat.Pdf)

' Load into Aspose.PDF for further processing
Dim pdfDoc As New Aspose.Pdf.Document(pdfStream)

' Now can use Aspose.PDF features
pdfDoc.Encrypt("user", "owner", Aspose.Pdf.Permissions.PrintDocument, Aspose.Pdf.CryptoAlgorithm.AESx256)

pdfDoc.Save("encrypted-proposal.pdf")

' Excel conversion requires Aspose.Cells
' PowerPoint requires Aspose.Slides
' Each format needs separate license and API

' PDF to other formats
Dim pdfConverter = New Aspose.Pdf.Document("input.pdf")

' Convert to Word (limited fidelity)
Dim saveOptions As New DocSaveOptions() With {
	.Format = DocSaveOptions.DocFormat.DocX,
	.Mode = DocSaveOptions.RecognitionMode.Flow
}
pdfConverter.Save("output.docx", saveOptions)

' Convert to HTML
Dim htmlOptions As New HtmlSaveOptions() With {
	.SplitIntoPages = True,
	.SplitCssIntoPages = False,
	.CustomCssSavingStrategy = New HtmlSaveOptions.CssSavingStrategy(CssSavingStrategy)
}
pdfConverter.Save("output.html", htmlOptions)
$vbLabelText   $csharpLabel

Aspose.PDF無法直接轉換DOCX文件,需要將Aspose.Words作為附加依賴。 這一架構決策影響了授權成本和API複雜性。 每種文件格式需要單獨的Aspose產品,具有自己的學習曲線。

格式轉換比較

轉換型別 IronPDF Aspose.PDF 成本影響
DOCX → PDF 內建 需要Aspose.Words 附加$1,199+
HTML → PDF Chrome引擎 基本支持 質量差異
PDF → 圖片 原生 支持 兩者都處理良好
Excel → PDF 透過HTML 需要Aspose.Cells 附加$1,199+
PDF → HTML 支持 支持 兩者功能性
Markdown → PDF 透過HTML 不支持 IronPDF更靈活

Stack Overflow的討論經常強調Aspose模塊化方法的成本影響與IronPDF整合功能之間的差異。

授權和定價有什麼不同?

了解擁有的總成本有助於做出技術決策。 兩種程式庫都提供不同的授權模型,影響長期成本。

IronPDF授權結構

IronPDF的授權提供透明的永久許可,沒有隱藏的成本:

  • Lite License ($999): 單開發者,一個專案部署

  • 小型應用程式或概念證明的理想之選
  • 包括電子郵件支援和更新
  • 永久授權,無需任何其它費用

  • Plus License ($1,499): 三個開發者,三個專案

  • 48小時聊天支援和電話支持
  • 適合小組開發
  • 中小型企業應用程式的普選

  • Professional License ($2,399): 十開發者,十個專案

  • 優先支援,帶有螢幕共享
  • 準備就緒的大型團隊
  • 無限制的開發和測試

  • Unlimited License ($4,799): 無限制開發者和專案

  • 完整的組織覆蓋
  • 專用支援渠道
  • 適合大企業

附加選項增加了價值:

  • 免版稅再分發 (加$2,399):將IronPDF包裝在商業產品中
  • 不間斷支援 ($999/年或$1,999/5年):持續更新和優先支援
  • Iron Suite ($2,998):九個Iron Software產品以兩個的價格供應

Aspose.PDF授權結構

Aspose.PDF定價採用了不同的模式(截至2026年4月的價格,請核實當前價格,因為費率變動頻繁):

  • 開發者小型企業(從$1,199/年):單開發者,一地點

  • 包括基本支持於論壇支援
  • 沒有電話或優先支援
  • 續訂費用迫于更新

  • 開發者OEM ($5,037): 單開發者,無限制位置

  • 適用於分佈式軟體
  • 成本是基本授權的3倍
  • 仍然僅限一開發者

  • 開發者SDK ($33,580): 單開發者,50個部署

  • 對於SDK場景來說,成本極高
  • 部署次數有限
  • 需要仔細追踪部署

附加成本迅速累積:

  • 付費支持: 基本標準從$399/年起
  • 諮詢: 從$5,999/月
  • 其他Aspose產品: Words, Cells, Slides需求單獨授權

總成本分析

考慮典型企業場景,需要PDF生成、DOCX轉換和Excel報告:

需求 IronPDF解決方案 Aspose解決方案 成本差異
PDF 程式庫 IronPDF Pro ($2,999) Aspose.PDF ($1,199) IronPDF更高
DOCX 支援 包含 Aspose.Words ($1,199) +$1,199 for Aspose
Excel支援 透過HTML/CSV Aspose.Cells ($1,199) +$1,199 for Aspose
總成本 $2,399 $5,037 Aspose 68% 更高

對於綜合文件處理來說,Iron Suite就在$2,998包括:

這與購買單獨的Aspose產品相比,代表了卓越的價值。

文件和支援如何比較?

開發者的生產力嚴重依賴於文件質量和支援的可用性。 兩個供應商針對這些方式不同。

IronPDF文件和資源

IronPDF提供全面的學習資源:

支持渠道包括:

  • 24/5工程師支援: 直接聯繫開發團隊
  • 響應時間: 對於大部分問題,24-48小時
  • 螢幕共享: 對於專業許可證可用
  • 社群: 活躍的GitHub和Stack Overflow存在

Aspose.PDF文件和支援

Aspose提供傳統的文件:

  • API文件: 全面但稠密
  • 程式碼範例: 覆蓋基本場景
  • 論壇支持: 社區驅動的支援
  • 收費支援等級: 需要額外成本的優先幫助

支援方法的關鍵差異:

  • IronPDF的專業支援已包含於授權成本內
  • Aspose對於超出論壇的支援單獨收費
  • IronPDF提供直接工程聯繫
  • Aspose更依賴社區論壇

哪個PDF程式庫您應該選擇?

經過全面分析,出現了多個決策因素:

何時選擇IronPDF

選擇IronPDF當:

  • 簡單性很重要: 更清晰的API減少開發時間
  • HTML保真度至關重要: Chrome引擎確保像素完美的渲染
  • 預算固定:無隱藏成本的全包授權
  • 需要DOCX轉換: 內建支持節省額外授權
  • 需要跨平台:原生支持,無需額外包
  • 支援重要:包含專業幫助於授權內

何時選擇Aspose.PDF

選擇Aspose.PDF當:

  • 傳統系統:已經投資於Aspose生態系統
  • 複雜表單處理: 高級XFA表單支持
  • 最小HTML需求: 僅基本的PDF操作
  • 預算靈活:可以承擔多個產品許可證

性能和可擴展性考量

性能考量顯示:

  • IronPDF:更好的HTML渲染性能,更快的批量操作
  • Aspose.PDF:對於簡單操作記憶體占用較低
  • IronPDF:優越的執行緒處理和異步支援
  • Aspose.PDF:對於基本文字提取更快

遷移考量

從Aspose.PDF遷移到IronPDF需要:

// Aspose.PDF approach
Document doc = new Document();
Page page = doc.Pages.Add();
TextFragment text = new TextFragment("Hello");
page.Paragraphs.Add(text);

// Equivalent IronPDF (simpler)
var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<p>Hello</p>");
// Aspose.PDF approach
Document doc = new Document();
Page page = doc.Pages.Add();
TextFragment text = new TextFragment("Hello");
page.Paragraphs.Add(text);

// Equivalent IronPDF (simpler)
var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<p>Hello</p>");
' Aspose.PDF approach
Dim doc As New Document()
Dim page As Page = doc.Pages.Add()
Dim text As New TextFragment("Hello")
page.Paragraphs.Add(text)

' Equivalent IronPDF (simpler)
Dim pdf = (New ChromePdfRenderer()).RenderHtmlAsPdf("<p>Hello</p>")
$vbLabelText   $csharpLabel

現代CSS框架支持

隨著網頁應用程式日益依賴於像Bootstrap、Tailwind CSS和Foundation這樣的現代CSS框架,能準確地在PDF文件中渲染這些框架的能力變得至關重要。 這些框架嚴重依賴於如flexbox和CSS Grid的CSS3特性,來使佈局可響應。

IronPDF:全Bootstrap支持

IronPDF的Chromium渲染引擎為所有現代CSS框架提供了全面支援:

  • Bootstrap 5: 完整的flexbox和CSS Grid支持,實現響應式佈局
  • 複雜布局: 像素完美地渲染Bootstrap主頁Bootstrap範本
  • 現代功能: CSS3動畫、轉換、過渡和媒體查詢
  • CSS框架: Bootstrap, Tailwind CSS, Foundation, Bulma全都無縫運行

程式碼範例:渲染Bootstrap內容

using IronPdf;

// Render a Bootstrap 5 layout
var renderer = new ChromePdfRenderer();

// Example: Bootstrap pricing table with flexbox
string bootstrapHtml = @"
<!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 my-5'>
        <h1 class='text-center mb-5'>Pricing Plans</h1>
        <div class='row g-4'>
            <div class='col-lg-4'>
                <div class='card h-100 shadow-sm'>
                    <div class='card-header bg-primary text-white text-center py-4'>
                        <h4 class='my-0 fw-normal'>Starter</h4>
                    </div>
                    <div class='card-body d-flex flex-column'>
                        <h1 class='card-title pricing-card-title text-center'>$29<small class='text-muted fw-light'>/mo</small></h1>
                        <ul class='list-unstyled mt-3 mb-4 flex-grow-1'>
                            <li>✓ 10 users included</li>
                            <li>✓ 2 GB of storage</li>
                            <li>✓ Email support</li>
                        </ul>
                        <button type='button' class='btn btn-lg btn-outline-primary mt-auto'>Sign up</button>
                    </div>
                </div>
            </div>

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

var pdf = renderer.RenderHtmlAsPdf(bootstrapHtml);
pdf.SaveAs("bootstrap-pricing.pdf");
using IronPdf;

// Render a Bootstrap 5 layout
var renderer = new ChromePdfRenderer();

// Example: Bootstrap pricing table with flexbox
string bootstrapHtml = @"
<!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 my-5'>
        <h1 class='text-center mb-5'>Pricing Plans</h1>
        <div class='row g-4'>
            <div class='col-lg-4'>
                <div class='card h-100 shadow-sm'>
                    <div class='card-header bg-primary text-white text-center py-4'>
                        <h4 class='my-0 fw-normal'>Starter</h4>
                    </div>
                    <div class='card-body d-flex flex-column'>
                        <h1 class='card-title pricing-card-title text-center'>$29<small class='text-muted fw-light'>/mo</small></h1>
                        <ul class='list-unstyled mt-3 mb-4 flex-grow-1'>
                            <li>✓ 10 users included</li>
                            <li>✓ 2 GB of storage</li>
                            <li>✓ Email support</li>
                        </ul>
                        <button type='button' class='btn btn-lg btn-outline-primary mt-auto'>Sign up</button>
                    </div>
                </div>
            </div>

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

var pdf = renderer.RenderHtmlAsPdf(bootstrapHtml);
pdf.SaveAs("bootstrap-pricing.pdf");
Imports IronPdf

' Render a Bootstrap 5 layout
Dim renderer As New ChromePdfRenderer()

' Example: Bootstrap pricing table with flexbox
Dim bootstrapHtml 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 my-5'>
        <h1 class='text-center mb-5'>Pricing Plans</h1>
        <div class='row g-4'>
            <div class='col-lg-4'>
                <div class='card h-100 shadow-sm'>
                    <div class='card-header bg-primary text-white text-center py-4'>
                        <h4 class='my-0 fw-normal'>Starter</h4>
                    </div>
                    <div class='card-body d-flex flex-column'>
                        <h1 class='card-title pricing-card-title text-center'>$29<small class='text-muted fw-light'>/mo</small></h1>
                        <ul class='list-unstyled mt-3 mb-4 flex-grow-1'>
                            <li>✓ 10 users included</li>
                            <li>✓ 2 GB of storage</li>
                            <li>✓ Email support</li>
                        </ul>
                        <button type='button' class='btn btn-lg btn-outline-primary mt-auto'>Sign up</button>
                    </div>
                </div>
            </div>

        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(bootstrapHtml)
pdf.SaveAs("bootstrap-pricing.pdf")
$vbLabelText   $csharpLabel

Aspose.PDF:有限的Bootstrap支持

Aspose.PDF使用具有限制的自訂HTML渲染引擎,對於現代CSS框架:

  • Flexbox限制: 正如所指出的在Aspose論壇,flexbox支持有限或不存在
  • CSS Grid:現代網格布局可能未正確渲染
  • 需要變通方案: 使用基於表格布局或Bootstrap 3以確保相容
  • 複雜布局: 需要用顯著調整Bootstrap 4+功能

根據Aspose自己的文件,開發者在渲染現代網頁框架時經常遇到問題,特別是那些依賴於flexbox和CSS Grid進行布局的框架。 當嘗試渲染當代網頁應用或使用現代CSS框架的營銷材料時,這一限制特別明顯。

關於CSS框架相容性的更多資訊,請參見Bootstrap&Flexbox CSS指南

結論

IronPDF和Aspose.PDF都服務於.NET PDF操作市場,但理念不同。 IronPDF透過直觀的API、全面的內建功能和透明的定價優先考量開發者體驗。 它的原生DOCX支持、優越的HTML渲染、和包含的專業支援,創造了令人信服的價值。

Aspose.PDF提供了廣泛的功能,但需要多個產品才能完成文件處理,顯著增加了總成本。雖然適合於特定的企業場景,但其複雜性和授權模式可能會影響到較小的團隊。

對於大多數.NET開發團隊,IronPDF提供了功能、性能和價值的最佳平衡。 能夠在一個程式庫中處理PDF、DOCX和HTML轉換,結合專業支援和永久授權,成為現代應用程式的實際選擇。

準備好體驗不同了嗎? 開始使用30天免費試用 評估IronPDF在您的環境中的功能。 對於現有專案,下載IronPDF經由NuGet並即刻轉變您的PDF處理流程。

請注意Aspose是其各自所有者的註冊商標。 此網站與Aspose無關,亦未受其認可或贊助。 所有產品名稱、徽標和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時的公開可用資訊。

常見問題

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

您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字串轉換為 PDF。此方法支援 CSS3、JavaScript 和網頁字型,確保高保真的渲染。

using IronPDF 生成跨平台 PDF 的優勢是什麼?

IronPDF 提供跨 Windows、Linux、macOS、Docker 和雲端環境的原生相容性,無需額外封裝,是跨平台 PDF 生成的多功能選擇。

IronPDF 如何處理 PDF 的加密和安全性?

IronPDF 使用統一的 SecuritySettings 類來提供高效的加密和精細的權限控制,支援超過 15 項權限選項來加強文件安全性。

IronPDF 為開發者提供哪些支援?

IronPDF 包含 24/5 的專業工程支援,隨所有授權提供電子郵件、聊天和螢幕分享協助,確保開發者在實施挑戰中及時獲得幫助。

我可以使用 IronPDF 將 DOCX 文件轉換為 PDF 嗎?

可以,IronPDF 支援透過 DocxToPdfRenderer 類將 DOCX 轉換為 PDF,無縫維持文件格式和結構。

在 HTML 轉 PDF 方面,IronPDF 和 Aspose.PDF 的一些主要差異是什麼?

IronPDF 使用完整的 Chrome 渲染引擎進行 HTML 到 PDF 的轉換,提供 98% 以上的瀏覽器保真度。而 Aspose.PDF 依賴於自訂的 HTML 解析器,對現代網頁標準的支援較有限。

IronPDF 如何簡化 PDF 內容的刪除過程?

IronPDF 提供簡單明了的方法,如 RedactTextOnAllPages,實現真正的內容移除,支援正則表達式模式並保證合規,步驟簡便。

using IronPDF 為 PDF 新增浮水印的好處是什麼?

IronPDF 允許使用 HTML/CSS 基於的浮水印,具有全面的樣式選項,包括漸變和陰影,使用 ApplyWatermark 方法,提供視覺上吸引人的效果。

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

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Aspose Logo

厭倦了昂貴的續費和過時的產品更新?

Aspose輕鬆切換,透過我們的工程遷移支援和更好的交易。

IronPDF Logo

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話