如何强制iText 7生成PDF时不自动修剪空白字符?
问题
期望生成的PDF布局:
1. Name : John Doe Class : I-A Grade : 100 Status: PASS
使用iText代码生成PDF:
public void generateDoc(List<String> toPrint) throws IOException { PdfWriter writer = new PdfWriter(path); PdfDocument pdf = new PdfDocument(writer); pdf.setDefaultPageSize(PageSize.A4); Document document = new Document(pdf); document.setFontSize(10.0F); document.setFont(PdfFontFactory.createFont(StandardFonts.COURIER)); document.setMargins(10F, 0F, 10F, 0F); for(String s : toPrint) { if(s.equals("EOF")) document.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); else document.add(new Paragraph(s)); } document.close(); }
传入的toPrint列表已基于等宽字体完成格式化:
[ "1. Name : John Doe", " Class : I-A", " Grade : 100", " Status: PASS" ]
但实际生成的PDF丢失了预设的缩进:
1. Name : John Doe Class : I-A Grade : 100 Status: PASS
需要实现让PDF严格按照toPrint列表中的格式化字符串呈现布局。
解决方案
问题根源是iText的Paragraph组件默认会自动规范化空白字符,包括去除字符串开头的空格,导致缩进丢失。可以通过以下两种方式解决:
方法1:关闭Paragraph的空白规范化
修改创建Paragraph的代码,添加setNormalizeWhitespace(false)配置:
else document.add(new Paragraph(s).setNormalizeWhitespace(false));
该配置会让iText完全保留字符串中的原始空白格式(开头空格、连续空格等),确保PDF渲染效果和预设字符串一致。
方法2:用Text对象包装内容
如果需要更灵活的文本控制,也可以将每个字符串包装为Text对象后再加入Paragraph,同样关闭空白规范化:
else { Paragraph p = new Paragraph(); p.add(new Text(s).setNormalizeWhitespace(false)); document.add(p); }
两种方法都能让PDF严格遵循toPrint列表中的格式化布局,完整保留所有缩进和空格。
内容的提问来源于stack exchange,提问作者Dhana D.
相关产品推荐
相关产品推荐

