比较

PDFmyURL 与 IronPDF:技术比较指南

当 .NET 开发人员需要将 URL 和 HTML 内容转换为 PDF 时,他们面临着一个关键的架构决策:使用像PDFmyURL这样的基于云的 API 服务,还是选择像IronPDF这样的本地处理库。 本文将从技术差异、隐私考虑以及对各种应用需求的适用性等方面对两种方案进行比较。

什么是 PDFmyURL?

PDFmyURL 是一项基于云的 API 服务,旨在将 URL 转换为 PDF。 该服务在外部服务器上处理数据,使开发人员无需在本地计算机上投入大量处理能力。PDFmyURL在 .NET 应用程序中使用 Pdfcrowd SDK,提供HtmlToPdfClient类,该类与远程服务器通信以完成每个转换任务。

该服务以易用性为优先考量,并符合 W3C 标准,以实现一致的渲染效果。 但是,PDFmyURL 是一个 API 封装器而不是一个独立的库,因此它需要持续的互联网连接,并将所有文档发送到外部服务器进行处理。

PDFmyURL 的主要功能包括:

-基于云的处理:所有转换都在PDFmyURL的外部服务器上进行。 订阅价格:每月 39 美元起,另有持续费用。 -对互联网的依赖:每次转换都需要网络连接。

  • API密钥认证:每次请求都需要用户名和API密钥。 -速率限制: API 调用可以根据订阅计划进行限制。

什么是 IronPDF?

IronPDF是一个完整的 .NET 库,可在您的应用程序环境中本地处理 PDF 文件。 ChromePdfRenderer 类使用基于 Chromium 的现代引擎进行 HTML 到IronPDF的转换,提供完整的 CSS3 和 JavaScript 支持,无需将数据发送到外部服务器。

与PDFmyURL基于云的方法不同,IronPDF 在您的基础架构内处理一切。 这种设置消除了与外部处理相关的隐私问题,同时提供了除基本转换之外的功能,包括 PDF 操作、文本提取、水印和安全功能。

架构比较

PDFmyURL 和IronPDF的主要区别在于处理发生的位置:外部服务器处理与本地处理。

方面PDFmyURLIronPDF
类型应用程序接口封装.NET 库
处理地点外部服务器本地(您的服务器)
依赖性需要连接互联网本地处理
身份验证每次请求的 API 密钥一次性许可证密钥
成本39+ 美元/月订阅提供永久许可证
隐私外部发送的数据数据保持本地化
费用限制是(取决于计划)
平台支持基于网络跨平台
使用案例少量应用大批量和企业

对于处理敏感文档(合同、财务报告、个人数据)的应用程序来说,处理位置会对隐私和合规性产生重大影响。PDFmyURL通过外部服务器传输所有文档,而IronPDF则将所有文档保存在您可控的环境中。

将 URL 转换为 PDF.

将网页转换为 PDF 可以突出这些解决方案之间的 API 模式差异。

PDFmyURL URL 转 PDF 方法:

// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.convertUrlToFile("https://example.com", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.convertUrlToFile("https://example.com", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
Imports System
Imports Pdfcrowd

Class Example
    Shared Sub Main()
        Try
            Dim client = New HtmlToPdfClient("username", "apikey")
            client.convertUrlToFile("https://example.com", "output.pdf")
        Catch why As Error
            Console.WriteLine("Error: " & why)
        End Try
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF URL 转 PDF 方法:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Example
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PDFmyURL 的每次转换操作都需要 API 凭据,这就造成了对外部服务的依赖。HtmlToPdfClient 构造函数需要用户名和 API 密钥,转换方法包括针对 API 特定错误的 try-catch 处理。

IronPDF 的 ChromePdfRenderer 在初始设置后可独立运行。RenderUrlAsPdf() 方法使用其内置的 Chromium 引擎在本地处理 URL,并返回一个 PdfDocument 对象,该对象可以保存或进一步操作。 了解有关 URL 至 PDF 转换的更多信息,请参阅IronPDF文档。

HTML 字符串到 PDF 的转换

将 HTML 内容直接转换为 PDF 显示出类似的架构差异。

PDFmyURL HTML 字符串转换:

// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            string html = "<html><body><h1>Hello World</h1></body></html>";
            client.convertStringToFile(html, "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            string html = "<html><body><h1>Hello World</h1></body></html>";
            client.convertStringToFile(html, "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
Imports System
Imports Pdfcrowd

Class Example
    Shared Sub Main()
        Try
            Dim client = New HtmlToPdfClient("username", "apikey")
            Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
            client.convertStringToFile(html, "output.pdf")
        Catch why As Error
            Console.WriteLine("Error: " & why.ToString())
        End Try
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF HTML 字符串转换:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    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");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Example
{
    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");
    }
}
Imports IronPdf
Imports System

Class Example
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

使用 PDFmyURL,HTML 内容可通过 convertStringToFile() 传输到外部服务器。 这意味着您的 HTML 模板、动态内容和任何嵌入式数据都要通过第三方基础设施。

IronPDF 的RenderHtmlAsPdf()可在本地处理 HTML,从而将内容保留在应用程序边界内。 有关 HTML 到IronPDF转换模式的详细指导,请参阅 HTML 到 PDF 教程

带设置的 HTML 文件转换

配置页面设置可显示两种解决方案之间不同的 API 设计模式。

带设置的PDFmyURL文件转换:

// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.setPageSize("A4");
            client.setOrientation("landscape");
            client.setMarginTop("10mm");
            client.convertFileToFile("input.html", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
// InstallPDFmyURLSDK
using System;
using Pdfcrowd;

class Example
{
    static void Main()
    {
        try
        {
            var client = new HtmlToPdfClient("username", "apikey");
            client.setPageSize("A4");
            client.setOrientation("landscape");
            client.setMarginTop("10mm");
            client.convertFileToFile("input.html", "output.pdf");
        }
        catch(Error why)
        {
            Console.WriteLine("Error: " + why);
        }
    }
}
Imports System
Imports Pdfcrowd

Class Example
    Shared Sub Main()
        Try
            Dim client = New HtmlToPdfClient("username", "apikey")
            client.setPageSize("A4")
            client.setOrientation("landscape")
            client.setMarginTop("10mm")
            client.convertFileToFile("input.html", "output.pdf")
        Catch why As Error
            Console.WriteLine("Error: " & why.ToString())
        End Try
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 文件转换与设置:

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

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Example
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Class Example
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        renderer.RenderingOptions.MarginTop = 10
        Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PDFmyURL 使用带有字符串参数的设置器方法(setPageSize("A4"), setOrientation("landscape"))。 这种方法要求了解 API 期望的确切字符串值。

IronPDF 通过 RenderingOptions 对象使用强类型属性。 PdfPaperSize.A4PdfPaperOrientation.Landscape 是提供 IntelliSense 支持和编译时验证的枚举值。 边距值为数值(单位为毫米),而不是带有单位后缀的字符串。

API 映射参考

对于评估将PDFmyURL移植到IronPDF的团队来说,了解 API 映射有助于估算开发工作量。

核心方法

PDFmyURL (Pdfcrowd)IronPDF
new HtmlToPdfClient("用户", "键")new ChromePdfRenderer()
client.convertUrlToFile(url, file)renderer.RenderUrlAsPdf(url).SaveAs(file)
client.convertStringToFile(html, file)renderer.RenderHtmlAsPdf(html).SaveAs(file)
client.convertFileToFile(输入,输出)renderer.RenderHtmlFileAsPdf(input).SaveAs(output)
response.GetBytes()pdf.BinaryData

配置选项

PDFmyURLIronPDF
setPageSize("A4")RenderingOptions.PaperSize = PdfPaperSize.A4
setOrientation("横向")RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
setMarginTop("10mm")RenderingOptions.MarginTop = 10
setMarginBottom("10mm")RenderingOptions.MarginBottom = 10
setMarginLeft("10mm")RenderingOptions.MarginLeft = 10
setMarginRight("10mm")RenderingOptions.MarginRight = 10
setHeaderHtml(html)RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = html }<br
setFooterHtml(html)RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = html }<br
setJavascriptDelay(500)RenderingOptions.RenderDelay = 500
setUsePrintMedia(true)RenderingOptions.CssMediaType=PdfCssMediaType.Print(渲染选项)。
setUserPassword("pass")pdf.SecuritySettings.UserPassword = "pass"

PDFmyURL无法提供的功能

IronPdf 特点说明
PdfDocument.Merge()合并多个 PDF
pdf.ExtractAllText()提取文本内容
pdf.ApplyWatermark()添加水印
pdf.SecuritySettings密码保护和加密
pdf.Form表格填写和操作
pdf.Sign()数字签名

IronPDF 的这些附加功能超越了基本的转换功能,可提供完整的 PDF 生命周期管理。 有关 PDF 操作功能,请参阅 合并和拆分 PDF 指南

