根本原因是pdf本身不包含可提取文本,如为扫描件、文字转路径或字体未嵌入且缺tounicode cmap;实操应先用acrobat验证是否能导出文本,再检查pdf版本、加密状态、字体信息及资源类型。

为什么 PdfTextExtractor.GetTextFromPage() 返回空字符串?
多数人卡在这一步:调用 iText7 的 PdfTextExtractor.GetTextFromPage() 却拿不到文字,甚至返回空或乱码。根本原因不是代码写错,而是 PDF 本身不包含“可提取文本”——它可能是扫描件(本质是图片)、文字被转成路径(TextRenderingMode.FILL_STROKE)、或字体未嵌入且无 ToUnicode CMap。
实操建议:
- 先用 Adobe Acrobat 的“导出为文本”功能手动试一遍:如果它也抽不出字,iText7 同样无解
- 用
PdfReader打开后检查pdfReader.GetNumberOfPages()和每页的PdfPage.GetPageSize()是否正常,排除文件损坏 - 确认 PDF 版本 ≥ 1.4(iText7 对 1.3 及以下支持极弱),可用命令行
pdfinfo your.pdf查看 - 若页面含加密,必须传入正确口令初始化
PdfReader,否则所有内容访问均静默失败
iText7 中文乱码的根本原因和绕过方案
iText7 默认用 StandardDecompressor 解析字体,但对 CIDFont(中文常用)依赖 ToUnicode 映射表。很多国产 PDF 导出工具(如某些 WPS、旧版 Foxit)生成的文件缺失该表,导致 GetTextFromPage() 把汉字转成乱码或占位符(如 □□)。
实操建议:
- 不要试图“修复字体编码”,iText7 不提供运行时重映射接口
- 改用
LocationTextExtractionStrategy替代默认策略,它按渲染位置拼接文本,对乱码字体更鲁棒:var strategy = new LocationTextExtractionStrategy();<br>string text = PdfTextExtractor.GetTextFromPage(page, strategy);
- 若仍不行,说明文字实际是矢量路径(
TextRenderingMode.FILL_STROKE或CLIP),此时必须走 OCR 路线,iText7 无法处理 - 验证是否真为字体问题:用
page.GetResources().GetFontNames()列出字体名,再查font.GetPdfObject().Get(PdfName.BaseFont)看是否为/STSong-Light类 CIDFont
如何跳过图片页、表单域、注释干扰正文提取?
PDF 里常混有非文本元素:扫描图(PdfImageXObject)、AcroForm 表单字段、手写批注(PdfAnnotation)。它们不会被 GetTextFromPage() 读取,但会占用页面资源、拖慢解析,甚至在自定义策略中引发 NullReferenceException。
实操建议:
- 提前过滤掉纯图像页:遍历
page.GetResources().GetXObjectNames(),发现PdfImageXObject且无其他文本操作符(用PdfCanvasProcessor配合ITextRenderListener检测)则跳过 - 禁用表单域解析:创建
PdfReader时传入new ReaderProperties().SetCreateNewId(false),避免 AcroForm 初始化失败崩溃 - 忽略注释:调用
page.GetAnnotations()后清空(page.SetAnnotations(null)),防止某些带文本注释干扰坐标计算 - 性能提示:对多页 PDF,别用
GetTextFromPage()循环调用,改用PdfCanvasProcessor+ 自定义ITextRenderListener一次过处理整页渲染指令,快 3–5 倍
从 NuGet 安装到能跑通的最小依赖组合
很多人装了 itext7 主包却报 MissingMethodException 或 TypeLoadException,因为 iText7 7.2+ 拆分成多个独立程序集,缺一不可。
实操建议:
- 必须安装以下三个包(版本严格对齐,例如全用 8.0.4):
itext7<br>itext7.kernel<br>itext7.layout
- 中文支持需额外加
itext7.font-asian(提供 NotoSansCJK、SourceHanSans 等字体),否则LocationTextExtractionStrategy仍可能丢字 - 若项目目标框架是 .NET Framework 4.6.1,不能用 iText7 8.x(仅支持 .NET 6+),降级到 7.2.5 并补装
itext7.pdfa(7.2.x 中文提取依赖它) - 验证安装:编译后检查输出目录是否存在
itext.kernel.dll和itext.layout.dll,缺任一都会在运行时炸
pdfinfo 和 Acrobat 看清文件底细。










