iText 2.7.1/iText 5.x中PdfContentByte.setLeading方法不生效求助
解决iText 2.x/5.x中PdfContentByte.setLeading()不生效的问题
PdfContentByte.setLeading()方法并非对所有文本绘制方式都生效——它只在通过newlineText()方法自动换行时才会应用设置的行间距。如果是手动调用setTextMatrix()定位文本,或者重复调用showText()直接绘制,这个设置会被忽略,自然看不到行间距效果。
下面提供两种可行的解决方式:
方式一:配合newlineText()使用setLeading()
如果你坚持直接操作PdfContentByte,必须遵循PDF文本绘制的流程,用newlineText()触发自动换行,让设置的leading生效:
PdfContentByte cb = writer.getDirectContent(); cb.beginText(); // 设置行间距为20 cb.setLeading(20f); // 定位到起始坐标 cb.moveText(50, 750); // 绘制第一行 cb.showText("第一行测试内容"); // 自动换行,应用设置的行间距 cb.newlineText(); // 绘制第二行 cb.showText("第二行测试内容"); cb.newlineText(); cb.showText("第三行测试内容"); cb.endText();
方式二:使用ColumnText(推荐)
直接操作PdfContentByte属于底层操作,容易出错。更推荐用ColumnText组件,它会自动处理行间距、换行和排版,用法更简洁:
ColumnText ct = new ColumnText(writer.getDirectContent()); // 设置文本显示的矩形区域(左、下、右、上坐标) ct.setSimpleColumn(50, 700, 550, 750); // 设置行间距 ct.setLeading(20f); // 添加文本元素,Paragraph也可单独设置行间距 ct.addElement(new Paragraph("第一行测试内容")); ct.addElement(new Paragraph("第二行测试内容")); ct.addElement(new Paragraph("第三行测试内容")); // 执行渲染 ct.go();
额外提示:如果使用Document对象直接添加Paragraph,也可以在创建Paragraph时指定行间距,比如new Paragraph("文本内容", font, 20f),添加到Document后会自动应用该间距。
内容的提问来源于stack exchange,提问作者Eshan
相关产品推荐
相关产品推荐

