使用iText 7提取含Identity-H编码CID字体的PDF文本出现乱码如何解决
iText 7提取Identity-H编码CID字体PDF乱码解决方案
问题根因
你代码中存在两处核心错误,导致提取文本乱码:
- 强制覆盖字体编码的操作完全错误:你当前遍历页面字体资源,强行全局设置
/Encoding = IdentityH的逻辑会破坏原有Type0字体的结构,你使用的PDF本身字体的Encoding已经是Identity-H,不需要手动修改,该操作反而会导致iText解析字体配置出错。 - 未配置iText的字体加载路径:Identity-H编码的CID字体提取文本依赖ToUnicode映射表,若PDF未内置该映射表,iText需要加载到对应实际字体文件(此处为SegoeUI)做编码映射 fallback,你未配置字体加载逻辑。
修正后代码
using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser.Listener; using iText.Kernel.Pdf.Canvas.Parser; using System.Diagnostics; using iText.IO.Font; using iText.Kernel.Font; namespace ItextTextExtract { class Program { static void Main(string[] args) { // 配置字体加载路径,Windows系统默认SegoeUI字体路径如下,其他系统修改为对应字体存放路径 FontProgramFactory.RegisterFontDirectory(@"C:\Windows\Fonts\"); PdfReader pdfReader = new PdfReader(@"C:\Users\Myfile-_.pdf"); PdfDocument pdfDoc = new PdfDocument(pdfReader); for (int page = 1; page <= pdfDoc.GetNumberOfPages(); page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); string pageContent = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(page), strategy); Debug.WriteLine("pageContent : " + pageContent); } pdfDoc.Close(); pdfReader.Close(); } } }
额外排查点
- 确认你的运行环境已安装Segoe UI字体,Windows系统默认自带,Linux/macOS环境需要手动安装该字体
- 如果PDF本身缺失ToUnicode映射表且无法获取对应字体,需要额外接入OCR方案提取文本
内容的提问来源于stack exchange,提问作者sglonfon
相关产品推荐
相关产品推荐

