You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用iTextSharp提取PDF内容因特殊字体失败,寻求解决方案

解决iText提取特殊字体PDF文本失败的问题

我之前也碰到过一模一样的情况——普通PDF文本提取顺风顺水,但遇到中文、日文这类带亚洲特殊字体的PDF就直接抽不出内容,你提到的StreamUtil.AddToResourceSearch确实是关键突破口,下面给你完整的可行方案:

核心原因

特殊字体(尤其是亚洲字体)的PDF大多用CID字体编码,iText默认没内置这类字体的字符映射表(CMAP),所以得额外引入亚洲字体支持库来补全映射关系,不然程序根本认不出字体对应的字符。

分步解决方案

1. 引入正确的依赖库

从你代码里的PdfReaderSimpleTextExtractionStrategy能看出来用的是iText 5.x(旧版API),需要先添加两个NuGet包:

  • iTextSharp(iText的C#核心库)
  • iTextSharp.asian(亚洲字体支持库,包含关键的CMAP映射表)

如果是新版iText 7.x,对应的包是itext7-coreitext7-font-asian,不过API逻辑会有差异,这里先聚焦你当前用的旧版。

2. 完整可运行代码

一定要在初始化PdfReader之前加载iTextAsian程序集并添加到资源搜索路径,这样iText才能找到对应的字体映射:

// 先加载亚洲字体支持程序集,确保程序能找到CMAP映射表
var asianAssembly = System.Reflection.Assembly.Load("iTextAsian");
iTextSharp.text.pdf.StreamUtil.AddToResourceSearch(asianAssembly);

// 正常执行PDF文本提取流程
using (var pdfReader = new iTextSharp.text.pdf.PdfReader("你的PDF文件路径"))
{
    for (int page = 1; page <= pdfReader.NumberOfPages; page++)
    {
        // 可选:试试LocationTextExtractionStrategy,对排版复杂的特殊字体PDF提取效果更好
        // var strategy = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
        var strategy = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
        string currentText = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
        // 这里可以根据需求处理提取到的文本,比如输出或存储
        Console.WriteLine($"第{page}页文本:\n{currentText}");
    }
}

3. 额外排查点

  • 检查PDF是否嵌入了字体:有些PDF只是引用了字体名称但没嵌入字体文件,这种情况哪怕加了库也可能抽不出内容,你可以用PDF阅读器的「属性-字体」选项查看字体是否嵌入。
  • 切换提取策略:LocationTextExtractionStrategy会保留文本的位置排版信息,对一些字体偏移、排版复杂的特殊字体PDF,提取成功率比SimpleTextExtractionStrategy更高。
  • 确认PDF未加密:如果是加密PDF,需要先调用pdfReader.Unlock("你的密码")解密后再执行提取操作。

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

火山引擎 最新活动