c#读pdf必须用第三方库,因pdf是含压缩流和渲染指令的二进制格式;streamreader直接读会乱码;推荐pdfpig库,支持中文且无依赖;提取文本用document.getpage(1).text,表格需坐标聚类或gettabledetector().detect()。

直接读取 PDF 文本内容,C# 本身不支持,必须依赖第三方库;选错库或用错 API 会导致中文乱码、表格丢失、性能卡顿甚至崩溃。
为什么 StreamReader 读 .pdf 文件只看到乱码?
PDF 不是纯文本格式,而是包含压缩流、对象引用、字体映射和渲染指令的二进制结构。用 StreamReader 或 File.ReadAllText 打开,只会读到原始字节流或解压失败的残留数据,比如 J... 这类不可读字符。
- PDF 的文字可能被拆成多个操作符(
Tj、TJ)、嵌在图形流中,需解析内容流并还原绘制顺序 - 中文字体通常以子集方式嵌入,没正确处理
ToUnicodeCMap 就会输出方块或空格 - 有些 PDF 把文字转成了路径(
fill+ 轮廓),此时根本“不可提取”——只能 OCR
推荐用 PdfPig(.NET Standard 2.0+,MIT 协议)
相比老牌的 iTextSharp(LGPL 风险)或重量级的 PDFiumSharp(需本地 DLL),PdfPig 是纯 C# 实现、无依赖、对中文支持较好,且 API 直观。
- 安装:
dotnet add package UglyToad.PdfPig - 基础文本提取:
PdfDocument.Open("a.pdf")→document.GetPage(1).Text - 若遇到中文乱码,优先检查是否用了
new PdfDocument(new PdfDocumentBuilder().Build())错误构造方式——应直接用静态Open方法 - 提取表格?别指望
.Text:要遍历page.GetWords()后按坐标聚类,或改用page.GetTableDetector().Detect()(实验性,对线框表较稳)
PdfPig 提取时常见的三类失败场景
不是所有 PDF 都能“顺利”提取。以下现象对应不同原因:
-
NullReferenceException在GetPage(i):说明该页是加密或损坏的——先用document.IsEncrypted判断,再尝试传入密码(PdfDocument.Open(path, new ParsingOptions { Password = "123" })) - 返回空字符串但页面明显有字:可能是文字被渲染为图片(查
page.GetImages().Count> 0),或用了 Type 3 字体(PdfPig当前不支持自定义绘图算子) - 速度极慢(>10 秒/页):关闭冗余解析,加
new ParsingOptions { ClipPaths = false, IgnoreInvalidContentStreams = true }
真正难的不是“怎么读”,而是判断“能不能读”——拿到一个 PDF,先用 PdfDocument.Open 加载,再快速扫一遍 document.NumberOfPages 和首页 GetWords().Count,比硬写容错逻辑更省时间。










