跳至页脚内容
迁移指南

如何用 C# 从 PuppeteerSharp 迁移到 IronPDF

从PuppeteerSharp迁移到 IronPDF:完整的 C# 迁移指南。

从PuppeteerSharp迁移到IronPDF可将您的 PDF 生成工作流程从依赖 300MB 以上的浏览器自动化工具转变为具有自动内存管理功能的专用 PDF 库。 本指南提供了一个完整的、循序渐进的迁移路径,可消除 Chromium 下载、解决内存泄漏问题并提供全面的 PDF 操作功能。

为什么要从PuppeteerSharp迁移到 IronPDF.

了解 PuppeteerSharp。

PuppeteerSharp 是 Google 的 Puppeteer 的 .NET 移植版本,将浏览器自动化功能引入 C#。 它使用 Chrome 浏览器内置的打印成 PDF 功能生成 PDF,就像在浏览器中点击 Ctrl+P 一样。 这将产生针对纸张进行优化的可打印输出,与您在屏幕上看到的不同。

PuppeteerSharp 设计用于网络测试和刮擦,而非文档生成。 使用PuppeteerSharp生成 PDF 虽然能够胜任,但也会给制作带来巨大挑战。

浏览器自动化问题

PuppeteerSharp 设计用于浏览器自动化,而非文档生成。 在将其用于 PDF 时,这会产生一些基本问题:

1.首次使用前需要下载 300MB+ Chromium。PuppeteerSharp的一个明显缺点是部署体积庞大,这主要是由于它捆绑了 Chromium 二进制文件。 在无服务器环境中,Docker 镜像文件的体积很大,可能会造成臃肿,并引发冷启动问题。

2.在负载情况下出现内存泄漏,需要手动回收浏览器。 众所周知,PuppeteerSharp 在重载情况下会出现内存泄漏。 浏览器实例内存的积累需要人工干预进行流程管理和回收。

3.复杂的异步模式与浏览器生命周期管理。

4.打印成 PDF 输出(相当于 Ctrl+P,而不是屏幕截图)。 布局可能会回流,默认情况下背景可能会被省略,输出结果将分页打印,而不是与浏览器视口相匹配。

5.不支持 PDF/A 或 PDF/UA,以满足合规要求。PuppeteerSharp无法生成符合 PDF/A(存档)或 PDF/UA(可访问性)标准的文档。

6.无 PDF 操作 - 仅生成,无合并/拆分/编辑。 虽然PuppeteerSharp能高效生成 PDF,但它缺乏进一步操作的功能,如合并、分割、保护或编辑 PDF。

PuppeteerSharp与IronPDF对比

方面PuppeteerSharpIronPDF
主要目的浏览器自动化生成 PDF
Chromium 依赖性300MB+ 单独下载内置优化引擎
API 复杂性异步浏览器/页面生命周期同步单行本
初始化BrowserFetcher.DownloadAsync() + LaunchAsync<代码>new ChromePdfRenderer()</ 代码
内存管理需要手动回收浏览器自动翻译
负载下的内存500MB+ 有泄露~50MB 稳定
冷启动45 秒以上~20 秒
PDF/A支持不可用全面支持
PDF/UA 辅助功能不可用全面支持
PDF 编辑不可用合并、拆分、盖章、编辑
数字签名不可用全面支持
线程安全有限的满的
专业支持社区有服务水平协议的商业翻译

平台支持

.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDF满的满的满的满的
PuppeteerSharp有限的满的满的待定

IronPDF 广泛支持各种 .NET 平台,确保开发人员可以在各种环境中使用它,而不会遇到兼容性问题,为 2025 年和 2026 年的现代 .NET 应用程序提供了灵活的选择。


开始之前

前提条件

1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥

NuGet 软件包变更

# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

IronPDF无需BrowserFetcher.DownloadAsync()--渲染引擎已自动捆绑。

许可配置

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

完整的 API 参考

命名空间变更

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

