如何设置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
相关产品推荐
相关产品推荐

