使用iText 7.1.15与.NET Core 6.0读取PDF时部分内容乱码求助
解决iText 7读取PDF乱码问题的可行方案
出现无法复制的乱码,通常是因为PDF使用了无正确编码映射的自定义/嵌入字体,或者文本被渲染为矢量图形而非可提取的文本对象。以下是针对不同场景的解决方案:
1. 检查并修复字体编码映射
iText无法识别部分字体的编码时,会输出乱码。可以通过以下步骤排查和处理:
- 显式指定编码尝试提取:
using (var reader = new PdfReader("target.pdf")) using (var doc = new PdfDocument(reader)) { var strategy = new LocationTextExtractionStrategy(); // 尝试UTF-8或PDFDocEncoding编码 string text = PdfTextExtractor.GetTextFromPage(doc.GetPage(1), strategy); } - 检查字体是否包含ToUnicode映射:
ToUnicode CMap是PDF中用于将字形ID映射为实际字符的关键,缺失会导致提取失败。可以用代码检查:using (var reader = new PdfReader("target.pdf")) using (var doc = new PdfDocument(reader)) { var page = doc.GetPage(1); var resources = page.GetResources(); foreach (var fontName in resources.GetResourceNames(PdfName.Font)) { var font = PdfFontFactory.CreateFont(resources.GetResource(fontName)); Console.WriteLine($"字体名称:{font.GetFontProgram().GetFontNames().GetFontName()}"); Console.WriteLine("是否包含ToUnicode映射:" + font.HasToUnicode()); } } - 自定义编码映射:如果缺失ToUnicode映射,且知道字体对应的字符集,可以手动构建字形ID到字符的映射表,通过自定义
ITextExtractionStrategy实现提取。
2. 切换文本提取策略
iText提供多种提取策略,不同策略对复杂排版的支持不同:
- 尝试
SimpleTextExtractionStrategy(适合简单布局):using (var reader = new PdfReader("target.pdf")) using (var doc = new PdfDocument(reader)) { var simpleStrategy = new SimpleTextExtractionStrategy(); string text = PdfTextExtractor.GetTextFromPage(doc.GetPage(1), simpleStrategy); } - 对于多列、重叠文本,可以使用
FilteredTextRenderListener结合区域过滤提取。
3. 处理矢量图形化文本
如果乱码内容是用路径绘制的(非文本对象),普通提取方法无效,需要结合OCR工具:
- 先用iText将PDF页面转为高清图片:
using (var reader = new PdfReader("target.pdf")) using (var doc = new PdfDocument(reader)) { var page = doc.GetPage(1); var imageData = PdfCanvasProcessor.CreateImageData(page, 300f, 300f); // 300DPI保证清晰度 Image image = new Image(imageData); image.Save("page1.png"); } - 再用Tesseract进行OCR识别(需安装
Tesseract.NETNuGet包):
注:OCR准确性依赖文本清晰度,可调整分辨率或添加灰度化、降噪等预处理步骤。using (var engine = new TesseractEngine("./tessdata", "chi_sim", EngineMode.Default)) { using (var img = Pix.LoadFromFile("page1.png")) using (var ocrPage = engine.Process(img)) { string ocrText = ocrPage.GetText(); Console.WriteLine(ocrText); } }
4. 升级iText版本
你当前使用的7.1.15版本存在部分字体编码处理的已知问题,升级到最新稳定版(如7.2.x)可能直接解决问题。
内容的提问来源于stack exchange,提问作者Yaniv Amrami
相关产品推荐
相关产品推荐

