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

使用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.NET NuGet包):
    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);
        }
    }
    
    注:OCR准确性依赖文本清晰度,可调整分辨率或添加灰度化、降噪等预处理步骤。

4. 升级iText版本

你当前使用的7.1.15版本存在部分字体编码处理的已知问题,升级到最新稳定版(如7.2.x)可能直接解决问题。

内容的提问来源于stack exchange,提问作者Yaniv Amrami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:35