IRONSOFTWAREHOME
影片

如何使用 IronPDF 在 PDF 中新增頁眉和頁腳

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

Apryse(自2023年2月8日起由PDFTron重新命名)是一個以全面文件處理能力著稱的企業PDF SDK。 NuGet套件和.NET命名空間在品牌變更後仍以歷史PDFTron.* / pdftron.* ID進行發佈。 Apryse使用銷售導向的定價-在apryse.com上不公開價格點,第三方市場(Vendr、G2)報告入門報價約為$1,500/每開發者/每年。 結合模組路徑設置和C++繼承的API,這可能會為尋求簡單PDF功能的團隊創造障礙。 本指南提供從Apryse遷移到IronPDF的逐步遷移路徑——一個本地的.NET PDF程式庫,具有現代C#慣例、更簡單的整合以及一次性的永久授權。

為什麼要從Apryse PDF遷移?

雖然Apryse PDF提供強大功能,但有幾個因素驅使開發團隊尋求其他替代方案來滿足其PDF生成需求。

高端定價和訂閱模式

Apryse以銷售導向的定價鎖定企業客戶,對於中小型專案可能造成負擔。 在apryse.com上不公開價格點; 以下數字來自第三方聚合器(Vendr、G2),應與Apryse銷售確認:

方面Apryse(PDFTron)IronPDF
入門級~$1,500/每開發者/每年(由Vendr報告)$999一次性(Lite)
典型範圍~$9,275–$35,816/每年(根據Vendr市場資料)分級Lite/Plus/Professional
許可模式年度訂閱,銷售導向報價永久授權
查看器授權WebViewer/PDFViewCtrl單獨定價不適用(使用標準查看器)
伺服器授權需要企業定價包含在授權等級中

整合的複雜性

Apryse的C++傳承塑造了.NET介面,相對於僅管理包可能增加設置步驟:

功能Apryse PDFIronPDF
設置模組路徑、外部二進位檔單個NuGet套件
初始化PDFNet.Initialize()與授權簡單屬性分配
HTML渲染需要外部html2pdf模組內建 Chromium 引擎
API風格C++繼承,複雜現代C#慣例
依賴關係多個DLL,特定平台自包含包

何時考慮遷移

如果滿足以下條件,遷移至IronPDF:

  • 您主要需要HTML/URL轉PDF
  • 您想要更簡單的API,減少樣板
  • 高端定價在您的用例中不合理
  • 您不需要PDFViewCtrl查看器控制功能
  • 您偏好一次性授權而不是訂閱

如果滿足以下條件,繼續使用Apryse PDF:

  • 您需要他們的本地查看器控制功能(PDFViewCtrl)
  • 您經常使用XOD或專有格式
  • 您需要特定的企業功能(高級刪減等)
  • 您的組織已經擁有企業許可証

遷移前準備

前提條件

確保您的環境符合以下要求:

  • .NET Framework 4.6.2+, .NET Core 3.1+, or .NET 5/6/7/8/9
  • Visual Studio 2019+或VS Code與C#擴展
  • NuGet包管理器存取 -IronPDF許可證金鑰(免費試用可在 ironpdf.com 獲得)

審計Apryse PDF使用情況

在您的解決方案目錄中運行這些命令以識別所有Apryse參考:

# Find all pdftron using statements
grep -r "using pdftron" --include="*.cs" .

# Find PDFNet initialization
grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" .

# Find PDFDoc usage
grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" .

# Find HTML2PDF usage
grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" .

# Find ElementReader/Writer usage
grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" .
SHELL

預期的中斷變更

Apryse PDF模式需要更改
PDFNet.Initialize()替換為IronPdf.License.LicenseKey
HTML2PDF模組內建ChromePdfRenderer
ElementWriterIronPDF內部處理內容
SDFDoc.SaveOptions簡單SaveAs()方法
PDFViewCtrl使用外部PDF查看器
XOD格式轉換為PDF或圖片
模組路徑配置不需要

逐步遷移過程

步驟1:更新NuGet包

Apryse在多個PDFTron.*套件ID下發布.NET SDK,具體取決於目標框架和架構(該品牌在2023年更改,但套件ID未變)。 常見的有:

  • PDFTron.NET.x64 — 主要.NET / .NET Core x64套件(當前11.x)
  • PDFTron.NetFramework.x64 — .NET Framework 4.5.1+ x64 only
  • PDFTron.NETCore.Windows.x64 — Windows x64上的.NET Core
  • PDFNet — 舊版綜合Windows .NET Framework 32/64位套件
# Remove whichever Apryse/PDFTron package(s) you have installed
dotnet remove package PDFTron.NET.x64
dotnet remove package PDFTron.NetFramework.x64
dotnet remove package PDFTron.NETCore.Windows.x64
dotnet remove package PDFNet

