跳至页脚内容
迁移指南

如何用 C# 从 PDFmyURL 迁移到 IronPDF

从PDFmyURL迁移到 IronPDF:完整的 C# 开发人员指南。

PDFmyURL 是一项基于云的 API 服务,旨在将 URL 和 HTML 内容转换为 PDF 文档。 该服务在外部服务器上处理所有转换,提供了一个直接的集成路径,只需最少的本地基础设施。 然而,对于处理敏感数据、需要离线功能或需要避免持续订阅成本的生产应用程序来说,这种依赖云的架构会带来很大的问题。

本指南提供了从PDFmyURL到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。

为什么要从PDFmyURL迁移

PDFmyURL 的云处理模式带来了开发团队必须考虑的几个挑战:

隐私和数据安全:您转换的每份文档都会在PDFmyURL的服务器上传输,敏感的合同、财务报告和个人数据都会在外部处理。

持续订阅成本:起价为 39 美元/月,年费超过 468 美元/年,且无所有权。这种订阅模式意味着无论使用模式如何,都将持续支出。

互联网依赖性:每次转换都需要网络连接。 应用程序不能离线或在网络中断时处理 PDF。

速率限制和节流:在使用高峰期,API 调用可能会被节流,从而对应用程序性能造成潜在影响。

服务可用性:您的应用程序依赖于第三方服务的在线和功能性。

供应商锁定:API 的更改可能会在未通知的情况下破坏您的集成,因此需要进行反应式代码更新。

IronPDF与 PDFmyURL:功能比较

了解架构差异有助于技术决策者评估迁移投资:

方面PDFmyURLIronPDF
处理地点外部服务器本地(您的服务器)
类型应用程序接口封装.NET 库
身份验证每次请求的 API 密钥一次性许可证密钥
网络要求每次转换仅初始设置
定价模式按月订购(39 美元以上)提供永久许可证
费用限制是(取决于计划)
数据隐私外部发送的数据数据保持本地化
HTML/CSS/JS 支持符合 W3C 标准完整的 Chromium 引擎
同步模式要求(仅限异步)同步和异步选项
PDF 操作有限的全套(合并、拆分、编辑)
使用案例少量应用大批量和企业

快速入门:PDFmyURL 到IronPDF的迁移。

迁移工作可以通过以下基本步骤立即开始。

步骤 1:替换 NuGet 软件包

删除PDFmyURL软件包:

# RemovePDFmyURLpackages
dotnet remove package PdfMyUrl
dotnet remove package Pdfcrowd
# RemovePDFmyURLpackages
dotnet remove package PdfMyUrl
dotnet remove package Pdfcrowd
SHELL

安装 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

步骤 2:更新命名空间

用 IronPdf 替换PDFmyURL命名空间:

// Before: PDFmyURL
using PdfMyUrl;
using Pdfcrowd;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PDFmyURL
using PdfMyUrl;
using Pdfcrowd;

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

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化:

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

代码迁移示例

将 URL 转换为 PDF

URL-to-PDF 操作演示了PDFmyURL和IronPDF之间基本的 API 差异。

PDFmyURL 方法:

// 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);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 方法:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL 要求为每个转换请求创建一个带有用户名和 API 密钥凭证的<代码>HtmlToPdfClient</代码,然后调用带有 URL 和输出路径的 convertUrlToFile() 。 整个操作必须用PDFmyURL的自定义 Error 类型的 try-catch 封装。

IronPDF 将此简化为三行:创建 ChromePdfRenderer, 调用 RenderUrlAsPdf(), 并使用内置的 SaveAs() 方法。 无需每次请求的证书--许可证在应用程序启动时设置一次。

有关高级 URL-to-PDF 场景,请参阅 URL to PDF 文档

将HTML字符串转换为PDF

HTML 字符串转换清楚地显示了模式差异。

PDFmyURL 方法:

// 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);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 方法:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL 使用 convertStringToFile() 将 HTML 内容发送到外部服务器进行处理。IronPDF的 RenderHtmlAsPdf() 使用 Chromium 渲染引擎在本地处理所有内容。

探索 HTML 至 PDF 转换指南,了解更多选项。

带页面设置的 HTML 文件转换

