跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

C#怎么读取PDF文档的页数_C#如何使用第三方库解析PDF【代码】

PDFiumSharp 是读取 PDF 页数最轻量且无依赖冲突的方案——它仅封装 Google PDFium,跳读 trailer 字典,毫秒级获取页数,无需加载全文。 用
PDFiumSharp
读取页数最轻量且无依赖冲突 直接上结论:别碰
itextsharp
(已停更、.net 6+ 兼容差),也别硬啃
pdfbox
(java 项目, c# 调用麻烦)。
pdfiumsharp
是目前最干净的选择——它只是对 google pdfium 的 c# 封装,不带渲染逻辑,纯解析,开箱即读页数。 常见错误是以为必须“加载整个文档”才能拿到页数,其实 PDF 的页数信息藏在文件末尾的
trailer
字典里,
PDFiumSharp
的
GetPageCount()
就是精准跳过去读这一小段,毫秒级完成。 安装:
dotnet add package PDFiumSharp
必须调用
PDFium.Initialize()
一次(通常放
Main()
或
Startup
),否则抛
System.DllNotFoundException
路径传错会静默返回 0,不是异常——检查
File.Exists()
再调用
PDFium.Initialize(); using var doc = PDFium.OpenDocument("report.pdf"); int pageCount = doc.GetPageCount(); // 不会解码内容,不占内存
为什么
QuestPDF
和
IronPDF
不适合只读页数 这两个库定位是“生成 PDF”,解析只是副产物。它们会在打开时尝试解析字体、资源、结构树,哪怕你只想要页数,也会触发完整解析流程。 实测对比:一个 12MB 含扫描图的 PDF,
PDFiumSharp
耗时
3ms
,
IronPDF
耗时
850ms
且内存涨 120MB;
QuestPDF
根本不提供页数 API,得自己扒底层
PdfiumCore
——那不如直接用原生封装。
IronPDF
免费版有页眉水印,商用需授权
QuestPDF
的
Document.Load()
是为渲染准备的,没公开
Trailer
访问接口 两者都依赖本地原生 DLL(Windows/Linux/macOS 分开部署),而
PDFiumSharp
的 nuget 包已含对应平台二进制
StreamReader
+ 正则硬解析 PDF 页数?别试 有人想绕过库,直接读文件找
/Count
或
/Pages
对象。PDF 是二进制格式,开头可能有 %PDF-1.7,后面跟着乱码流和压缩对象,文本搜索大概率失败。 C知道 CSDN推出的一款AI技术问答工具 下载 真实 PDF 文件中,
/Count
可能出现在任意对象里(比如目录树节点),也可能被加密、被 FlateDecode 压缩、甚至被故意错位写入干扰字段。正则匹配
/Count\s+\d+
在测试文件上能跑通,上线后遇到扫描件转 PDF 或 Acrobat 生成的文件就崩。 PDF 规范允许页数存于
Root/Pages/Count
或间接引用链中,必须走标准解析器遍历 即使文件未加密,
StreamReader
按 UTF-8 读会把二进制段当非法字符跳过,关键字直接丢弃 没有校验 offset 和 xref 表,找到的数字可能是注释、字符串内容或旧版本残留 跨平台部署时注意
libpdfium
的运行时位置
PDFiumSharp
底层依赖
libpdfium
动态库,Linux/macOS 下不会自动从 nuget 包复制到输出目录,运行时找不到会报
DLL load failed
。 Windows:nuget 自动处理,无需额外操作 Linux:确保
libpdfium.so
在
LD_LIBRARY_PATH
中,或发布时用
dotnet publish -r linux-x64 --self-contained false
并手动拷贝 so 文件到
publish/
目录 macOS:同理,用
install_name_tool
修正 dylib 路径,或改用
--self-contained true
(体积增大 ~40MB) 最容易被忽略的是 Docker 多阶段构建:build 阶段装了 libpdfium,runtime 阶段镜像里没它——必须显式
COPY
或用
apk add pdfium-dev
(Alpine)这类基础镜像。

相关文章