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

使用iTextSharp提取PDF阿拉伯文本仅得到数字的问题求助

解决iTextSharp提取PDF阿拉伯文本仅得到数字的问题

我来帮你搞定这个阿拉伯文本提取的坑!你遇到的问题主要是因为阿拉伯语是**从右到左(RTL)**的书写系统,而默认的LocationTextExtractionStrategy是为从左到右(LTR)语言设计的,它没法正确识别RTL文本的排列逻辑,加上PDF里的阿拉伯文本可能是以拆分字符的方式存储,导致最终只提取出了数字(数字是LTR,所以能正常识别)。

原因分析

  • LocationTextExtractionStrategy会按文本块的X坐标从小到大拼接内容,这对LTR语言没问题,但RTL语言的文本块顺序是反过来的,直接用它会把阿拉伯文本打乱甚至无法识别。
  • 如果PDF里的阿拉伯字体没有嵌入,iTextSharp可能无法映射字符编码,也会导致文本提取失败,只留下数字这种通用字符。

解决方案

方案1:自定义RTL文本提取策略

我们可以继承LocationTextExtractionStrategy,重写文本拼接逻辑,让它按RTL的顺序来组合文本块:

public class ArabicTextExtractionStrategy : LocationTextExtractionStrategy
{
    public override string GetResultantText()
    {
        // 获取所有文本块,并按行分组(Y坐标相同为同一行)
        var lineGroups = GetChunks()
            .GroupBy(chunk => chunk.Location.Y)
            .OrderByDescending(group => group.Key); // 从上到下处理行

        StringBuilder result = new StringBuilder();
        foreach (var line in lineGroups)
        {
            // 同一行内按X坐标从大到小排序(RTL顺序)
            var sortedChunks = line.OrderByDescending(chunk => chunk.Location.X);
            foreach (var chunk in sortedChunks)
            {
                result.Append(chunk.Text);
            }
            result.AppendLine();
        }

        return result.ToString().Trim();
    }
}

然后在你的代码里替换原来的策略:

public static string GetTextFromAllPages(string pdfPath) 
{ 
    // 用using确保PdfReader正确释放资源
    using (PdfReader reader = new PdfReader(pdfPath)) 
    { 
        StringBuilder result = new StringBuilder(); 
        // 遍历所有页面,而不是只提取第一页
        for (int i = 1; i <= reader.NumberOfPages; i++) 
        {
            string pageText = PdfTextExtractor.GetTextFromPage(reader, i, new ArabicTextExtractionStrategy());
            result.Append(pageText);
        }
        return result.ToString();
    }
}

方案2:检查PDF字体嵌入情况

打开你的PDF文件,查看文档属性里的字体信息,如果阿拉伯语字体显示为"未嵌入",那纯文本提取大概率会失败。这种情况下,你需要结合OCR工具(比如Tesseract)来提取文本,先把PDF页面转成图片,再用OCR识别阿拉伯文本。

方案3:升级到iText 7(推荐)

iTextSharp是iText的旧版本,对多语言尤其是RTL语言的支持有限。iText 7专门优化了RTL文本的提取逻辑,默认就能更好地处理阿拉伯语。如果项目允许升级,建议切换到iText 7,代码逻辑会更简洁,效果也更稳定。

测试建议

先试试方案1,大部分RTL文本提取问题都能通过自定义策略解决。如果还是不行,再检查字体嵌入情况,或者考虑升级版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:11