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

如何解决使用iTextSharp Core提取PDF文本时的字体问题?

问题

尝试从某政府PDF文档提取文本时触发如下错误:

PDF Extraction Error
Dictionary doesn't have supported font data.

iText.Kernel.Exceptions.PdfException

at iText.Kernel.Font.PdfFontFactory.CreateFont(PdfDictionary fontDictionary)
at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.GetFont(PdfDictionary fontDict)
at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.SetTextFontOperator.Invoke(PdfCanvasProcessor processor, PdfLiteral operator, IList`1 operands)
at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.InvokeOperator(PdfLiteral operator, IList`1 operands)
at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.ProcessContent(Byte[] contentBytes, PdfResources resources)
at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.ProcessPageContent(PdfPage page)
at iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(PdfPage page, ITextExtractionStrategy strategy, IDictionary`2 additionalContentOperators)
at iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(PdfPage page, ITextExtractionStrategy strategy)

已尝试Simple提取策略和Location-based提取策略,结果一致。此前从同站点其他数百份文档提取文本均无问题,无法控制该文档是否损坏。

解决方法与解释

解决方法

  • 自定义字体处理逻辑:重写PdfCanvasProcessor的字体获取方法,捕获字体解析异常时返回默认字体(如Helvetica),跳过错误继续提取。示例代码:
    public class CustomPdfCanvasProcessor : PdfCanvasProcessor
    {
        public CustomPdfCanvasProcessor(ITextExtractionStrategy strategy) : base(strategy) { }
    
        protected override PdfFont GetFont(PdfDictionary fontDict)
        {
            try
            {
                return base.GetFont(fontDict);
            }
            catch (PdfException)
            {
                // 用默认字体替代无法解析的字体
                return PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
            }
        }
    }
    
    使用时替换默认处理器处理页面内容即可。
  • 切换PDF提取库:尝试PdfSharp、PDFBox.NET等其他库,这类库对异常字体的兼容性可能优于iText。如果文档是扫描生成的,还可以用Tesseract OCR进行光学字符识别。
  • 预处理修复PDF:用Ghostscript重新生成PDF,修复字体相关的损坏问题。命令示例:
    gswin64c -o fixed.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/original input.pdf
    

关于字体与提取策略的关联

所有文本提取策略都依赖iText底层的字体解析逻辑——PDF中的文本并非直接存储为Unicode,而是通过字体字典定义的编码规则映射为可读字符。如果字体字典缺失必要的支持数据(如字体描述、编码映射表),iText无法完成字符到文本的转换,必然抛出错误。这和具体用哪种提取策略无关,因为策略只是决定文本的组织方式,不影响底层的字符解码过程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:17:14