# Install IronPDF
dotnet add package IronPdf
SHELL

或者通過包管理器控制台:

Uninstall-Package PDFTron.NET.x64
Install-Package IronPdf
PowerShell

步驟 2:更新命名空間引用

將Apryse命名空間替換為IronPDF:

// Remove these
using pdftron;
using pdftron.PDF;
using pdftron.PDF.Convert;
using pdftron.SDF;
using pdftron.Filters;

// Add these
using IronPdf;
using IronPdf.Rendering;

步驟3:移除初始化樣板

Apryse PDF需要複雜的初始化。 IronPDF完全消除了這一需求。

Apryse PDF實現:

// Complex initialization
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
// Plus module path for HTML2PDF...

IronPDF實現:

// Simple license assignment (optional for development)
IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY";

使用IronPDF不需要PDFNet.Terminate()調用——資源自動管理。

完整 API 遷移參考

核心類映射

Apryse PDF類別IronPDF等價
PDFDocPdfDocument
HTML2PDFChromePdfRenderer
TextExtractorPdfDocument.ExtractAllText()
StamperPdfDocument.ApplyWatermark()
PDFDrawPdfDocument.ToBitmap()
SecurityHandlerPdfDocument.SecuritySettings
PDFNetIronPdf.License

文件操作

Apryse PDF方法IronPDF方法
new PDFDoc()new PdfDocument()
new PDFDoc(path)PdfDocument.FromFile(path)
new PDFDoc(buffer)PdfDocument.FromBinaryData(bytes)
doc.Save(path, options)pdf.SaveAs(path)
doc.Save(buffer)pdf.BinaryData
doc.Close()pdf.Dispose()
doc.GetPageCount()pdf.PageCount
doc.AppendPages(doc2, start, end)PdfDocument.Merge(pdfs)

HTML到PDF轉換

Apryse PDF方法IronPDF方法
HTML2PDF.Convert(doc)renderer.RenderHtmlAsPdf(html)
converter.InsertFromURL(url)renderer.RenderUrlAsPdf(url)
converter.InsertFromHtmlString(html)renderer.RenderHtmlAsPdf(html)
converter.SetModulePath(path)不需要
converter.SetPaperSize(width, height)RenderingOptions.PaperSize
converter.SetLandscape(true)RenderingOptions.PaperOrientation

程式碼遷移範例

HTML字串轉PDF

最常見的操作顯示出樣板程式碼的顯著減少。

Apryse PDF實現:

using pdftron;
using pdftron.PDF;

class Program
{
    static void Main()
    {
        PDFNet.Initialize("YOUR_LICENSE_KEY");
        PDFNet.SetResourcesPath("path/to/resources");

        string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>";

        using (PDFDoc doc = new PDFDoc())
        {
            HTML2PDF converter = new HTML2PDF();
            converter.SetModulePath("path/to/html2pdf");
            converter.InsertFromHtmlString(html);

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

            if (converter.Convert(doc))
            {
                doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine("PDF created successfully");
            }
            else
            {
                Console.WriteLine($"Conversion failed: {converter.GetLog()}");
            }
        }

        PDFNet.Terminate();
    }
}

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        
        pdf.SaveAs("output.pdf");
    }
}

IronPDF消除初始化、模組路徑和清理程式碼,從35+行減少到5行。

URL 到 PDF 轉換

Apryse PDF實現:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc())
{
    HTML2PDF converter = new HTML2PDF();
    converter.SetModulePath("path/to/html2pdf");

    HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
    settings.SetLoadImages(true);
    settings.SetAllowJavaScript(true);
    settings.SetPrintBackground(true);

    converter.InsertFromURL("https://example.com", settings);

    if (converter.Convert(doc))
    {
        doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized);
    }
}

PDFNet.Terminate();

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        string url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        
        pdf.SaveAs("webpage.pdf");
    }
}

合併多個 PDF

Apryse PDF實現:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc mainDoc = new PDFDoc())
{
    string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };

    foreach (string file in files)
    {
        using (PDFDoc doc = new PDFDoc(file))
        {
            mainDoc.AppendPages(doc, 1, doc.GetPageCount());
        }
    }

    mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        
        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        
        merged.SaveAs("merged.pdf");
    }
}

IronPDF的靜態Merge方法直接接受多個文件,消除了頁面迭代模式。

文字提取

Apryse PDF實現:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    TextExtractor extractor = new TextExtractor();

    for (int i = 1; i <= doc.GetPageCount(); i++)
    {
        Page page = doc.GetPage(i);
        extractor.Begin(page);

        string pageText = extractor.GetAsText();
        Console.WriteLine($"Page {i}:");
        Console.WriteLine(pageText);
    }
}

PDFNet.Terminate();

IronPDF實現:

using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text at once
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);