核心 API 映射

PuppeteerSharp APIIronPdf API备注
<代码>new BrowserFetcher().DownloadAsync()</ 代码不需要无需下载浏览器
<代码>Puppeteer.LaunchAsync(选项)</代码不需要无浏览器管理
<代码>browser.NewPageAsync()</代码不需要无页面上下文
<代码>page.GoToAsync(url)</代码<代码>renderer.RenderUrlAsPdf(url)</代码直接渲染
<代码>page.SetContentAsync(html)</代码<代码>renderer.RenderHtmlAsPdf(html)</代码直接渲染
<代码>page.PdfAsync(路径)</代码<代码>pdf.SaveAs(路径)</代码渲染后
<代码>等待 page.CloseAsync()</ 代码不需要自动清理
<代码>等待 browser.CloseAsync()</ 代码不需要自动清理
<代码>PdfOptions.Format</代码<代码>RenderingOptions.PaperSize</代码纸张大小
<代码>PdfOptions.Landscape</代码<代码>RenderingOptions.PaperOrientation</代码定位
<代码>PdfOptions.MarginOptions</代码<代码>RenderingOptions.MarginTop/Bottom/Left/Right</代码个别页边距
<代码>PdfOptions.PrintBackground</代码<代码>RenderingOptions.PrintHtmlBackgrounds</代码背景打印
<代码>PdfOptions.HeaderTemplate</代码<代码>RenderingOptions.HtmlHeader</代码HTML 标题
<代码>PdfOptions.FooterTemplate</代码<代码>RenderingOptions.HtmlFooter</代码HTML 页脚
<代码>page.WaitForSelectorAsync()</代码<代码>RenderingOptions.WaitFor.HtmlElementId</代码等待元素

代码迁移示例

示例 1:基本 HTML 到 PDF 的转换

之前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本例展示了基本的架构差异。PuppeteerSharp需要六个异步操作:BrowserFetcher.DownloadAsync() (300MB+ Chromium 下载)、Puppeteer.LaunchAsync()browser.NewPageAsync()page.SetContentAsync()page.PdfAsync(),再加上 await using 的正确处理。

IronPDF 消除了所有这些复杂性:创建一个 ChromePdfRenderer ,调用 RenderHtmlAsPdf()SaveAs() 。 没有异步模式,没有浏览器生命周期,没有 Chromium 下载。IronPDF的方法提供了更简洁的语法和与现代 .NET 应用程序更好的集成。 请参阅 HTML 转 PDF 文档,了解全面的示例。

示例 2:URL 到 PDF 的转换

之前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PuppeteerSharp 使用 GoToAsync() 导航到 URL,然后使用 PdfAsync() 。IronPDF提供了一个 RenderUrlAsPdf() 方法,可在一次调用中处理导航和 PDF 生成。 在我们的教程中了解更多信息。

示例 3:带边距的自定义页面设置

之前(PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");

        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();

        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });

        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");

        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本例展示了 PDF 选项如何在两个库之间映射。PuppeteerSharp使用 PdfOptions 以及 Format, LandscapeMarginOptions 包含字符串值("20mm")。 IronPdf 使用 RenderingOptions 属性,该属性具有直接的纸张尺寸枚举、方向枚举和以毫米为单位的数字页边距值。

关键映射:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape</代码
  • MarginOptions.Top = "20mm"MarginTop = 20 (数字毫米)

内存泄漏问题

PuppeteerSharp 在持续负载的情况下内存累积是出了名的:

// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch

// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch

// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 不需要PuppeteerSharp所需的浏览器池基础设施:

// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}
// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

关键迁移说明

同步到同步转换

PuppeteerSharp 自始至终需要 async/await; IronPdf 支持同步操作:

// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

边际单位转换

PuppeteerSharp 使用字符串单位; IronPdf 使用数字毫米:

//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

页眉/页脚占位符转换

