在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
相关产品推荐
相关产品推荐

