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

如何设置iText7后备字体并避免字体嵌入?

实现字体后备且不嵌入字体的方案

针对iText中既要实现未知码点字体后备,又要避免嵌入字体的需求,可按以下步骤操作:

1. 用FontProvider重载方法添加字体(指定不嵌入)

直接调用FontProvider.addFont()的重载版本,显式传入false关闭字体嵌入:

FontProvider fontProvider = new FontProvider();
// 添加主字体,指定不嵌入
fontProvider.addFont("path/to/main-font.ttf", PdfEncodings.IDENTITY_H, false);
// 添加后备字体,同样关闭嵌入
fontProvider.addFont("path/to/fallback-font.ttf", PdfEncodings.IDENTITY_H, false);

将配置好的FontProvider绑定到文档:

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
doc.setFontProvider(fontProvider);

2. 通过setFontFamily指定字体 fallback 优先级

调用Text.setFontFamily()时,按优先级传入字体族名,iText会自动在主字体无对应码点时,依次 fallback 到后续字体:

Text text = new Text("包含主字体无码点的文本:比如特殊符号或生僻字");
// 主字体在前,后备字体在后,按顺序匹配码点
text.setFontFamily("MainFontFamilyName", "FallbackFontFamilyName");
doc.add(text);

3. 自定义FontProvider兜底(若默认逻辑不生效)

如果默认FontProvider仍强制嵌入,可继承并重写getFont()方法,手动控制嵌入状态:

class NonEmbeddedFontProvider extends FontProvider {
    @Override
    public PdfFont getFont(String fontName, String encoding, boolean embedded, float size, int style, Color color) {
        PdfFont font = super.getFont(fontName, encoding, embedded, size, style, color);
        // 强制关闭字体嵌入
        font.setEmbedded(false);
        return font;
    }
}

使用该自定义Provider时,按顺序添加字体后绑定到文档即可。

关键注意事项

  • 可通过FontProgramFactory.createFont("path/to/font.ttf").getFontNames().getFontFamily()获取字体的正确族名
  • 编码建议使用PdfEncodings.IDENTITY_H,支持全Unicode字符,避免码点丢失
  • 不同iText 7版本的API可能略有差异,需对应调整参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:30:55