使用iText.PdfTextExtractor提取PDF文本时遇'BuiltIn'编码不支持错误
问题描述
在使用iText.PdfTextExtractor提取PDF文本时,仅部分PDF页面触发以下错误:
'BuiltIn' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
已尝试在打开文件流前注册编码提供者,但问题未解决:
System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance; Encoding.RegisterProvider(provider);
完整业务代码如下:
public void ExtractFromPdf(string pdfFile, ClaimInfo claimInfo, string memberId) { System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance; Encoding.RegisterProvider(provider); PdfReader pdfRead = new PdfReader(pdfFile); PdfDocument pdfDoc = new PdfDocument(pdfRead); for (int page = 1; page < pdfDoc.GetNumberOfPages(); page++) { string convertToText = PdfToText(pdfDoc, page); } } private string PdfToText(PdfDocument pdfDoc, int pageNo) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); return PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(pageNo), strategy); }
错误发生在return PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(pageNo), strategy);代码行,目前无法定位到“BuiltIn”编码的相关处理逻辑,寻求解决方向。
解决思路
- 排查问题PDF的字体编码:报错页面大概率使用了PDF内嵌的自定义“BuiltIn”编码(非系统标准编码),iText默认逻辑无法识别。可以用Adobe Acrobat等工具查看问题页面的字体属性,确认编码映射规则。
- 实现自定义编码处理:创建继承自
System.Text.Encoding的自定义编码类,重写GetString等核心方法,结合PDF中内嵌的字符映射表完成字符转换,然后通过Encoding.RegisterProvider注册这个自定义提供者。 - 升级iText版本:部分旧版iText对非标准编码的兼容性较差,尝试升级到最新稳定版,新版本可能已经补全了这类编码的处理逻辑。
- 更换文本提取策略:替换
SimpleTextExtractionStrategy为LocationTextExtractionStrategy,或者自定义提取策略,在提取流程中增加编码异常的兼容分支。 - 异常捕获与降级处理:在调用
PdfTextExtractor.GetTextFromPage时添加try-catch块,捕获编码相关的ArgumentException,对出错页面尝试OCR识别(先转图片再提取文本),或者跳过无法正常提取的内容。
内容的提问来源于stack exchange,提问作者TryingMyBest
相关产品推荐
相关产品推荐

