使用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
相关产品推荐
相关产品推荐

