Android Studio生成PDF无法写入希伯来语 BaseFont无法读取TTF文件问题
问题解决方案
核心报错原因
你代码中使用的/src/main/res/font/arialuni.ttf是Android项目开发阶段的源码目录路径,APK编译打包后,res目录下的资源不会以原路径的文件形式存在于用户设备的文件系统中,因此运行时无法通过直接读取文件路径的方式找到字体资源。
解决方法
你可以选择以下任意一种方式加载字体:
方法1:将字体放入assets目录加载
- 在项目
src/main路径下新建assets文件夹,将arialuni.ttf字体文件复制到该文件夹内 - 修改字体加载代码如下:
// 通过AssetManager读取assets下的字体文件 AssetManager assetManager = getAssets(); InputStream fontInputStream = assetManager.open("arialuni.ttf"); byte[] fontByteData = new byte[fontInputStream.available()]; fontInputStream.read(fontByteData); fontInputStream.close(); // 传入字体字节数组创建BaseFont BaseFont unicode = BaseFont.createFont("arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, fontByteData, null);
方法2:保留res/font存放路径加载
如果不想移动字体文件,可通过Android资源API读取字体:
// 注意R.font.arialuni不需要加.ttf后缀,文件名需和res/font下的文件完全匹配 InputStream fontInputStream = getResources().openRawResource(R.font.arialuni); byte[] fontByteData = new byte[fontInputStream.available()]; fontInputStream.read(fontByteData); fontInputStream.close(); BaseFont unicode = BaseFont.createFont("arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, fontByteData, null);
额外排查项
- Android资源对大小写敏感,请确认代码中引用的字体文件名和实际文件的大小写、后缀完全一致
- 以上代码适配iText5版本,若你使用iText7需对应调整API
- 你当前代码需要写入公共下载目录,Android 6.0及以上版本需动态申请
WRITE_EXTERNAL_STORAGE权限,Android 10及以上版本需适配分区存储规则,避免文件写入失败。
内容的提问来源于stack exchange,提问作者Naor P
相关产品推荐
相关产品推荐

