如何用 C# 从 PdfPig 迁移到 IronPDF
从PdfPig迁移到IronPDF扩展了您的PDF功能,从以阅读为主的库(具有用于基于坐标的撰写和基本合并的狭窄写作表面)到全方位处理创建、操作、文本提取和安全功能的全面PDF解决方案。 本指南提供了一个完整的、逐步的迁移路径,在添加HTML转换、高级文档操作、水印和安全撰写的同时,保留现有的提取工作流,这些都是PdfPig不提供的。
为何从PdfPig迁移到 IronPDF.
了解 PdfPig
PdfPig(NuGet包UglyToad.PdfPig)是一个开源的.NET PDF阅读和提取库,最初受到Apache PDFBox Java项目的启发并部分移植。 它允许开发人员以高精度访问PDF的结构内容。 虽然PdfPig在提取方面表现出色,但其范围比全生命周期商业库要狭窄。 该项目仍处于1.0之前的阶段(当前稳定版本为0.1.14),其README指出"在版本低于1.0.0时,次版本号变动将会无预警地改变公共API。"
PdfPig提供了可靠的工具,可用于提取文本(带有字母和单词级位置)、图片、只读表单数据、注释和元数据。 它还暴露了一个有限的写入界面——UglyToad.PdfPig.Writer中)用于连接现有的PDF文件。 这使其成为主要专注于文档分析、数据挖掘和基本连接的应用程序的合适选择。
阅读为主的限制
PdfPig首先是阅读的;其写作表面有意地狭窄。 当您的应用程序需要超过提取和基本合并时,PdfPig无法提供帮助:
- PDF生成有限:新文档需要通过
PdfPoint坐标放置——没有高级布局。
2.不支持 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文件,从头到尾提供一个完整的PDF生命周期解决方案,超越了PdfPig的阅读能力。
开始之前
前提条件
- .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
After (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 的转换。
After (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引擎将它们转换为PDF文档,以准确渲染HTML、CSS和JavaScript。 生成的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
After (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获取页数。
迁移很简单:将pdf.PageCount。 删除using语句包装,因为IronPDF不需要它。
关键迁移说明
页面索引更改
PdfPig 使用基于 1 的索引;IronPDF使用基于 0:
// PdfPig:1 基于indexing
var firstPage = document.GetPage(1); // First page
// IronPDF:基于 0indexing
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:基于 0indexing
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:基于 0indexing
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.FromFile() - 将
pdf.MetaData - 将
pdf.PageCount - 将页面索引从基于 1 的索引转换为基于 0 的索引
- 删除
using语句(可选,IronPDF不需要它们) - 在应用程序启动时添加IronPDF许可证密钥
后迁移
- 测试文本提取输出符合预期
- 测试所有 PDF 生成场景
- 根据需要添加新功能(合并、水印、安全)。
- 如果部署到 Linux,请安装 Linux 依赖项

