如何在 C# | IronPDF 中將 QR 碼轉換為 PDF
PDFmyURL 是一項基於雲的API服務,設計用於將URL和HTML內容轉換為PDF文件。 該服務在外部伺服器上處理所有轉換,提供了一條簡單的整合路徑,僅需最低限度的本地基礎設施。 然而,這種依賴雲的架構對於處理敏感資料、需要離線功能或避免持續訂閱費用的生產應用程式來說,帶來了重大挑戰。
本指南提供從PDFmyURL遷移到IronPDF的完整遷移路徑,包括分步指南、程式碼比較和針對專業.NET開發者評估此過渡的實用範例。
為什麼要從PDFmyURL遷移
PDFmyURL的雲處理模型引入了一些開發團隊必須考慮的挑戰:
隱私與資料安全:您轉換的每個文件都會經過PDFmyURL的伺服器處理——敏感合同、財務報告和個人資料都在外部處理。
持續訂閱成本:計畫起價為$20/月(入門,500份PDF),$40/月(專業,2,000份PDF),和$70/月(高級,5,000份PDF),各級均無所有權。 這種訂閱模式意味著無論使用模式如何,都需持續支出。
網路依賴:每次轉換均需網路連接。 應用程式無法在離線或網路中斷時處理PDF。
速率限制與節流:在高峰使用期間,API調用可能會被限制,可能影響應用程式性能。
服務可用性:您的應用程式依賴於第三方服務的在線和功能。
供應商鎖定:API變更可能會無預警破壞您的整合,需要反應迅速的程式碼更新。
IronPDFvs PDFmyURL:功能比較
了解結構差異有助於技術決策者評估遷移投資:
| 方面 | PDFmyURL | IronPDF |
|---|---|---|
| 處理位置 | 外部伺服器 | 本地(您的伺服器) |
| 型別 | API 包裝器 | .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:更新命名空間
將PDFmyURL的導入替換為IronPDF:
// 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到PDF的操作演示了PDFmyURL與IronPDF之間的基本API差異。
PDFmyURL方法:
// PDFmyURL REST 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);
}
}
}
// PDFmyURL REST 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
Class Example
Shared 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 Class
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到PDF場景,請參見URL到PDF文件。
將HTML字串轉換為PDF
HTML字串轉換清楚展示了模式差異。
PDFmyURL方法:
// PDFmyURL REST 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);
}
}
}
// PDFmyURL REST 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表單參數POST到其API端點,返回渲染的PDF作為響應正文。 IronPDF的RenderHtmlAsPdf()在本地使用Chromium渲染引擎處理所有內容。
探索HTML到PDF轉換指南以獲得更多選項。
使用頁面設置進行HTML文件轉換
配置紙張大小、方向和邊距需要在每個程式庫中使用不同的方法。
PDFmyURL方法:
// PDFmyURL REST 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);
}
}
}
// PDFmyURL REST 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等枚舉和以毫米為單位的整數邊距值。
PDFmyURL API到IronPDF映射參考
此映射透過展示直接的 API 等價加速遷移:
核心類別/入口點
| PDFmyURL | IronPDF |
|---|---|
WebClient / HttpClient 發送至 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") 然後發送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(RenderingOptions) |
|---|---|
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參考以獲得正規標記列表)。
解決方案:更新為IronPDF佔位符格式在HtmlHeaderFooter.HtmlFragment中:
// 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預設為進程內同步操作; 如果需要,封裝以實現異步:
// 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/非成功狀態碼。
解決方案:更新catch塊為IronPDF的型別化異常:
// 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的使用情況:
# Find PDFmyURL endpoint 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" .
# Find PDFmyURL endpoint 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" .
記錄當前使用的配置參數(page_size、orientation、margins、header/footer等)。 計劃使用環境變數保存授權金鑰。
程式碼更新任務
- 如果您使用了可選的
PDFmyURL.NET.dll引用,請將其刪除(沒有需要解除安裝的NuGet包) - 安裝IronPDF NuGet包
- 更新所有命名空間導入
- 將每次請求的
IronPdf.License.LicenseKey - 將表單/查詢參數轉換為
RenderingOptions屬性 - 更新標題/頁尾中的佔位符語法(例如
{total-pages}) - 更新錯誤處理程式碼(
WebException→型別化IronPDF異常) - 在啟動時新增IronPDF授權初始化
遷移後測試
遷移後,驗證以下方面:
- 測試PDF輸出質量是否符合預期
- 驗證異步模式運行正常
- 比較渲染保真度與先前的輸出
- 測試所有模板變體是否正確渲染
- 驗證頁面設置(大小、方向、邊距)
- 如果部署到Linux伺服器,則安裝Linux依賴項
遷移到IronPDF的關鍵好處
從PDFmyURL遷移到IronPDF提供了幾個關鍵優勢:
完全隱私:文件絕不離開您的伺服器。 所有處理都在本地進行,消除了敏感內容的資料安全問題。
一次性費用:永久授權選項消除了持續的訂閱費用。 無論使用量如何,均不再需要每月付款。
離線能力:初始設置後無需網路即可工作。網路中斷不會影響PDF生成。
無速率限制:無節流擔憂地處理無限文件。
低延遲:無網路開銷意味著更快的轉換,特別是對於高量應用程式。
全控:您控制處理環境,而非第三方服務。
現代Chromium引擎:完整的CSS3和JavaScript支持,使用與Chrome瀏覽器相同的渲染引擎。
積極開發:IronPDF的定期更新確保與當前現代.NET版本相容。

