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

如何在PDFBox中使用自定义字体?解决加载后找不到字体报错

解决PDFBox填充表单时自定义字体找不到的问题

核心问题分析

报错Could not find font: /AlexBrush-Regular的根源是:你加载了自定义字体,但未将其注册到AcroForm的字体资源字典中,导致PDF渲染时无法定位该字体。同时原代码存在几处细节错误需要修正。

修正后的代码及关键步骤

PDDocument document = PDDocument.load(new File("src/main/resources/static/forms/form.pdf"));
PDType0Font customFont = PDType0Font.load(document, new File("src/main/resources/static/font/AlexBrush-Regular.ttf"));

PDDocumentCatalog docCatalog = document.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();

// 关键操作:将自定义字体注册到AcroForm的资源字典中
PDResources resources = acroForm.getResources();
if (resources == null) {
    resources = new PDResources();
    acroForm.setResources(resources);
}
// 给字体设置一个自定义别名,后续默认外观字符串中使用该别名
resources.put(COSName.getPDFName("AlexBrush"), customFont);

for (PDField field : acroForm.getFields()) {
    String fieldName = field.getPartialName();
    if ("required field".equals(fieldName)) {
        // 使用注册的字体别名配置默认外观
        field.setDefaultAppearance("/AlexBrush 12 Tf 0 g");
    } else {
        field.setDefaultAppearance("/Helv 12 Tf 0 g");
    }
    field.setValue("Signature");
}

// 修正变量名错误:原代码pdAcroForm为笔误,改为acroForm
acroForm.flatten();
document.save("filled_form.pdf");
document.close();

关键修正点说明

  • 注册字体到AcroForm资源:必须将加载的自定义字体存入AcroForm的PDResources,这是PDF识别自定义字体的必要步骤。手动定义字体别名比直接用customFont.getName()更可靠,避免字体内部名称不符合PDF规范的问题。
  • 移除冗余判断:原代码中if (field instanceof PDField)属于无效判断,因为循环遍历的本身就是PDField集合。
  • 修正变量笔误:将pdAcroForm.flatten()改为acroForm.flatten(),匹配之前定义的变量名。

额外注意事项

  • 确认字体文件路径正确且文件未损坏。
  • 使用PDType0Font.load加载TrueType字体是正确选择,它支持嵌入字体子集,能有效减小生成的PDF体积。
  • 若目标字段为多行输入,需额外调用field.setMultiline(true)确保格式正常。

内容的提问来源于stack exchange,提问作者Vishal Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:45:17