Nong.PdfPig 是 PDF 读取底座(UglyToad PdfPig 的 Nong fork,net10.0):PDF 文本提取 + 版面分析 + 表格识别。相对上游:#1266 CJK 字体名乱码修复、TableExtractor 表格识别(线检测 + 坐标聚类 + 假表格过滤,54 个真实 PDF 验证误报 315→4)、段落还原、WriteSvg 矢量导出(化学式结构式 → SVG)、批注读取。Apache 2.0,Nong.Convert 的 PDF 读取依赖此包。
NONG PDFPIG
【参考归档 · 已退役】 —— 本包为 Nong 早期对 UglyToad/PdfPig 的 fork,已被自研解析器 Nong.Pdf.Parse 全面替代,仅作历史参考,不再维护
它解决什么问题 · 快速开始 · 我们的增强 · 上游同步 · 技术栈 ·
退役声明
本包是 Nong 项目 2026 年早期的 PDF 读取底座(fork 自 UglyToad/PdfPig)。自研解析器 Nong.Pdf.Parse 落地后,本包于 2026-08 完成四期退役,PDF 板块全部消费方已切换至 Nong.Pdf.Parse。本仓此后仅作参考归档:保留了 fork 期间的增强(表格识别、批注、矢量路径导出等)与上游同步历史,可供查阅 ISO 32000 解析的工程实现细节;不接受功能变更,不跟进上游。
它解决什么问题(历史)
PDF 没有结构(不像 docx/xlsx/pptx 是 XML),只能靠解析引擎按 ISO 32000 标准把页面内容(文字/图片/矢量路径/批注)读出来。Nong 项目不重写 PDF 引擎(重新实现 ISO 32000 是几十万行的无底洞),直接 fork 上游 PdfPig 做底座,把 Nong 需要的增强加进去。
- fork 自 UglyToad/PdfPig(上游 15 万行,只加不删,跟上游同步)
- 读 PDF 的底层能力:文字块(带坐标/字体/字号)、图片(PNG/JPEG 原始字节)、表格(Nong 增强)、批注、矢量路径(WriteSvg 导出)
- Convert 的 PDF 读取靠它:Nong.Convert 的 PDF 读取器是薄层,底层全在这
快速开始
环境要求
- .NET 10(net10.0)
- 上游同步时 LangVersion 跟上游(12→13)
构建
dotnet build Nong.PdfPig/Nong.PdfPig.csproj
最简单的用法
using UglyToad.PdfPig;
using (PdfDocument document = PdfDocument.Open(@"文件.pdf"))
{
foreach (Page page in document.GetPages())
{
// 文字块(带坐标/字体/字号,段落还原用 ContentOrderTextExtractor)
var 词 = page.GetWords();
// 图片(TryGetPng/JPEG 原始字节)
// 批注(Page.GetAnnotations())
}
}
建议用
ContentOrderTextExtractor.GetText(page)还原段落,不要直接用page.Text(它保留内部内容顺序,基本不是你要的阅读顺序)。
我们的增强
| 增强 | 位置 | 说明 |
|---|---|---|
| 表格识别 TableExtractor | DocumentLayoutAnalysis/TableExtractor.cs |
无框表格启发式识别(列边界聚类 + 线检测),54 真实样本校准;上游没有表格识别模块(只有版面分块),这是 Nong 自己的生产模块 |
| WriteSvg 矢量导出 | PdfPig 现成一级接口 | 矢量路径(IPathCommand)→ SVG,Convert 用它把 PDF 化学结构式存成 资源/图形N.svg |
| 段落还原 | ContentOrderTextExtractor | 完整句子 + 双换行拆段(Convert 阶段五 v2 实测胜出 RecursiveXYCut) |
| 化学式几何 | 页读取薄层 | 闭合路径数/键线/曲线/原子符号(Convert 侧,底层是 WriteSvg) |
fork 纪律:fork 只加不删(删上游文件破坏 merge);上游同步 1-2 月一次(merge → csproj 全 --ours → LangVersion 跟上 → build → 四格式回归 → pack 覆盖 NuGet 缓存 → push)。
上游同步
跟 UglyToad/PdfPig 同步(2026-08-09 首次同步 8 commits):
git fetch upstream && git merge upstream/master
# csproj 全 --ours(保留我们的打包配置)
# LangVersion 跟上游(12→13)
# build → 四格式回归 → pack 覆盖 NuGet 缓存 → push
上游自己也没有表格识别——Nong 的 TableExtractor 就是正生产车(
fork 只加不删,删上游文件破坏 merge)。
技术栈
- .NET 10(net10.0)
- ISO 32000(PDF 标准,PdfPig 实现)
- 上游:UglyToad/PdfPig(MIT)
- NuGet 包名:Nong.PdfPig(1.1.0,含 TableExtractor,Convert 引 NuGet 包不是源码)