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

在iText中能否创建支持.setBold/.setItalic的自定义字体?

解决方案

iText本身没有提供直接通过.setBold()或.setItalic()自动匹配独立TTF字体文件的API,但你可以通过封装字体映射逻辑实现类似的便捷调用,不用手动跟踪样式后逐个切换字体。

步骤1:创建字体映射表

先把已初始化的四种字体按「样式组合」分类存储,方便后续快速查找:

// 初始化你已有的字体
PdfFont customFont = PdfFontFactory.createFont("/templates/NunitoSans.ttf", PdfEncodings.IDENTITY_H);
PdfFont customFontBold = PdfFontFactory.createFont("/templates/NunitoSansBold.ttf", PdfEncodings.IDENTITY_H);
PdfFont customFontBoldItalic = PdfFontFactory.createFont("/templates/NunitoSansBoldItalic.ttf", PdfEncodings.IDENTITY_H);
PdfFont customFontItalic = PdfFontFactory.createFont("/templates/NunitoSansItalic.ttf", PdfEncodings.IDENTITY_H);

// 用Map建立样式与字体的映射
Map<String, PdfFont> fontStyleMap = new HashMap<>();
fontStyleMap.put("normal", customFont);
fontStyleMap.put("bold", customFontBold);
fontStyleMap.put("italic", customFontItalic);
fontStyleMap.put("bold_italic", customFontBoldItalic);

步骤2:封装自动匹配方法

写一个工具方法,根据当前文本的粗体/斜体状态,自动从映射表中取出对应字体并设置:

/**
 * 根据粗体、斜体状态自动设置对应字体
 * @param element 要设置字体的文本元素(比如Paragraph、Text)
 * @param isBold 是否粗体
 * @param isItalic 是否斜体
 */
private void setAutoFont(IBlockElement element, boolean isBold, boolean isItalic) {
    String styleKey = isBold ? (isItalic ? "bold_italic" : "bold") : (isItalic ? "italic" : "normal");
    element.setFont(fontStyleMap.get(styleKey));
}

步骤3:便捷调用

在解析器中跟踪到文本样式后,直接调用这个方法即可,不用手动判断切换:

// 示例:解析到普通文本
Paragraph normalPara = new Paragraph("普通文本");
setAutoFont(normalPara, false, false);

// 示例:解析到粗体文本
Paragraph boldPara = new Paragraph("粗体文本");
setAutoFont(boldPara, true, false);

// 示例:解析到粗斜体文本
Paragraph boldItalicPara = new Paragraph("粗斜体文本");
setAutoFont(boldItalicPara, true, true);

进阶:封装为字体管理类

如果需要更优雅的链式调用,可以把逻辑封装成一个独立的字体管理类:

public class CustomFontManager {
    private final PdfFont normalFont;
    private final PdfFont boldFont;
    private final PdfFont italicFont;
    private final PdfFont boldItalicFont;

    public CustomFontManager(PdfFont normal, PdfFont bold, PdfFont italic, PdfFont boldItalic) {
        this.normalFont = normal;
        this.boldFont = bold;
        this.italicFont = italic;
        this.boldItalicFont = boldItalic;
    }

    public PdfFont getFont(boolean isBold, boolean isItalic) {
        if (isBold && isItalic) {
            return boldItalicFont;
        } else if (isBold) {
            return boldFont;
        } else if (isItalic) {
            return italicFont;
        } else {
            return normalFont;
        }
    }

    // 链式调用扩展:直接给文本元素设置字体
    public <T extends IBlockElement> T applyFont(T element, boolean isBold, boolean isItalic) {
        element.setFont(getFont(isBold, isItalic));
        return element;
    }
}

使用时更简洁:

CustomFontManager fontManager = new CustomFontManager(customFont, customFontBold, customFontItalic, customFontBoldItalic);

// 链式设置
Paragraph para = fontManager.applyFont(new Paragraph("链式调用设置粗斜体"), true, true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:46:25