配置纸张大小、方向和页边距需要在每个库中采用不同的方法。

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);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL 使用带有字符串参数的设置器方法,如<代码>setPageSize("A4")</代码和<代码>setMarginTop("10mm")</代码。IronPDF通过 RenderingOptions 提供强类型属性,如 PdfPaperSize.A4 枚举和以毫米为单位的页边距整数值。

PDFmyURLAPI 到IronPDF映射参考

这种映射通过显示直接的 API 对应关系来加速迁移:

核心类

PDFmyURLIronPDF备注
<代码>HtmlToPdfClient</代码<代码>ChromePdfRenderer</代码主要转换类
<代码>PdfMyUrlClient</代码<代码>ChromePdfRenderer</代码替代客户端类
API 响应对象<代码>PDF 文档</代码结果 PDF 对象

方法

PDFmyURLIronPDF备注
<代码>client.convertUrlToFile(url, file)</ 代码<代码>renderer.RenderUrlAsPdf(url).SaveAs(file)</代码URL 至 PDF
<代码>client.convertStringToFile(html, file)</ 代码<代码>renderer.RenderHtmlAsPdf(html).SaveAs(file)</代码HTML 字符串到 PDF
<代码>client.convertFileToFile(输入,输出)</代码<代码>renderer.RenderHtmlFileAsPdf(input).SaveAs(output)</代码文件到文件
<代码>response.GetBytes()</代码<代码>pdf.BinaryData</代码获取原始字节
<代码>response.GetStream()</代码<代码>pdf.Stream</代码以流形式获取

配置选项

PDFmyURL (setXxx 方法)IronPdf (渲染选项)备注
<代码>setPageSize("A4")</代码<代码>.PaperSize = PdfPaperSize.A4</ 代码纸张大小
<代码>setPageSize("Letter")</代码<代码>.PaperSize = PdfPaperSize.Letter</ 代码美国信函
<代码>setOrientation("横向")</代码<代码>.PaperOrientation = PdfPaperOrientation.Landscape</ 代码定位
<代码>setOrientation("portrait")</代码<代码>.PaperOrientation = PdfPaperOrientation.Portrait</ 代码肖像
<代码>setMarginTop("10mm")</代码<代码>.MarginTop = 10</ 代码顶边距(毫米)
<代码>setMarginBottom("10mm")</代码<代码>.MarginBottom = 10</ 代码底边距(毫米)
<代码>setMarginLeft("10mm")</代码<代码>.MarginLeft = 10</ 代码左页边距(毫米)
<代码>setMarginRight("10mm")</代码<代码>.MarginRight = 10</ 代码右边距(毫米)
<代码>setHeaderHtml(html)</代码.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = html }.页眉
<代码>setFooterHtml(html)</代码.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = html }.页脚
<代码>setJavascriptDelay(500)</代码.RenderDelay = 500.JS 等待时间(毫秒)
<代码>setDisableJavascript(true)</代码.EnableJavaScript = false.禁用 JS
<代码>setUsePrintMedia(true)</代码.CssMediaType = PdfCssMediaType.Print.打印 CSS

身份验证比较

PDFmyURLIronPDF
<代码>new HtmlToPdfClient("username", "apikey")</代码<代码>IronPDF.License.LicenseKey = "LICENSE-KEY"</ 代码
每次请求的 API 密钥启动时一次性
每次通话都需要全球设置一次

常见迁移问题和解决方案

问题 1:API 密钥与许可证密钥

PDFmyURL:每次转换请求都需要证书。

解决方案:在应用程序启动时设置一次IronPDF许可证:

// PDFmyURL: API key per request
var client = new HtmlToPdfClient("username", "apikey");

// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
// PDFmyURL: API key per request
var client = new HtmlToPdfClient("username", "apikey");

// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 2:页眉/页脚中的占位符语法

PDFmyURL: 使用 {page_number}{total_pages} 占位符。

解决方案:更新为IronPDF的占位符格式:

// PDFmyURL: "Page {page_number} of {total_pages}"
// IronPDF: "Page {page} of {total-pages}"
// PDFmyURL: "Page {page_number} of {total_pages}"
// IronPDF: "Page {page} of {total-pages}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 3 期:异步模式

PDFmyURL:需要异步/等待模式。

解决方案:IronPDF默认为同步; 如有需要,请对 async 进行包装:

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

// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
// PDFmyURL: Native async
var response = await client.ConvertUrlAsync(url);

// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 4:错误处理

