开头
上周帮朋友处理一个需求:把上百份 PDF 合同里的关键信息提取出来,汇总到 Excel 里。
他问我:“这个用 Python 做方便吗?”
我说:“用 .NET 吧,有个库叫 PdfPig,几行代码就能提取文本。”
他愣了一下:“.NET 还能处理 PDF?”
能。而且比你想象的优雅得多。
今天给大家介绍这个我私藏了很久的开源项目——PdfPig。
项目简介

PdfPig 是一个纯 C# 实现的 PDF 处理库,由 UglyToad 团队开发和维护。
你可能不知道这个团队,但你一定听说过 PDFBox——这是 Apache 基金会的明星项目,最初由 Java 编写。PdfPig 的诞生,正是团队在尝试将 PDFBox 移植到 .NET 过程中演化出来的产物。
换句话说,PdfPig 站在了 PDFBox 的肩膀上继承了大量成熟可靠的 PDF 处理逻辑,同时又充分利用了 C# 的语言特性和 .NET 生态的优势。
项目在 GitHub 上开源(github.com/UglyToad/PdfPig),社区活跃,是 .NET 生态里 PDF 处理领域的标杆项目。
核心功能一览
PdfPig 的功能可以用"全面"二字形容。让我挨个说:
1. 文本提取
这是 PdfPig 最核心的能力。你可以通过多种方式提取 PDF 中的文本:
using (PdfDocument document = PdfDocument.Open(@"合同.pdf")){foreach (Page page in document.GetPages()) {// 方式一:直接获取全文本(不推荐,顺序可能混乱)string text = page.Text;// 方式二:按阅读顺序提取(推荐)string orderedText = ContentOrderTextExtractor.GetText(page);// 方式三:获取单词列表,精确控制 IEnumerable<Word> words = page.GetWords(NearestNeighbourWordExtractor.Instance); }}注意 README 里特别强调了:不要直接使用 page.Text,因为 PDF 内部的内容流顺序不等于我们阅读的顺序。这是很多新手容易踩的坑。
2. PDF 创建
PdfPig 不仅能读,还能写:
PdfDocumentBuilder builder = new PdfDocumentBuilder();PdfPageBuilder page = builder.AddPage(PageSize.A4);// 注册字体(必须是 Standard 14 字体或 TrueType 字体)PdfDocumentBuilder.AddedFont font = builder.AddStandard14Font(Standard14Font.Helvetica);// 添加文本page.AddText("Hello World!", 12, new PdfPoint(25, 700), font);// 生成并保存byte[] documentBytes = builder.Build();File.WriteAllBytes(@"C:\git\newPdf.pdf", documentBytes);几行代码就能生成一个规范的 A4 PDF,效果如图:

3. PDF 合并
合并多个 PDF 只需一行:
var resultFileBytes = PdfMerger.Merge(filePath1, filePath2);4. 加密文档支持
遇到有密码的 PDF?PdfPig 也能搞定:
// 提供密码打开using (PdfDocument document = PdfDocument.Open(@"加密文档.pdf",new ParsingOptions { Password = "user-password" }))// 或者批量尝试密码using (PdfDocument document = PdfDocument.Open(@"加密文档.pdf",new ParsingOptions { Passwords = new List<string> { "pwd1", "pwd2" } }))5. 表单提取
AcroForm 表单字段也能读取:
if (document.TryGetForm(out AcroForm form)){foreach (var field in form.Fields) { Console.WriteLine($"字段名:{field.Name},类型:{field.FieldType}"); }}6. 其他能力
书签(Outline)读取 超链接提取 图片提取 字体解析(支持 Standard 14 和 TrueType) 嵌入文件提取 文档结构分析
适用场景
说了这么多,你可能在想:这玩意儿用在哪儿?
场景一:文档自动化处理
最典型的就是我开头提到的场景——从大量 PDF 中提取结构化数据。比如:
从发票 PDF 中提取金额、日期、开票方信息 从合同 PDF 中提取甲乙方、金额、期限 从报告 PDF 中提取关键数据填入数据库
场景二:PDF 预处理器
在做 RAG(检索增强生成)或知识库项目时,通常需要对文档进行分块和向量化。PdfPig 可以精确控制文本提取的颗粒度,配合文档布局分析算法,实现更智能的分块策略。
场景三:PDF 生成服务
如果你的系统需要生成 PDF 报告、证书、订单等,PdfPig 的 PdfDocumentBuilder 提供了简洁的 API。虽然功能不如 iText 丰富,但胜在轻量和易用。
场景四:PDF 质量检测
提取 Letters(字母级别的原始数据)后,你可以分析字体、字间距、排版等,用于检测 PDF 的制作质量或验证文档的格式规范性。

为什么选择 PdfPig?
可能有人会问:iTextSharp、Aspose.PDF 这些商业库不是更强大吗?
确实,功能上 PdfPig 不一定是最全的。但它有几个独特的优势:
第一,纯开源,零商业授权费用
iTextSharp(现在的 iText 7)在商业使用时需要付费许可证。PdfPig 采用 Apache 2.0 协议,完全免费,这对于创业公司和小团队非常友好。
第二,API 设计简洁
iTextSharp 的文本提取通常需要创建 Reader → Extractor → 设置引擎 → 获取文本,步骤较多。而 PdfPig 的方式非常直接:
// PdfPig:简洁直接,一气呵成using (PdfDocument document = PdfDocument.Open(path)){string text = ContentOrderTextExtractor.GetText(document.GetPage(1));}谁的意图更清晰,一目了然。
第三,.NET 生态无缝集成
PdfPig 天然支持 .NET Standard / .NET Core / .NET 5+,可以轻松集成到 ASP.NET Core、Web API、WinForms、WPF 等各种应用场景。
第四,文档布局分析能力
这是 PdfPig 的一大亮点。它提供了多种文档布局分析算法:
DocstrumBoundingBoxes NearestNeighbourWordExtractor UnsupervisedReadingOrderDetector
配合使用,可以实现高精度的文本提取和阅读顺序还原。这对于处理排版复杂的 PDF(多栏、表格混排)尤为重要。
如何上手?
安装非常简单,NuGet 一行命令:
Install-Package PdfPig或者通过 dotnet CLI:
dotnet add package PdfPig官方 Wiki 提供了丰富的示例和详细文档,涵盖了从入门到进阶的各个方面。

写在最后
做开源项目最难的不是写出第一版代码,而是持续维护和迭代。PdfPig 团队多年来一直保持着活跃的更新,响应 issue 及时,版本迭代稳定。这种认真做项目的态度,在开源圈里弥足珍贵。
如果你正在做与 PDF 相关的 .NET 项目,不妨给 PdfPig 一个机会。它可能不是功能最全的,但一定是上手最快、用起来最顺手的之一。
当你还在为 PDF 焦头烂额时,别人已经用几行代码搞定了。
有时候,换对工具,效率提升的可不止一点点。

互动引导
你处理 PDF 时遇到过哪些头疼的问题?是用什么方案解决的?欢迎在评论区分享你的经验。
如果这篇文章对你有帮助,转发给你身边做 .NET 开发的朋友,让更多人知道这个宝藏项目。
夜雨聆风