如何在 C# | IronPDF 中将 QR 码转换为 PDF
PDFmyURL 是一项基于云的 API 服务,旨在将 URL 和 HTML 内容转换为 PDF 文档。 该服务在外部服务器上处理所有转换,提供了一个直接的集成路径,只需最少的本地基础设施。 然而,对于处理敏感数据、需要离线功能或需要避免持续订阅成本的生产应用程序来说,这种依赖云的架构会带来很大的问题。
本指南提供了从PDFmyURL到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。
为什么要从PDFmyURL迁移
PDFmyURL 的云处理模式带来了开发团队必须考虑的几个挑战:
隐私和数据安全:您转换的每个文档都会传输到PDFmyURL的服务器并经过其服务器——敏感合同、财务报告和个人数据都在外部进行处理。
持续订阅费用:计划起价为$20/月(Starter,500 PDFs)、$40/月(Professional,2000 PDFs)和$70/月(Advanced,5000 PDFs),各层级不提供所有权。 这种订阅模式意味着无论使用情况如何都要持续支出。
互联网依赖性:每次转换都需要网络连接。 应用程序不能离线或在网络中断时处理 PDF。
速率限制和节流:在高峰使用期间,API 调用可能会受到节流,这可能会影响应用程序的性能。
服务可用性:您的应用程序依赖于第三方服务在线且功能正常。
供应商锁定: API 变更可能会在未事先通知的情况下破坏您的集成,需要被动地更新代码。
IronPDF与 PDFmyURL:功能比较
了解架构差异有助于技术决策者评估迁移投资:
| 方面 | PDFmyURL | IronPDF |
|---|---|---|
| 处理地点 | 外部服务器 | 本地(您的服务器) |
| 类型 | 应用程序接口封装 | .NET 库 |
| 身份验证 | 每次请求的 API 密钥 | 一次性许可证密钥 |
| 网络要求 | 每次转换 | 仅初始设置 |
| 定价模式 | 月度订阅($20–$70+) | 提供永久许可证 |
| 费用限制 | 是(取决于计划) | None |
| 数据隐私 | 外部发送的数据 | 数据保持本地化 |
| HTML/CSS/JS 支持 | 服务器端渲染(W3C合规) | 完整的 Chromium 引擎 |
| 同步模式 | HTTP请求(网络绑定) | 同步和异步选项 |
| PDF 操作 | 有限的 | 全套(合并、拆分、编辑) |
| 使用案例 | 少量应用 | 大批量和企业 |
快速入门:PDFmyURL 到IronPDF的迁移
迁移工作可以通过以下基本步骤立即开始。
步骤1:安装IronPDF
PDFmyURL没有NuGet包——该服务是一个REST API,并且可选的PDFmyURL.NET.dll组件作为直接DLL下载(不在nuget.org上)。 大多数集成通过WebClient / HttpClient调用API,因此迁移主要涉及代码,而不是包引用。 如果您使用了PDFmyURL.NET.dll程序集,请在迁移后从您的项目中删除引用。
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
步骤 2:更新命名空间
用IronPDF替换PDFmyURL导入:
// Before:PDFmyURL— either plain HttpClient/WebClient against pdfmyurl.com/api,
// or the optional .NET component:
using PDFmyURLdotNET; // only if you used PDFmyURL.NET.dll
using System.Net; // WebClient / HttpClient
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before:PDFmyURL— either plain HttpClient/WebClient against pdfmyurl.com/api,
// or the optional .NET component:
using PDFmyURLdotNET; // only if you used PDFmyURL.NET.dll
using System.Net; // WebClient / HttpClient
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports PDFmyURLdotNET ' only if you used PDFmyURL.NET.dll
Imports System.Net ' WebClient / HttpClient
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
步骤 3:初始化许可证
在应用程序启动时添加许可证初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
代码迁移示例
将 URL 转换为 PDF
URL-to-PDF 操作演示了PDFmyURL和IronPDF之间基本的 API 差异。
PDFmyURL 方法:
//PDFmyURLREST API — no NuGet SDK. Docs: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string url = "https://example.com";
try
{
using (var client = new WebClient())
{
client.QueryString.Add("license", license);
client.QueryString.Add("url", url);
// PDF binary is returned in the response body
client.DownloadFile("https://pdfmyurl.com/api", "output.pdf");
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
//PDFmyURLREST API — no NuGet SDK. Docs: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string url = "https://example.com";
try
{
using (var client = new WebClient())
{
client.QueryString.Add("license", license);
client.QueryString.Add("url", url);
// PDF binary is returned in the response body
client.DownloadFile("https://pdfmyurl.com/api", "output.pdf");
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
Imports System
Imports System.Net
Module Example
Sub Main()
Dim license As String = "your-license-key"
Dim url As String = "https://example.com"
Try
Using client As New WebClient()
client.QueryString.Add("license", license)
client.QueryString.Add("url", url)
' PDF binary is returned in the response body
client.DownloadFile("https://pdfmyurl.com/api", "output.pdf")
End Using
Catch ex As WebException
Console.WriteLine("Error: " & ex.Message)
End Try
End Sub
End Module
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");
}
}
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
PDFmyURL要求在每次转换时打开到url作为查询(或表单)参数,并将响应体写入磁盘。 错误根据HTTP状态码作为WebException浮现。
IronPDF简化为三行:创建一个SaveAs()方法。 不需要每次请求的凭据——许可证在应用程序启动时设置一次。
有关高级 URL-to-PDF 场景,请参阅 URL to PDF 文档。
将HTML字符串转换为PDF
HTML 字符串转换清楚地显示了模式差异。
PDFmyURL 方法:
//PDFmyURLREST API — no NuGet SDK. Send the raw HTML in the `html` parameter.
// Docs: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string html = "<html><body><h1>Hello World</h1></body></html>";
try
{
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "license", license },
{ "html", html }
};
// POST form-encoded; response body is the PDF binary
byte[] pdfBytes = client.UploadValues("https://pdfmyurl.com/api", "POST", values);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
//PDFmyURLREST API — no NuGet SDK. Send the raw HTML in the `html` parameter.
// Docs: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string html = "<html><body><h1>Hello World</h1></body></html>";
try
{
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "license", license },
{ "html", html }
};
// POST form-encoded; response body is the PDF binary
byte[] pdfBytes = client.UploadValues("https://pdfmyurl.com/api", "POST", values);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
Imports System
Imports System.Collections.Specialized
Imports System.IO
Imports System.Net
Class Example
Shared Sub Main()
Dim license As String = "your-license-key"
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Try
Using client As New WebClient()
Dim values As New NameValueCollection From {
{"license", license},
{"html", html}
}
' POST form-encoded; response body is the PDF binary
Dim pdfBytes As Byte() = client.UploadValues("https://pdfmyurl.com/api", "POST", values)
File.WriteAllBytes("output.pdf", pdfBytes)
End Using
Catch ex As WebException
Console.WriteLine("Error: " & ex.Message)
End Try
End Sub
End Class
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");
}
}
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
PDFmyURL在html表单参数中发送原始HTML到其API端点,并以响应体的形式返回渲染的PDF。 IronPDF的RenderHtmlAsPdf()使用Chromium渲染引擎本地处理所有内容。
探索 HTML 至 PDF 转换指南,了解更多选项。
带页面设置的 HTML 文件转换
配置纸张大小、方向和页边距需要在每个库中采用不同的方法。
PDFmyURL 方法:
//PDFmyURLREST API — no NuGet SDK. Page settings are sent as query/form parameters.
// Parameter reference: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string html = File.ReadAllText("input.html");
try
{
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "license", license },
{ "html", html },
{ "page_size", "A4" },
{ "orientation", "landscape" },
{ "top", "10" },
{ "unit", "mm" }
};
byte[] pdfBytes = client.UploadValues("https://pdfmyurl.com/api", "POST", values);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
//PDFmyURLREST API — no NuGet SDK. Page settings are sent as query/form parameters.
// Parameter reference: https://pdfmyurl.com/html-to-pdf-api
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
class Example
{
static void Main()
{
string license = "your-license-key";
string html = File.ReadAllText("input.html");
try
{
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "license", license },
{ "html", html },
{ "page_size", "A4" },
{ "orientation", "landscape" },
{ "top", "10" },
{ "unit", "mm" }
};
byte[] pdfBytes = client.UploadValues("https://pdfmyurl.com/api", "POST", values);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
Imports System
Imports System.Collections.Specialized
Imports System.IO
Imports System.Net
Class Example
Shared Sub Main()
Dim license As String = "your-license-key"
Dim html As String = File.ReadAllText("input.html")
Try
Using client As New WebClient()
Dim values As New NameValueCollection From {
{"license", license},
{"html", html},
{"page_size", "A4"},
{"orientation", "landscape"},
{"top", "10"},
{"unit", "mm"}
}
Dim pdfBytes As Byte() = client.UploadValues("https://pdfmyurl.com/api", "POST", values)
File.WriteAllBytes("output.pdf", pdfBytes)
End Using
Catch ex As WebException
Console.WriteLine("Error: " & ex.Message)
End Try
End Sub
End Class
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
PDFmyURL通过添加类似于in)来配置页面。 IronPDF通过PdfPaperSize.A4的枚举以及以毫米为单位的整数边距值提供强类型属性。
PDFmyURLAPI 到IronPDF映射参考
这种映射通过显示直接的 API 对应关系来加速迁移:
核心类/入口点
| PDFmyURL | IronPDF |
|---|---|
WebClient / https://pdfmyurl.com/api |
ChromePdfRenderer |
PDFmyURL.NET.dll的可选.NET组件) |
ChromePdfRenderer |
| 表单/查询参数 | ChromePdfRenderOptions |
| HTTP响应体字节 | PdfDocument |
方法
| PDFmyURL | IronPDF |
|---|---|
WebClient.DownloadFile(".../api?license=...&url=...", file) |
renderer.RenderUrlAsPdf(url).SaveAs(file) |
带有html=参数的POST请求 |
renderer.RenderHtmlAsPdf(html) |
File.ReadAllText("input.html")然后POST html= |
renderer.RenderHtmlFileAsPdf(path) |
pdf.ConvertURL(url, file) (PDFmyURL.NET.dll) |
renderer.RenderUrlAsPdf(url).SaveAs(file) |
pdf.ConvertHTML(html, file) (PDFmyURL.NET.dll) |
renderer.RenderHtmlAsPdf(html).SaveAs(file) |
HTTP响应体(byte[]) |
pdf.BinaryData |
| HTTP响应流 | new MemoryStream(pdf.BinaryData) |
配置选项
PDFmyURL设置以表单/查询参数的形式在HTTP请求中传递。下表将真实的PDFmyURL参数名称映射到IronPDF的RenderingOptions。
| PDFmyURL参数 | IronPDF (渲染选项) |
|---|---|
page_size=A4 |
.PaperSize = PdfPaperSize.A4 |
page_size=Letter |
.PaperSize = PdfPaperSize.Letter |
orientation=landscape |
.PaperOrientation = PdfPaperOrientation.Landscape |
orientation=portrait |
.PaperOrientation = PdfPaperOrientation.Portrait |
top=10&unit=mm |
.MarginTop = 10 |
bottom=10&unit=mm |
.MarginBottom = 10 |
left=10&unit=mm |
.MarginLeft = 10 |
right=10&unit=mm |
.MarginRight = 10 |
header=<html> |
.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = html } |
footer=<html> |
.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = html } |
javascript_time=500 |
.RenderDelay = 500 |
no_javascript=true |
.EnableJavaScript = false |
css_media_type=print |
.CssMediaType = PdfCssMediaType.Print |
身份验证比较
| PDFmyURL | IronPDF |
|---|---|
每个API请求上的license=<key>查询/表单参数 |
IronPdf.License.LicenseKey = "LICENSE-KEY" |
| 每次请求的许可令牌 | 启动时一次性 |
| 每次通话都需要 | 全球设置一次 |
常见迁移问题和解决方案
问题1:许可令牌vs许可密钥
PDFmyURL:每个API请求需要license令牌。
解决方案:在应用程序启动时设置一次IronPDF许可证:
// PDFmyURL: license token per request
client.QueryString.Add("license", "your-license-key");
// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
// PDFmyURL: license token per request
client.QueryString.Add("license", "your-license-key");
// IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once, typically in Program.cs or Startup.cs
' PDFmyURL: license token per request
client.QueryString.Add("license", "your-license-key")
' IronPDF: One-time license at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' Set once, typically in Program.vb or Startup.vb
问题 2:页眉/页脚中的占位符语法
PDFmyURL:在header / [topage]等令牌(请咨询实时API参考以获取规范的令牌列表)。
解决方案:在HtmlHeaderFooter.HtmlFragment内更新到IronPDF的占位符格式:
// PDFmyURL: "Page [page] of [topage]"
// IronPDF: "Page {page} of {total-pages}"
// PDFmyURL: "Page [page] of [topage]"
// IronPDF: "Page {page} of {total-pages}"
' PDFmyURL: "Page [page] of [topage]"
' IronPDF: "Page {page} of {total-pages}"
第 3 期:异步模式
PDFmyURL: 是一次远程HTTP调用; 通常使用pdfmyurl.com/api调用。
解决方案: IronPDF默认是进程内和同步的; 如有需要,请对 async 进行包装:
// PDFmyURL: HTTP request to the public endpoint
var response = await http.PostAsync("https://pdfmyurl.com/api", form);
// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
// PDFmyURL: HTTP request to the public endpoint
var response = await http.PostAsync("https://pdfmyurl.com/api", form);
// IronPDF: Sync by default, wrap for async
var pdf = await Task.Run(() => renderer.RenderUrlAsPdf(url));
Imports System.Net.Http
Imports System.Threading.Tasks
' PDFmyURL: HTTP request to the public endpoint
Dim response = Await http.PostAsync("https://pdfmyurl.com/api", form)
' IronPDF: Sync by default, wrap for async
Dim pdf = Await Task.Run(Function() renderer.RenderUrlAsPdf(url))
问题 4:错误处理
PDFmyURL: HTTP级别的故障(无效许可、速率限制、网络错误、服务不可用)作为WebException / 非成功状态代码浮现。
解决方案: 更新处理IronPDF类型化异常的catch块:
// PDFmyURL: WebException from the HTTP call
catch (WebException e) { ... }
// IronPDF: Typed exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
// PDFmyURL: WebException from the HTTP call
catch (WebException e) { ... }
// IronPDF: Typed exceptions
catch (IronPdf.Exceptions.IronPdfRenderingException e) { ... }
第 5 期:配置模式
PDFmyURL: 配置作为表单/查询参数传递在HTTP请求中。
解决方案:使用强类型的 RenderingOptions 属性:
// PDFmyURL: form/query parameters
values.Add("page_size", "A4");
values.Add("orientation", "landscape");
// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// PDFmyURL: form/query parameters
values.Add("page_size", "A4");
values.Add("orientation", "landscape");
// IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' PDFmyURL: form/query parameters
values.Add("page_size", "A4")
values.Add("orientation", "landscape")
' IronPDF: Properties with enums
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
PDFmyURL迁移清单
迁移前任务
审核您的代码库,以确定PDFmyURL的所有使用情况:
# FindPDFmyURLendpoint and component usage
grep -r "pdfmyurl.com/api\|PDFmyURLdotNET\|new PDFmyURL(" --include="*.cs" .
# Find license-token references
grep -r "license=\|licensekey" --include="*.cs" --include="*.json" --include="*.config" .
# Find placeholder patterns to migrate
grep -r "\[page\]\|\[topage\]" --include="*.cs" .
# FindPDFmyURLendpoint and component usage
grep -r "pdfmyurl.com/api\|PDFmyURLdotNET\|new PDFmyURL(" --include="*.cs" .
# Find license-token references
grep -r "license=\|licensekey" --include="*.cs" --include="*.json" --include="*.config" .
# Find placeholder patterns to migrate
grep -r "\[page\]\|\[topage\]" --include="*.cs" .
记录当前使用的配置参数(页面大小、方向、边距、页眉/页脚等)。 使用环境变量规划许可证密钥存储。
代码更新任务
- 如果使用过,请移除可选的
PDFmyURL.NET.dll引用(没有要卸载的NuGet包) - 安装IronPDF NuGet包 3.更新所有命名空间导入
- 将每次请求的
IronPdf.License.LicenseKey - 将表单/查询参数转换为
RenderingOptions属性 - 更新页眉/页脚中的占位符语法(例如
[page]→[topage]→{total-pages}) - 更新错误处理代码(
WebException→ 类型化的IronPDF异常) 8.在启动时添加IronPDF许可证初始化功能
迁移后测试
迁移后,验证这些方面:
- 测试 PDF 输出质量是否符合预期
- 验证异步模式是否正常工作
- 将渲染保真度与以前的输出进行比较
- 测试所有模板变体是否能正确呈现
- 验证页面设置(大小、方向、页边距)
- 如果部署到 Linux 服务器,请安装 Linux 依赖项
迁移到IronPDF的主要优势
从PDFmyURL迁移到IronPDF有几个关键优势:
完全隐私:文档绝不会离开您的服务器。 所有处理都在本地进行,消除了敏感内容的数据安全顾虑。
一次性费用:永久授权选项免除定期订阅费用。 无论使用量多少,都不再需要每月付款。
离线功能:完成初始设置后,无需网络连接即可工作。网络中断不会影响 PDF 生成。
无速率限制:处理无限量文档,无需担心限速问题。
更低的延迟:没有网络开销意味着更快的转换速度,尤其适用于高容量应用。
完全控制:您控制处理环境,而不是第三方服务。
现代 Chromium 引擎:完全支持 CSS3 和 JavaScript,采用与 Chrome 浏览器相同的渲染引擎。
活跃开发:IronPDF的定期更新确保与现代.NET版本兼容。

