PDFsharp 不支持文本提取,因其仅处理绘图指令而不解析字体与编码;推荐使用 PdfPdfiumSharp(高精度,支持中日韩)或 iTextSharp.LGPLv2.Core(轻量但兼容性较弱)。

用 PDFsharp 提取文字会失败,别试了
PDFsharp 虽然能读取 PDF 结构、渲染页面,但它**完全不支持文本提取**——它把 PDF 当作绘图指令流处理,不解析字符编码、字体映射和文本顺序。你调用 page.Content 拿到的只是原始操作符(如 Tf、Tj),不是可读字符串。强行解析等于重写一个 PDF 文本解析器,实际项目中没人这么干。
推荐用 PdfPdfiumSharp(.NET 6+)或 iTextSharp.LGPLv2.Core(旧项目)
前者基于 Google 的 pdfium 引擎,精度高、支持复杂字体和横向/竖排中文;后者是 LGPL 开源版 iText,轻量但对某些嵌入字体或加密 PDF 支持较弱。
- 安装
PdfPdfiumSharp:dotnet add package PdfPdfiumSharp(需 Windows/macOS/Linux 原生库,NuGet 会自动拉取对应平台libpdfium) - 基础提取代码很短:
using PdfPdfiumSharp; using var doc = PdfDocument.Load("sample.pdf"); string fullText = ""; for (int i = 0; i < doc.PageCount; i++) { var page = doc.GetPage(i); fullText += page.GetText(); // 返回纯文本,已按阅读顺序拼接 page.Dispose(); } Console.WriteLine(fullText); - 注意:如果 PDF 是扫描件(即图片型 PDF),
GetText()返回空字符串——它只处理「可选中文本」(text-based PDF),不带 OCR 功能
iTextSharp.LGPLv2.Core 提取时乱码?重点检查字体和编码
中文乱码通常不是代码写错,而是 PDF 内嵌字体未正确映射到 Unicode。iText 默认尝试用字体描述里的 ToUnicode 表,但很多国产 PDF 工具生成的文件缺失该表。
- 先确认是否真有文本层:
pdftotext -listfont sample.pdf(命令行工具,Linux/macOS 自带;Windows 可装poppler)看输出里有没有UniGB-UCS2-H或类似中文字体名 - 若无
ToUnicode表,可强制按 GBK 解码(仅限简体中文 PDF):renderer.SetFontEncoding("GBK")(具体方法名依版本略有差异,查ITextRenderer或PdfTextExtractor类) - 不建议全局设
Encoding.UTF8——PDF 中文字体多数用双字节编码,UTF8 直接解会崩出
加密 PDF 怎么办?先解密再提取
遇到 PDF file is encrypted 错误,说明文档带打开密码(user password)或权限密码(owner password)。PdfPdfiumSharp 和 iTextSharp.LGPLv2.Core 都支持传入密码打开:
-
PdfPdfiumSharp:PdfDocument.Load("locked.pdf", "password123") -
iTextSharp.LGPLv2.Core:var reader = new PdfReader("locked.pdf", new ReaderProperties().SetPassword("password123".ToCharArray())) - 如果只知道 owner password(比如从 Adobe Acrobat 打印限制里拿到的),部分库不支持仅凭 owner 密码解密——得先用工具(如
qpdf --decrypt)转成明文 PDF 再处理
Tesseract + ImageSharp 截图页面再识别),那已经是另一个技术栈了。



















