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映射表,默认提取策略无法正确匹配字符编码,就算去掉转码逻辑也可能出现乱码。
修复步骤
- 直接删除所有手动转码的代码,.NET的
string类型原生支持西里尔等非ASCII字符,不需要额外做编码转换。 - 修正页码循环的判断条件,确保所有页面都能被遍历到。
- 用
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
相关产品推荐
相关产品推荐