// Extract from specific page
string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed
Console.WriteLine($"Page 1: {page1Text}");

新增水印

Apryse PDF實現:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5);
    stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center,
                         Stamper.VerticalAlignment.e_vertical_center);
    stamper.SetOpacity(0.3);
    stamper.SetRotation(45);
    stamper.SetFontColor(new ColorPt(1, 0, 0));
    stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center);

    stamper.StampText(doc, "CONFIDENTIAL",
        new PageSet(1, doc.GetPageCount()));

    doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

IronPDF實現:

using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("document.pdf");

// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
    color: red;
    opacity: 0.3;
    font-size: 72px;
    font-weight: bold;
    text-align: center;
'>CONFIDENTIAL</div>";

pdf.ApplyWatermark(watermarkHtml,
    rotation: 45,
    verticalAlignment: VerticalAlignment.Middle,
    horizontalAlignment: HorizontalAlignment.Center);

pdf.SaveAs("watermarked.pdf");

IronPDF使用基於HTML/CSS的水印功能,通過熟悉的網頁技術提供完整的樣式控制。

密碼保護

Apryse PDF實現:

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

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    SecurityHandler handler = new SecurityHandler();
    handler.ChangeUserPassword("user123");
    handler.ChangeMasterPassword("owner456");

    handler.SetPermission(SecurityHandler.Permission.e_print, false);
    handler.SetPermission(SecurityHandler.Permission.e_extract_content, false);

    doc.SetSecurityHandler(handler);
    doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

IronPDF實現:

using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Set passwords
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";

// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

頭部和尾部

IronPDF實現:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>",
    DrawDividerLine = true,
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true,
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");

IronPDF支持像{total-pages}這樣的佔位符標記,用於動態頁碼。 欲了解更多選項,請參見 頁眉和頁腳文件

ASP.NET Core 整合

Apryse PDF的初始化需求使得網頁應用程式整合變得複雜。 IronPDF簡化了這個模式。

IronPDF模式:

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }
}

依賴注入配置

// Program.cs
public void ConfigureServices(IServiceCollection services)
{
    // Set license once
    IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];

    // Register renderer as scoped service
    services.AddScoped<ChromePdfRenderer>();

    // Or create a wrapper service
    services.AddScoped<IPdfService, IronPdfService>();
}

// IronPdfService.cs
public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }

    public PdfDocument GenerateFromHtml(string html) =>
        _renderer.RenderHtmlAsPdf(html);

    public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
        _renderer.RenderHtmlAsPdfAsync(html);
}

性能比較

指標Apryse PDFIronPDF
冷啟動快(本地程式碼)~2秒(Chromium初始化)
後續渲染
複雜HTML變數(html2pdf模組)優秀(Chromium)
CSS支持有限完整支持 CSS3
JavaScript有限支援

性能優化技巧

// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();

// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0);   // No delay
renderer.RenderingOptions.Timeout = 30000;          // 30s max

// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
    pdf.SaveAs("output.pdf");
}

故障排除常見的遷移問題

問題:模組路徑錯誤

移除所有模組路徑配置——IronPDF的Chromium引擎是內建的:

// Remove this
converter.SetModulePath("path/to/html2pdf");

// Just use the renderer
var renderer = new ChromePdfRenderer();

問題:找不到PDFNet.Initialize()

替換為IronPDF授權設置:

// Remove this
PDFNet.Initialize("KEY");
PDFNet.SetResourcesPath("path");

// Use this (optional for development)
IronPdf.License.LicenseKey = "YOUR-KEY";

問題:PDFViewCtrl替代方案

IronPDF不包含查看器控制。 選項:

  • 使用PDF.js用於網頁查看器
  • 使用系統PDF查看器
  • 考慮第三方查看器組件

後遷移檢查清單

完成程式碼遷移後,請驗證以下內容:

  • 驗證 PDF 輸出質量符合期望
  • 測試所有邊緣情況(大型文件、複雜CSS)
  • 比較性能指標
  • 更新 Docker 配置(如適用)
  • 移除Apryse授權和相關配置
  • 文件IronPDF特定配置
  • 訓練團隊新API模式
  • 更新CI/CD管道(如有必要)

其他資源


從Apryse PDF遷移到IronPDF將您的PDF程式碼庫從複雜的C++模式轉變為慣用的C#。 去除初始化樣板、模組路徑配置和基於訂閱的授權,立即提高生產力,並在長期內降低成本。

請注意: Apryse是其各自所有者的註冊商標。 此站點未與Apryse或PDFTron關聯、認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費現場演示
Booking Badge

受到全球數百萬工程師的信任

Iron Software的客戶標誌
獲取您的無義務諮詢
填寫以下表格或電子郵件sales@ironsoftware.com
您的詳細資訊將始終保密
受到全球數百萬工程師的信任
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立