You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:22:19