切换至.NET Core 3.1后iText7读取PDF页面内容无返回问题求助
问题根因
该问题核心是.NET Core 3.0+版本默认移除了GBK、Big5等东亚地区编码的内置支持,若生成的PDF文本使用了这类编码,iText7提取文本时会因为找不到对应编码解析器返回空内容,完全匹配你从.NET Core 2.2迁移到3.1的场景。
解决方案
步骤1:安装编码扩展包
通过NuGet安装System.Text.Encoding.CodePages包,版本需匹配你使用的.NET Core 3.1运行时。
步骤2:全局注册编码提供程序
在QA测试项目的程序入口(例如单元测试的Fixture初始化逻辑、Program.cs的Main方法最开头)添加编码注册代码,全局仅需执行一次:
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
步骤3(可选):关闭iText权限校验
如果PDF设置了禁止提取内容的权限标记,iText默认会遵守限制不返回文本,可在初始化PdfReader时添加权限忽略配置(仅用于内部测试场景):
var readerProp = new ReaderProperties(); readerProp.SetUnethicalReading(true); using (PdfReader reader = new PdfReader(filepath, readerProp))
修正后的完整示例代码
// 编码注册逻辑全局执行一次即可 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); bool foundIndex = false; var readerProp = new ReaderProperties(); readerProp.SetUnethicalReading(true); using (PdfReader reader = new PdfReader(filepath, readerProp)) { using (var doc = new iText.Kernel.Pdf.PdfDocument(reader)) { for (int ctr = 1; ctr <= doc.GetNumberOfPages(); ctr++) { var page = doc.GetPage(ctr); // 无需额外指定提取策略,默认策略即可正常读取 var text = PdfTextExtractor.GetTextFromPage(page); if (text.Contains("Index of Legislation")) { foundIndex = true; break; } } } }
按上述方案修改后即可正常提取PDF文本内容,无需切换其他PDF处理库。
内容的提问来源于stack exchange,提问作者CHarmon
相关产品推荐
相关产品推荐