PDFmyURL:使用自定义 Pdfcrowd.Error 异常类型。

解决方案:更新IronPDF异常的捕获块:

// PDFmyURL: Pdfcrowd.Error
catch (Pdfcrowd.Error e) { ... }

// IronPDF: Standard exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
// PDFmyURL: Pdfcrowd.Error
catch (Pdfcrowd.Error e) { ... }

// IronPDF: Standard exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 5 期:配置模式

PDFmyURL:使用带有字符串值的设置器方法。

解决方案:使用强类型的 RenderingOptions 属性:

// PDFmyURL: Setter methods
client.setPageSize("A4");
client.setOrientation("landscape");

// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// PDFmyURL: Setter methods
client.setPageSize("A4");
client.setOrientation("landscape");

// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDFmyURL迁移清单

迁移前任务

审核您的代码库,以确定PDFmyURL的所有使用情况:

# FindPDFmyURLusage
grep -r "PdfMyUrl\|Pdfcrowd\|HtmlToPdfClient" --include="*.cs" .

# Find API key references
grep -r "apikey\|api-key\|api_key" --include="*.cs" --include="*.json" --include="*.config" .

# Find placeholder patterns to migrate
grep -r "{page_number}\|{total_pages}" --include="*.cs" .
# FindPDFmyURLusage
grep -r "PdfMyUrl\|Pdfcrowd\|HtmlToPdfClient" --include="*.cs" .

# Find API key references
grep -r "apikey\|api-key\|api_key" --include="*.cs" --include="*.json" --include="*.config" .

# Find placeholder patterns to migrate
grep -r "{page_number}\|{total_pages}" --include="*.cs" .
SHELL

记录当前使用的配置选项。 使用环境变量规划许可证密钥存储。

代码更新任务

1.删除 PDFmyURL/Pdfcrowd NuGet 软件包 2.安装 IronPdf NuGet 软件包 3.更新所有命名空间导入 4.用 IronPdf 许可证密钥替代 API 密钥验证 5.将设置器方法转换为 RenderingOptions 属性 6.更新页眉/页脚中的占位符语法({page_number}{page}, {total_pages}{total-pages}) 7.更新 IronPdf 异常类型的错误处理代码 8.在启动时添加 IronPdf 许可证初始化功能

迁移后测试

迁移后,验证这些方面:

  • 测试 PDF 输出质量是否符合预期
  • 验证异步模式是否正常工作
  • 将渲染保真度与以前的输出进行比较
  • 测试所有模板变体是否能正确呈现
  • 验证页面设置(大小、方向、页边距)
  • 如果部署到 Linux 服务器,请安装 Linux 依赖项

迁移到IronPDF的主要优势

从PDFmyURL迁移到IronPDF有几个关键优势:

完全隐私:文档永远不会离开您的服务器。 所有处理都在本地进行,消除了敏感内容的数据安全顾虑。

一次性成本:永久许可选项免除了经常性订阅费用。 无论使用量多少,都不再需要每月付款。

离线功能:初始设置后无需网络即可使用。网络中断不会影响 PDF 生成。

无速率限制:处理不受限制的文档,无节流问题。

更低的延迟:没有网络开销意味着更快的转换速度,尤其是对于大容量应用程序而言。

完全控制:您可以控制处理环境,而不是第三方服务。

现代 Chromium 引擎:采用与 Chrome 浏览器相同的渲染引擎,全面支持 CSS3 和 JavaScript。

主动开发:随着 .NET 10 和 C# 14 在 2026 年之前的采用率不断提高,IronPDF 的定期更新可确保与当前和未来的 .NET 版本兼容。

结论

PDFmyURL 为少量 PDF 生成需求提供了直接的基于云的解决方案。 然而,外部处理模式会产生隐私问题、持续成本和依赖风险,这是许多生产应用程序无法接受的。

IronPdf 提供本地处理功能,可将敏感数据保存在服务器上,通过永久许可免除订阅费用,并提供基于 Chromium 的现代渲染引擎。迁移路径简单明了:替换 NuGet 软件包,将设置器方法更新为强类型属性,并调整占位符语法。

立即开始迁移,免费试用 IronPDF,体验本地 PDF 处理的优势。

有关全面的实施指导,请浏览 IronPDF 文档教程

Curtis Chau
技术作家

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

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