如何在Jetpack Compose中为iText7库添加自定义字体
Android + iText7 嵌入自定义字体生成PDF解决方案
第一步:正确放置字体资源
不要直接用src/main/...的路径,Android应用中需将自定义字体文件(.ttf/.otf)放到main/assets/fonts目录下(没有就手动创建这两个文件夹)。这个目录是Android官方指定的资源存放目录,打包后可通过系统API访问。
第二步:添加iText7依赖
在Module级别的build.gradle中添加iText7核心库(如果需要支持中文等非拉丁字体,额外添加亚洲字体包):
dependencies { implementation 'com.itextpdf:itext7-core:7.2.7' implementation 'com.itextpdf:itext7-font-asian:7.2.7' // 可选,用于中/日/韩等字体支持 }
第三步:代码实现字体加载与PDF生成
通过AssetsManager读取字体文件流,再用iText7的API加载并嵌入到PDF中:
try { // 从assets目录读取字体文件 InputStream fontStream = getAssets().open("fonts/your_custom_font.ttf"); // 加载字体,设置编码为IDENTITY_H(支持多语言字符),并开启嵌入 PdfFont customFont = PdfFontFactory.createFont( FontProgramFactory.createFont(fontStream), PdfEncodings.IDENTITY_H, PdfFontFactory.EMBEDDED ); // 生成PDF文档 // 保存到应用私有外部目录,无需额外权限 File outputFile = new File(getExternalFilesDir(null), "custom_font.pdf"); PdfWriter writer = new PdfWriter(outputFile); PdfDocument pdfDoc = new PdfDocument(writer); Document doc = new Document(pdfDoc); // 使用自定义字体添加文本 doc.add(new Paragraph("这是用自定义字体生成的文本").setFont(customFont).setFontSize(18)); doc.add(new Paragraph("Custom Font Text Example").setFont(customFont).setFontSize(16)); doc.close(); } catch (IOException | PdfException e) { e.printStackTrace(); }
关键说明
- 为什么
src/main/...路径无效:Android应用打包后,源码目录的文件结构会被重构,直接用文件系统路径无法访问到原始文件,必须通过AssetsManager或Resources API访问资源。 - 权限问题:示例中使用
getExternalFilesDir(null)保存PDF,属于应用私有外部存储目录,Android 10及以上无需申请WRITE_EXTERNAL_STORAGE权限;若要保存到公共目录,需额外处理权限和MediaStore。
内容的提问来源于stack exchange,提问作者El Zubair
相关产品推荐
相关产品推荐

