如何使用 C# 將 XML 轉換為 PDF
從PdfPig遷移到IronPDF可以擴展您的PDF功能,從一個專注於閱讀的程式庫(具有基於座標的撰寫和基本合併的狹窄編寫介面)轉變為一個全面的PDF解決方案,可處理建立、操作、文字提取和安全性功能。 本指南提供完整且逐步的遷移路徑,保留您現有的提取工作流程,同時增加HTML轉換、高層次文件操作、浮水印和安全撰寫,這些是PdfPig不提供的。
為何從PdfPig遷移到IronPDF
了解PdfPig
PdfPig(NuGet套件UglyToad.PdfPig)是一個開源.NET PDF閱讀和提取程式庫,最初受Apache PDFBox Java專案啟發,並部分移植自該專案。 它允許開發者以高精度存取PDF的結構內容。 雖然PdfPig在提取方面表現出色,但其範圍比完整生命週期的商業程式庫更窄。 該專案仍為pre-1.0(目前穩定發布版為0.1.14),其README中指出"在版本低於1.0.0時,小版本將無需警告更改公共API。"
PdfPig提供可靠的工具來提取文字(具有字母和單詞級位置)、圖像、只讀的表單資料、註釋和元資料。 它還暴露了有限的編寫介面——UglyToad.PdfPig.Writer中)用於合併現有的PDF文件。 這使得它成為一個主要專注於文件分析、資料挖掘和基本合併的應用程式的合適選擇。
閱讀為主的限制
PdfPig是以閱讀為先,其編寫介面是有意設計得很狹窄。 當您的應用程式需要超越提取和基本合併時,PdfPig無法提供幫助:
-
有限的PDF生成: 新文件需要通過
PdfPoint手動座標放置,無法進行高層次布局。 -
沒有HTML到PDF轉換: PdfPig是一個PDF閱讀/解析程式庫,不是PDF生成程式庫。 您將需要使用不同的程式庫進行HTML到PDF的轉換。
-
有限的文件操作:
PdfMerger支持合併,但沒有高層次的拆分/旋轉/編輯API。 -
沒有安全撰寫: 能閱讀加密的PDF(有密碼)但不能新增密碼、加密或數位簽章。
-
沒有浮水印/印章: 沒有高層次API用於現有文件的視覺覆蓋。
- 無表單填寫: 表單是只讀的,值不能更改或新增。
PdfPig與IronPDF比較
| 功能 | PdfPig | IronPDF |
|---|---|---|
| 授權 | 開源(Apache 2.0) | 商業 |
| NuGet套件 | PdfPig(v0.1.14,pre-1.0) |
IronPdf |
| PDF閱讀/提取 | 優秀 | 優秀 |
| PDF 生成 | 有限(基於座標通過PdfDocumentBuilder) |
全面 |
| HTML 到 PDF | 不支持 | 支援 |
| 文字提取 | 優秀(具單詞框) | 優秀(僅文字) |
| PDF合併 | 支持(PdfMerger) |
支持(PdfDocument.Merge) |
| 拆分/旋轉/編輯 | 不支持(高層次) | 支援 |
| 水印 | 不支持 | 支援 |
| 安全性/加密撰寫 | 不支持 | 支援 |
| 支持和檔 | 社群支持 | 專項支持 |
| 頁碼編索 | 基於1 | 0起始基數 |
IronPDF支持完整的PDF建立、閱讀、編輯和簽名功能。 這種靈活性使開發者能夠在現代.NET上從頭到尾管理PDF文件,提供超越PdfPig閱讀功能的完整PDF生命週期解決方案。
開始之前
前提條件
- .NET環境:.NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet存取: 有能力安裝NuGet套件
- IronPDF授權: 從ironpdf.com獲取您的授權金鑰
NuGet包變更
# Remove PdfPig
dotnet remove package PdfPig
# Install IronPDF
dotnet add package IronPdf
# Remove PdfPig
dotnet remove package PdfPig
# Install IronPDF
dotnet add package IronPdf
授權配置
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
識別PdfPig使用情況
# FindPdfPigusage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .
# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
# FindPdfPigusage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .
# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
完整API參考
名稱空間變更
// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: PdfPig
Imports UglyToad.PdfPig
Imports UglyToad.PdfPig.Content
Imports UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
文件載入映射
| PdfPig | IronPDF |
|---|---|
PdfDocument.Open(path) |
PdfDocument.FromFile(path) |
PdfDocument.Open(bytes) |
PdfDocument.FromBinaryData(bytes) |
PdfDocument.Open(stream) |
PdfDocument.FromStream(stream) |
using (var doc = ...) |
var pdf = ... |
頁面存取與屬性映射
| PdfPig | IronPDF |
|---|---|
document.NumberOfPages |
pdf.PageCount |
document.GetPages() |
pdf.Pages |
document.GetPage(1) |
pdf.Pages[0] |
文字提取映射
| PdfPig | IronPDF |
|---|---|
page.Text |
pdf.Pages[i].Text |
page.GetWords() |
pdf.ExtractTextFromPage(i) |
| (manual loop) | pdf.ExtractAllText() |
元資料存取映射
| PdfPig | IronPDF |
|---|---|
document.Information.Title |
pdf.MetaData.Title |
document.Information.Author |
pdf.MetaData.Author |
document.Information.Subject |
pdf.MetaData.Subject |
document.Information.Creator |
pdf.MetaData.Creator |
document.Information.Producer |
pdf.MetaData.Producer |
PdfPig中無法使用的新功能
| IronPDF功能 | 說明 |
|---|---|
renderer.RenderHtmlAsPdf(html) |
HTML到PDF轉換 |
renderer.RenderUrlAsPdf(url) |
URL到PDF轉換 |
pdf.ApplyWatermark(html) |
新增水印 |
pdf.SecuritySettings.UserPassword |
密碼保護 |
pdf.Sign(certificate) |
數位簽名 |
注意:PDF合併在兩個程式庫中均可用(PdfPig中的PdfDocument.Merge)。
程式碼遷移範例
範例1:從PDF中提取文字
之前(PdfPig):
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;
class Program
{
static void Main()
{
using (var document = PdfDocument.Open("input.pdf"))
{
var text = new StringBuilder();
foreach (var page in document.GetPages())
{
text.AppendLine(page.Text);
}
Console.WriteLine(text.ToString());
}
}
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;
class Program
{
static void Main()
{
using (var document = PdfDocument.Open("input.pdf"))
{
var text = new StringBuilder();
foreach (var page in document.GetPages())
{
text.AppendLine(page.Text);
}
Console.WriteLine(text.ToString());
}
}
}
Imports UglyToad.PdfPig
Imports System
Imports System.Text
Class Program
Shared Sub Main()
Using document = PdfDocument.Open("input.pdf")
Dim text = New StringBuilder()
For Each page In document.GetPages()
text.AppendLine(page.Text)
Next
Console.WriteLine(text.ToString())
End Using
End Sub
End Class
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
End Sub
End Class
PdfPig和IronPDF都提供卓越的文字提取能力。 主要區別在於程式碼模式。 PdfPig需要page.Text屬性中的文字。
IronPDF簡化為單一呼叫:ExtractAllText()一次返回所有文字內容。 不需要using語句,無需手動迭代,無需StringBuilder。 請參見文字提取文件以獲得更多選項。
範例2:HTML到PDF轉換
之前(PdfPig):
PdfPig不支持HTML到PDF的轉換。 PdfPig是一個PDF閱讀/解析程式庫,不是PDF生成程式庫。 您將需要使用不同的程式庫進行HTML到PDF的轉換。
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
此範例突出顯示了最顯著的功能差距。PdfPig明確指出其"不支持HTML到PDF轉換",並"是PDF閱讀/解析程式庫,不是PDF生成程式庫。"如果您需要用PdfPig將HTML製作成PDF,您需要完全使用其他程式庫。
IronPDF通過ChromePdfRenderer提供原生的HTML到PDF轉換。 RenderHtmlAsPdf()方法接受HTML字串,並使用內部Chromium引擎進行準確呈現HTML、CSS和JavaScript的PDF文件轉換。 生成的SaveAs()保存,或在保存前進一步操作。 查看更多HTML到PDF文件以獲得完整的範例。
範例3:讀取PDF元資料
之前(PdfPig):
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
class Program
{
static void Main()
{
using (var document = PdfDocument.Open("input.pdf"))
{
var info = document.Information;
Console.WriteLine($"Title: {info.Title}");
Console.WriteLine($"Author: {info.Author}");
Console.WriteLine($"Subject: {info.Subject}");
Console.WriteLine($"Creator: {info.Creator}");
Console.WriteLine($"Producer: {info.Producer}");
Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
}
}
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
class Program
{
static void Main()
{
using (var document = PdfDocument.Open("input.pdf"))
{
var info = document.Information;
Console.WriteLine($"Title: {info.Title}");
Console.WriteLine($"Author: {info.Author}");
Console.WriteLine($"Subject: {info.Subject}");
Console.WriteLine($"Creator: {info.Creator}");
Console.WriteLine($"Producer: {info.Producer}");
Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
}
}
}
Imports UglyToad.PdfPig
Imports System
Class Program
Shared Sub Main()
Using document = PdfDocument.Open("input.pdf")
Dim info = document.Information
Console.WriteLine($"Title: {info.Title}")
Console.WriteLine($"Author: {info.Author}")
Console.WriteLine($"Subject: {info.Subject}")
Console.WriteLine($"Creator: {info.Creator}")
Console.WriteLine($"Producer: {info.Producer}")
Console.WriteLine($"Number of Pages: {document.NumberOfPages}")
End Using
End Sub
End Class
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
var info = pdf.MetaData;
Console.WriteLine($"Title: {info.Title}");
Console.WriteLine($"Author: {info.Author}");
Console.WriteLine($"Subject: {info.Subject}");
Console.WriteLine($"Creator: {info.Creator}");
Console.WriteLine($"Producer: {info.Producer}");
Console.WriteLine($"Number of Pages: {pdf.PageCount}");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
var info = pdf.MetaData;
Console.WriteLine($"Title: {info.Title}");
Console.WriteLine($"Author: {info.Author}");
Console.WriteLine($"Subject: {info.Subject}");
Console.WriteLine($"Creator: {info.Creator}");
Console.WriteLine($"Producer: {info.Producer}");
Console.WriteLine($"Number of Pages: {pdf.PageCount}");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim info = pdf.MetaData
Console.WriteLine($"Title: {info.Title}")
Console.WriteLine($"Author: {info.Author}")
Console.WriteLine($"Subject: {info.Subject}")
Console.WriteLine($"Creator: {info.Creator}")
Console.WriteLine($"Producer: {info.Producer}")
Console.WriteLine($"Number of Pages: {pdf.PageCount}")
End Sub
End Class
兩個程式庫都能以幾乎相同的模式提供元資料存取。 PdfPig通過document.NumberOfPages存取頁面計數。 IronPDF使用pdf.PageCount讀取頁面計數。
遷移很簡單:用document.NumberOfPages。 移除using語句包裝,因為IronPDF不需要它。
關鍵遷移注意事項
頁碼編索變更
PdfPig使用1為基索引; IronPDF使用0為基索引:
// PdfPig: 基於1 indexing
var firstPage = document.GetPage(1); // First page
// IronPDF:0起始基數indexing
var firstPage = pdf.Pages[0]; // First page
// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
// PdfPig: 基於1 indexing
var firstPage = document.GetPage(1); // First page
// IronPDF:0起始基數indexing
var firstPage = pdf.Pages[0]; // First page
// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
' PdfPig: 基於1 indexing
Dim firstPage = document.GetPage(1) ' First page
' IronPDF:0起始基數indexing
Dim firstPage = pdf.Pages(0) ' First page
' Migration helper
Dim pdfPigIndex As Integer = 1
Dim ironPdfIndex As Integer = pdfPigIndex - 1
使用語句不需要
// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
// ...
}
// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
// ...
}
// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
Imports PdfPig
Imports IronPDF
Using document = PdfDocument.Open("input.pdf")
' ...
End Using
Dim pdf = PdfDocument.FromFile("input.pdf")
' ...
' pdf.Dispose() ' Optional
文件載入更改
// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))
// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))
// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
Imports PdfPig
Imports IronPDF
Using document = PdfDocument.Open("input.pdf")
End Using
Dim pdf = PdfDocument.FromFile("input.pdf")
元資料屬性名稱變更
// PdfPig: document.Information
var info = document.Information;
// IronPDF: pdf.MetaData
var info = pdf.MetaData;
// PdfPig: document.Information
var info = document.Information;
// IronPDF: pdf.MetaData
var info = pdf.MetaData;
' PdfPig: document.Information
Dim info = document.Information
' IronPDF: pdf.MetaData
Dim info = pdf.MetaData
頁數屬性變更
// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");
// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");
// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
' PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}")
' IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}")
遷移後的新能力
遷移到IronPDF後,您獲得了PdfPig無法提供的功能:
PDF合併
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
水印
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
密碼保護
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
數位簽名
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "support@company.com",
SigningReason = "Document Approval"
};
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "support@company.com",
SigningReason = "Document Approval"
};
pdf.Sign(signature);
Dim signature As New PdfSignature("certificate.pfx", "password") With {
.SigningContact = "support@company.com",
.SigningReason = "Document Approval"
}
pdf.Sign(signature)
功能比較總結
| 功能 | PdfPig | IronPDF |
|---|---|---|
| 文字提取 | ✓ | ✓ |
| 元資料存取 | ✓ | ✓ |
| 圖像提取 | ✓ | ✓ |
| PDF建立 | 有限(基於座標) | ✓ |
| HTML轉PDF | ✗ | ✓ |
| URL到PDF | ✗ | ✓ |
| 合併PDF | ✓(PdfMerger) |
✓ |
| 拆分PDF | ✗ | ✓ |
| 浮水印 | ✗ | ✓ |
| 表單填寫 | ✗ | ✓ |
| 密碼保護 | ✗ | ✓ |
| 數位簽名 | ✗ | ✓ |
| 單詞位置資料 | ✓ | ✗ |
遷移檢查表
遷移前
- 清點程式碼庫中的所有PdfPig用法
- 確認是否需要單詞級位置資料(考慮混合方法)
- 記錄所有頁面索引引用(需要從1為基轉換為0為基)
- 規劃IronPDF授權密鑰的儲存(建議使用環境變數)
- 先使用IronPDF試用授權進行測試
套件變更
- 移除
PdfPigNuGet套件:dotnet remove package PdfPig - 安裝
IronPdfNuGet套件:dotnet add package IronPdf
程式碼變更
- 更新命名空間導入(
using UglyToad.PdfPig;→using IronPdf;) - 用
PdfDocument.Open() - 用
document.Information - 用
document.NumberOfPages - 將頁面索引從1為基轉換為0為基
- 移除
using語句(可選,IronPDF不需要它們) - 在應用程式啟動時新增IronPDF授權金鑰
遷移後
- 測試文字提取輸出是否符合預期
- 測試所有PDF生成場景
- 根據需要新增新功能(合併,水印,安全性)
- 如果部署到Linux,安裝Linux依賴項

