如何使用C# 7.1读取阿拉伯语PDF文件?
解决C#读取阿拉伯语PDF的问题
我之前处理过类似的阿拉伯语PDF提取问题,你的代码用的是旧版iTextSharp的默认文本提取策略,它对从右到左(RTL)的阿拉伯语支持不足,所以只能读出英文字符。下面给你几个可行的解决方案:
方案1:升级到iText 7(推荐)
旧版iTextSharp对双向文本(比如阿拉伯语)的处理逻辑不完善,而iText 7专门优化了RTL语言的文本提取。首先你需要通过NuGet安装iText 7的.NET包:
Install-Package iText7
然后使用以下代码提取文本,它会自动处理阿拉伯语的右到左排版:
private string GetArabicTextFromPDF(string path) { StringBuilder text = new StringBuilder(); using (PdfReader reader = new PdfReader(path)) { PdfDocument pdfDoc = new PdfDocument(reader); for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++) { PdfPage page = pdfDoc.GetPage(i); // LocationTextExtractionStrategy在iText7中已支持RTL文本排序 ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); string pageText = PdfTextExtractor.GetTextFromPage(page, strategy); text.Append(pageText); } } return text.ToString(); }
方案2:针对旧版iTextSharp的兼容处理
如果你暂时不想升级版本,可以尝试更换文本提取策略,比如使用SimpleTextExtractionStrategy(不过它的排版可能不如iText7规整),或者自定义一个支持RTL的策略:
private string GetTextFromPDF(string path) { StringBuilder text = new StringBuilder(); using (PdfReader reader = new PdfReader(path)) { for (int i = 1; i <= reader.NumberOfPages; i++) { // 替换为SimpleTextExtractionStrategy text.Append(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy())); } } return text.ToString(); }
注意:这个方法可能会导致阿拉伯语的单词顺序颠倒,需要额外处理文本反转逻辑。
方案3:处理图像型阿拉伯语PDF
如果你的PDF里的阿拉伯语是图像格式(不是可编辑的文本),那么上面的方法都没用,必须用OCR工具识别。推荐使用Tesseract OCR,步骤如下:
- 通过NuGet安装Tesseract包:
Install-Package Tesseract
- 下载阿拉伯语语言包(
ara.traineddata),放在项目的tessdata目录下 - 使用以下代码提取图像并识别:
using Tesseract; private string GetArabicTextFromImagePDF(string path) { StringBuilder text = new StringBuilder(); using (PdfReader reader = new PdfReader(path)) { PdfDocument pdfDoc = new PdfDocument(reader); for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++) { PdfPage page = pdfDoc.GetPage(i); PdfResources resources = page.GetResources(); // 遍历页面中的所有图像资源 foreach (PdfName name in resources.GetResourceNames()) { if (resources.IsImage(name)) { PdfImageXObject img = resources.GetImage(name); using (Bitmap bitmap = img.GetDrawingImage() as Bitmap) { // 初始化Tesseract引擎,指定阿拉伯语 using (var engine = new TesseractEngine(@"tessdata", "ara", EngineMode.Default)) { using (var pix = PixConverter.ToPix(bitmap)) { using (var pageResult = engine.Process(pix)) { text.Append(pageResult.GetText()); } } } } } } } } return text.ToString(); }
额外注意事项
- 检查PDF中的阿拉伯语字体是否已嵌入:如果字体未嵌入,即使是文本型PDF也可能无法正确提取。你可以用Adobe Reader打开PDF,查看「文件→属性→字体」,确认阿拉伯语字体的状态是「已嵌入」。
- 如果字体未嵌入,建议联系PDF生成方重新生成嵌入字体的版本,否则只能依赖OCR识别。
内容的提问来源于stack exchange,提问作者user7085040
相关产品推荐
相关产品推荐

