iText 7循环中首个元素未应用格式,求原因及解决办法
问题解决:iText7循环中首次Paragraph字体未生效
问题根源
你代码里的链式调用顺序错误,导致后续意外修改了Document的默认字体,掩盖了首次循环的问题:
- 第一行代码写法是正确的:先给Paragraph设置字体再添加到Document
- 但第二、三行的
document.add(new Paragraph(...)).setFont(...)是对Document对象调用字体设置方法,而非Paragraph。这会把montserrat1设为Document的全局默认字体。
首次循环时,Document默认字体还是初始值(比如Helvetica),如果你的montserrat1字体加载有问题(比如路径错误、未正确初始化),第一行的Paragraph会 fallback 到默认字体;而执行完第二行后,Document默认字体被设为montserrat1,后续循环的Paragraph即使代码逻辑没严格正确,也会继承全局字体,所以看起来生效了。
修复方案
1. 修正链式调用逻辑
所有样式设置都要在Paragraph对象上完成,再添加到Document:
for(int i = 0; i < res.numJobs; i++) { // 职位段落:先设样式再添加 Paragraph positionPara = new Paragraph(res.position[i]) .setFont(montserrat1) .setFontSize(10); document.add(positionPara); // 雇主及日期段落 Paragraph employerPara = new Paragraph(res.employer[i] + ", " + res.startDate[i] + " - " + res.endDate[i]) .setFont(montserrat1) .setFontSize(10); document.add(employerPara); // 工作描述段落 Paragraph descPara = new Paragraph("• " + res.workDescription[i]) .setFont(montserrat1) .setFontSize(8) .setFontColor(Color.GRAY); document.add(descPara); }
2. 检查字体加载是否正确
确保montserrat1字体文件已正确加载,没有路径错误或编码问题:
// 示例:加载本地字体文件 PdfFont montserrat1 = PdfFontFactory.createFont("fonts/Montserrat-Regular.ttf", PdfEncodings.IDENTITY_H);
如果字体加载失败,iText会自动使用默认字体(Helvetica),这也是首次循环字体不生效的常见原因。
内容的提问来源于stack exchange,提问作者Om Bakhshi
相关产品推荐
相关产品推荐

