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的逐步迁移路径——一个采用现代 C# 惯例的本地 .NET PDF 库,集成更简单,并且用一次性的永久许可证。

为什么要从Apryse PDF迁移?

虽然Apryse PDF提供了强大的功能,但仍有一些因素促使开发团队寻求替代方案来满足其 PDF 生成需求。

高级定价和订阅模式

Apryse 瞄准企业客户,其销售导向的定价对中小型项目可能显得过高。 公共价格未在 apryse.com 上公布; 以下数字来自第三方聚合商(Vendr, G2),应与 Apryse 销售确认:

方面Apryse (PDFTron)IronPDF
入门级别~$1,500/开发者/年(由 Vendr 报告)一次性 749 美元(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+ 或带有 C# 扩展的 VS Code
  • 访问 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:更新命名空间引用

用IronPDF替换 Apryse 命名空间:

// 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 的水印技术,通过熟悉的 Web 技术提供完整的样式控制。

密码保护

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
冷启动快速(本地代码)~2s (Chromium init)
后续渲染快速快速
复杂的 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 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

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 天试用密钥
无需信用卡或创建账户