隐私和数据安全

处理地点的不同会对数据处理产生重大影响。

PDFmyURL隐私注意事项:

所有文档都会传输到外部服务器并通过外部服务器。

  • 敏感合同、财务报告和个人数据由外部机构处理。
  • 无法控制第三方基础设施上的数据保留。
  • 合规要求可能禁止外部处理。

IronPDF 隐私优势:

  • 文档永远不会离开您的服务器。
  • 对数据处理拥有完全控制权。
  • 适用于受监管行业(医疗保健、金融、法律)。
  • 不泄露第三方数据。

对于处理敏感信息或按照合规要求(GDPR、HIPAA、SOC 2)运行的组织而言,本地处理消除了评估第三方数据处理实践的复杂性。

成本结构比较

订阅许可和永久许可的定价模式存在本质区别。

定价方面PDFmyURLIronPDF
模型按月订购提供永久许可证
起始成本39 美元/月一次性购买
每年成本468+ 美元/年无经常性费用
费用限制取决于计划
体积缩放需要更高层次无限制处理

对于长期项目或大批量应用而言,PDFmyURL 的订阅模式会随着时间的推移累积大量成本。IronPDF 的永久许可证选项可提供可预测的经济效益,而无需持续付费或数量限制。

身份验证模式

两种解决方案的验证方法有很大不同。

PDFmyURL验证:

// API credentials required for every conversion
var client = new HtmlToPdfClient("username", "apikey");
// API credentials required for every conversion
var client = new HtmlToPdfClient("username", "apikey");
' API credentials required for every conversion
Dim client = New HtmlToPdfClient("username", "apikey")
$vbLabelText   $csharpLabel

IronPDF 身份验证:

// One-time license configuration at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// One-time license configuration at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' One-time license configuration at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

PDFmyURL 在每次 HtmlToPdfClient 实例化时都需要凭据,这就为 API 密钥管理和暴露带来了潜在的安全隐患。 IronPdf 的许可证密钥在应用程序启动时设置一次,通常是在配置中,消除了每次请求的凭据处理。

页眉和页脚占位符语法

从PDFmyURL迁移的团队应注意动态页眉和页脚的占位符语法差异。

PDFmyURL占位符:

client.setHeaderHtml("<div>Page {page_number} of {total_pages}</div>");
client.setHeaderHtml("<div>Page {page_number} of {total_pages}</div>");
client.setHeaderHtml("<div>Page {page_number} of {total_pages}</div>")
$vbLabelText   $csharpLabel

IronPDF占位符:

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>"
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>Page {page} of {total-pages}</div>"
};
Imports System

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "<div>Page {page} of {total-pages}</div>"
}
$vbLabelText   $csharpLabel

PDFmyURL 使用 {page_number}{total_pages} ,而IronPDF使用 {page}{total-pages} 。 在任何PDFmyURL迁移工作中,都需要注意语法差异。 有关页眉和页脚的全面实现,请参阅 页眉和页脚文档

Async 模式的差异

两种解决方案处理异步操作的方式不同。

PDFmyURL async:

// PDFmyURL: Native async
var response = await client.ConvertUrlAsync(url);
// PDFmyURL: Native async
var response = await client.ConvertUrlAsync(url);
$vbLabelText   $csharpLabel

IronPDF async:

// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
$vbLabelText   $csharpLabel

PDFmyURL 提供本地异步方法,反映了其依赖于网络的架构。 IronPdf 的操作默认为同步操作,但也可封装在 Task.Run() 中,用于异步上下文。

错误处理

不同解决方案的异常类型和错误处理模式各不相同。

PDFmyURL 错误处理:

try
{
    client.convertUrlToFile(url, file);
}
catch (Pdfcrowd.Error e)
{
    Console.WriteLine("Error: " + e);
}
try
{
    client.convertUrlToFile(url, file);
}
catch (Pdfcrowd.Error e)
{
    Console.WriteLine("Error: " + e);
}
Try
    client.convertUrlToFile(url, file)
Catch e As Pdfcrowd.Error
    Console.WriteLine("Error: " & e.ToString())
End Try
$vbLabelText   $csharpLabel

IronPDF 错误处理:

try
{
    var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(file);
}
catch (IronPdf.Exceptions.IronPdfRenderingException e)
{
    Console.WriteLine("Error: " + e);
}
try
{
    var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(file);
}
catch (IronPdf.Exceptions.IronPdfRenderingException e)
{
    Console.WriteLine("Error: " + e);
}
Imports IronPdf.Exceptions

