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

iTextSharp提取PDF时西里尔(俄/乌克兰语)字符缺失如何解决

iTextSharp读取PDF西里尔字符缺失问题修复方案

核心问题原因

你当前代码里的字符丢失问题是三个错误共同导致的:

  • 多余的错误编码转换:PdfTextExtractor.GetTextFromPage返回的本身就是.NET原生支持Unicode的字符串,你后续写的Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(thePage)))逻辑,会把所有ASCII码范围外的字符(乌克兰语、俄语的西里尔字母全在这个范围外)直接过滤掉,这是字符消失的最主要原因。
  • 页码遍历边界错误:iTextSharp的页码从1开始计数,你当前的循环条件i < pdfReader.NumberOfPages会直接漏掉PDF的最后一页内容。
  • 非规范PDF的字体映射缺失:部分生成不标准的西里尔PDF没有嵌入字体的ToUnicode映射表,默认提取策略无法正确匹配字符编码,就算去掉转码逻辑也可能出现乱码。

修复步骤

  1. 直接删除所有手动转码的代码,.NET的string类型原生支持西里尔等非ASCII字符,不需要额外做编码转换。
  2. 修正页码循环的判断条件,确保所有页面都能被遍历到。
  3. 用using语句包裹PdfReader实例,避免文件资源泄露。

修正后可直接运行的代码

public static string GetText(string filePath)
{
    StringBuilder text = new StringBuilder();
    if (File.Exists(filePath))
    {
        using (PdfReader pdfReader = new PdfReader(filePath))
        {
            // 修正页码边界,遍历从1到总页数的所有页面
            for (int i = 1; i <= pdfReader.NumberOfPages; i++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string thePage = PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
                text.Append(Environment.NewLine);
                // 移除错误转码逻辑,直接追加提取结果
                text.Append(thePage);
            }
        }
    }
    return text.ToString();
}

特殊情况处理

  • 如果运行修正后的代码依然存在西里尔字符乱码,说明目标PDF没有嵌入标准的ToUnicode字符映射表,这种情况需要先提取PDF内嵌的字体文件,通过字体自带的CMAP映射表手动匹配字符,或者换用对非标准编码兼容性更好的PDF解析库处理。
  • 永远不要对文本提取方法返回的Unicode字符串做二次编码转码操作,这类操作只会破坏非ASCII字符,没有任何正向作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:27:27