You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用iText 7提取含Identity-H编码CID字体的PDF文本出现乱码如何解决

iText 7提取Identity-H编码CID字体PDF乱码解决方案

问题根因

你代码中存在两处核心错误,导致提取文本乱码:

  1. 强制覆盖字体编码的操作完全错误:你当前遍历页面字体资源,强行全局设置/Encoding = IdentityH的逻辑会破坏原有Type0字体的结构,你使用的PDF本身字体的Encoding已经是Identity-H,不需要手动修改,该操作反而会导致iText解析字体配置出错。
  2. 未配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:45:02