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

如何强制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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:58:26