Xamarin.Android中iText7加载阿拉伯字体报路径找不到异常的问题
解决Xamarin.Android中iText7加载自定义阿拉伯字体的路径问题
你这是踩了Xamarin.Android资源访问的典型坑——Android环境里字体文件的加载逻辑和桌面应用完全不同,直接用相对路径或系统绝对路径肯定会失败。下面是一步步的解决方案:
1. 正确放置字体并配置Build Action
首先把你的NotoNaskhArabic-Regular.ttf字体文件放到项目的Assets文件夹里(如果没有Assets文件夹,右键项目→添加→新建文件夹,命名为Assets即可)。
最关键的一步:选中字体文件,在右侧属性面板里把Build Action设置为AndroidAsset——这一步绝对不能漏,否则编译时字体不会被打包到APK的Assets目录中,程序自然找不到它。
2. 使用AssetManager加载字体流
Android的Assets文件无法通过普通文件路径直接访问,必须通过AssetManager打开文件流,再传给iText7的字体工厂。修改你代码中的字体加载部分:
// 获取应用的AssetManager实例 var assetManager = Android.App.Application.Context.Assets; // 打开字体文件的流(确保文件名和Assets里的完全一致,注意大小写) using (var fontStream = assetManager.Open("NotoNaskhArabic-Regular.ttf")) { // 用IDENTITY_H编码加载,支持阿拉伯语等复杂脚本的排版 PdfFont arab = PdfFontFactory.CreateFont(fontStream, PdfEncodings.IDENTITY_H); document2.SetFont(arab); // 你的表格、段落逻辑保持不变 foreach (string source in sources) { Paragraph paragraph = new Paragraph(); Bidi bidi = new Bidi(source, Bidi.DirectionDefaultLeftToRight); if (bidi.BaseLevel != 0) { paragraph.SetTextAlignment(iText.Layout.Properties.TextAlignment.RIGHT); } paragraph.Add(source); table.AddCell(new Cell(1,1).SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER).Add(paragraph)); } document2.Add(table); document2.Close(); }
3. 为什么之前的方法都失败?
- Resources文件夹:Android的Resources目录是针对特定资源类型(如drawable、layout)设计的,字体放这里需要设置为
AndroidResource,但访问方式更复杂,远不如Assets直接。 - 系统字体路径:
C:\Windows\Fonts是Windows系统的本地路径,Android设备完全无法访问这个路径,报错是必然的。 - 未设置Build Action:如果没把字体的Build Action设为AndroidAsset,APK里根本不会包含这个文件,程序自然找不到它。
额外提示
处理阿拉伯语等RTL(从右到左)文本时,一定要用PdfEncodings.IDENTITY_H编码,它能正确支持复杂脚本的字形组合和双向排版,避免出现文字错乱的问题。
内容的提问来源于stack exchange,提问作者rana hd
相关产品推荐
相关产品推荐