PuppeteerSharp 类IronPdf 占位符
<span> class="pageNumber">代码{page}
<span> class="totalPages">代码<代码>{总页数}</代码
<span> class="date">代码<代码>{日期}</代码
<代码> class="title"><代码>{html-title}</代码

迁移后的新功能

迁移到IronPDF后,您将获得PuppeteerSharp无法提供的功能:

PDF 合并

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

水印

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);
var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

密码保护

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

数字签名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF/A 合规性

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

性能比较摘要

指标PuppeteerSharpIronPDF改进
第一个 PDF(冷启动)45s+~20s速度提高 55% 以上
后续 PDF变量一致性可预测性
内存使用情况500MB+(增长)~50MB(稳定)减少 90% 内存
磁盘空间(Chromium)300MB 以上0取消下载
浏览器下载要求不需要零设置
线程安全有限的满的可靠的并发性
PDF 生成时间45s20s速度提高 55%

迁移清单

迁移前

  • [ ] 确定代码库中PuppeteerSharp的所有用法
  • [文档边距值(将字符串转换为毫米)
  • [ ] 注意页眉/页脚占位符的转换语法
  • [ ] 删除浏览器池/回收基础设施
  • [ ] 从 ironpdf.com 获取IronPDF许可证密钥

软件包变更

  • [ ] 删除 PuppeteerSharp NuGet 软件包
  • [ ] 删除 .local-chromium 文件夹以回收 ~300MB 磁盘空间
  • [ ] 安装 IronPDF NuGet 软件包:<代码>dotnet 添加软件包 IronPdf

代码更改

  • [更新命名空间导入
  • [ ] 删除 BrowserFetcher.DownloadAsync() 调用
  • [ ] 删除 Puppeteer.LaunchAsync() 和浏览器管理
  • [ ] 将 page.SetContentAsync() + page.PdfAsync() 替换为 RenderHtmlAsPdf()
  • [ ] 将 page.GoToAsync() + page.PdfAsync() 替换为 RenderUrlAsPdf()
  • [ ] 将边距字符串转换为毫米值
  • [ ] 转换页眉/页脚占位符语法
  • [ ] 删除所有浏览器/页面处理代码
  • [ ] 删除浏览器池基础设施
  • [ ] 在应用程序启动时添加许可证初始化

后迁移

  • [ ] PDF 输出的可视化比较
  • [ ] 内存稳定性负载测试(应在不循环的情况下保持稳定)
  • [ ] 用页码验证页眉/页脚渲染
  • [ ] 根据需要添加新功能(安全、水印、合并

结论

在PuppeteerSharp和IronPDF之间做出选择时,请考虑项目的具体需求。PuppeteerSharp在需要精确的 HTML 渲染的场景中表现出色,而且管理 Chromium 依赖关系的开销也是合理的。 相比之下,IronPDF 提供了一个全面的软件包,具有广泛的 PDF 操作能力、无与伦比的易部署性和卓越的内存管理,是追求简单和多功能的开发人员的理想选择。

本次迁移的主要变化有 1.架构:浏览器自动化工具 → 专用 PDF 库 2.依赖关系:300MB 以上的 Chromium 下载 → 捆绑的呈现引擎 3.复杂性:6 个以上异步操作 → 3 个同步调用 4.内存:500MB 以上(含泄漏) → ~50MB 稳定内存 5.浏览器管理:手动生命周期和回收 → 自动处理 6.边距: 字符串单位 ("20mm") → 数字毫米 (20) 7.占位符:CSS 类 (<span> class="pageNumber">) → 大括号 ({page}) 8.性能:冷启动 45 秒 → ~冷启动 20 秒 9.新功能:PDF 合并、分割、水印、安全性、数字签名、PDF/A 合规性

这两个库都有各自独特的优缺点,了解这些优缺点可以指导您选择适合您的 PDF 生成和处理需求的工具。

探索完整的IronPdf文档教程API参考,加速您的PuppeteerSharp迁移。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。