使用iText读取PDF时遭遇'StandardEncoding'不支持错误的求助
解决iText读取PDF时“StandardEncoding is not a supported encoding name”错误
核心原因
PDF规范中的StandardEncoding是一种自定义字符编码,.NET默认编码库未直接注册该编码名称,导致iText内部调用Encoding.GetEncoding("StandardEncoding")时抛出异常。
解决方案
1. 创建自定义编码映射提供者
编写一个自定义EncodingProvider,将StandardEncoding名称映射到与你的PDF字符兼容的现有编码(根据你描述的文档字符匹配情况,这里映射到Windows-1252):
using System.Text; public class PdfCustomEncodingProvider : EncodingProvider { public override Encoding GetEncoding(string name) { // 匹配StandardEncoding名称,映射到Windows-1252编码 if (string.Equals(name, "StandardEncoding", StringComparison.OrdinalIgnoreCase)) { return Encoding.GetEncoding(1252); } return null; } public override Encoding GetEncoding(int codepage) { return null; } }
2. 注册编码提供者并提取文本
在调用PdfTextExtractor.GetTextFromPage前,先注册自定义提供者和系统扩展编码页提供者:
// 注册自定义PDF编码映射 Encoding.RegisterProvider(new PdfCustomEncodingProvider()); // 注册系统扩展编码页(需先安装System.Text.Encoding.CodePages NuGet包) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 正常执行文本提取逻辑 using (PdfReader reader = new PdfReader("目标文件路径.pdf")) { using (PdfDocument doc = new PdfDocument(reader)) { for (int pageNum = 1; pageNum <= doc.GetNumberOfPages(); pageNum++) { string pageText = PdfTextExtractor.GetTextFromPage(doc.GetPage(pageNum)); // 处理提取到的文本 } } }
3. 前置依赖(.NET Core/.NET 5+项目)
需要先安装System.Text.Encoding.CodePages NuGet包,否则CodePagesEncodingProvider无法正常使用。
补充说明
- 你直接用Windows-1252处理仍报错,是因为iText内部是通过
StandardEncoding这个名称查找编码,而非直接使用代码页,所以必须通过自定义提供者完成名称映射。 GetContentBytes获取的是页面原始内容流,并非结构化文本,因此无法直接得到有效文本内容,仍需使用PdfTextExtractor。
内容的提问来源于stack exchange,提问作者NN NN
相关产品推荐
相关产品推荐