Try
    Dim pdf = renderer.RenderUrlAsPdf(url)
    pdf.SaveAs(file)
Catch e As IronPdfRenderingException
    Console.WriteLine("Error: " & e.ToString())
End Try
$vbLabelText   $csharpLabel

如果出现与 API 相关的问题(网络故障、身份验证问题、速率限制),PDFmyURL 将抛出 Pdfcrowd.Error 事件。IronPDF使用标准的 .NET 异常模式,具有特定的异常类型,如 IronPdfRenderingException

团队何时考虑从PDFmyURL迁移到 IronPDF?

有几个因素促使团队将 IronPdf 作为PDFmyURL的替代品进行评估:

隐私和合规要求:处理敏感数据的组织通常不能将文档发送到外部服务器。IronPDF的本地处理直接满足了这一要求。

成本可预测性:PDFmyURL的订阅模式会产生持续的费用,这些费用会在项目生命周期内累积。IronPDF的永久许可证选项提供固定成本,无需考虑基于数量的扩展问题。

离线功能:部署在受限网络环境或需要离线功能的应用程序不能依赖基于云的 API。IronPDF 在初始设置完成后,无需互联网连接即可运行。

扩展的 PDF 功能:PDFmyURL专注于转换,而IronPDF则在一个库中提供额外的功能——合并、拆分、文本提取、水印、表单填写和数字签名。

速率限制解除:高流量应用程序在高峰使用期间可能会遇到PDFmyURL限速。IronPDF可处理无限量文档,不受外部限制。

服务依赖消除:云 API 的可用性会影响应用程序的可靠性。 本地处理消除了对第三方服务正常运行时间的依赖。

安装比较

PDFmyURL安装:

# Install Pdfcrowd SDK
Install-Package Pdfcrowd
# Install Pdfcrowd SDK
Install-Package Pdfcrowd
SHELL

Plus API 账户设置,包括用户名和 API 密钥。

安装 IronPdf:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPdf 需要配置许可证密钥:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

两种解决方案都通过 NuGet 进行集成。 IronPdf 的首次运行会下载 Chromium 渲染引擎(约 150MB),之后可实现离线操作。 该库支持 .NET Framework、.NET Core、.NET 5+,并向前兼容到 .NET 10 和 C# 14。

做出决定

在PDFmyURL和IronPDF之间做出选择反映了不同的应用需求和组织优先级:

如果您符合以下条件,请考虑使用 PDFmyURL:您需要快速集成到小批量应用程序中,对文档处理没有隐私限制,更倾向于操作简便而不是基础设施控制,并且能够接受持续的订阅费用。

如果您有以下需求,请考虑使用 IronPDF:处理需要本地处理的敏感文档、需要可预测的成本而无需订阅费、需要离线功能或在受限网络中运行、希望除了转换之外还拥有扩展的 PDF 功能,或者处理大量文档而不用担心速率限制。

对于大多数生产应用,特别是那些处理商业文档、客户数据或按照合规要求运行的应用,IronPDF 的本地处理架构在隐私性、成本可预测性和功能广泛性方面具有显著优势。

开始使用 IronPDF

如需评估 IronPdf 是否满足您的 PDF 生成需求,请联系我们:

1.通过 NuGet 安装:安装-打包 IronPdf 2.查看 入门文档</a 3.探索 HTML 转 PDF 教程 的转换模式 4.请查看 API 参考 以获取完整的方法文档

IronPDF 教程提供了全面的示例,涵盖从基本转换到高级 PDF 操作的常见场景。

结论

PDFmyURL 和IronPDF代表了在 .NET 应用程序中生成 PDF 的根本不同方法。PDFmyURL提供基于云的便利性,但需要权衡外部数据处理、持续订阅成本和互联网依赖性。IronPDF提供具有隐私保证的本地处理控制、永久许可选项和扩展 PDF 功能。

决策范围不仅包括技术实施,还包括围绕数据处理、成本结构和能力需求的组织要求。 对于需要文档隐私、可预测的经济性或基本转换以外功能的应用,IronPDF 的本地处理架构可在您的受控环境中提供全面的解决方案。

在选择这些方法时,请评估您的具体要求--隐私限制、数量预期、功能需求和成本偏好。 处理位置的选择不仅会影响技术实施,还会影响合规性、运营成本和长期应用架构。