【问题标题】:Why does Java delete the blank space between paragraphs during conversion to PDF?为什么Java在转换为PDF时会删除段落之间的空格?
【发布时间】:2019-04-02 01:32:43
【问题描述】:

为什么 Java 会删除段落之间的空格?我正在使用 iText5 将 .rtf 文件转换为 PDF。该文件包含报告,每个报告都在其自己的页面上。转换后,段落之间的空格被删除,使得分页与转换前不同。

我尝试使用 Rectangle 设置页面大小,但由于报表的行数不同,一些报表仍与其他报表共享同一页面。

//Set PDF layout
//Rectangle rectangle = new Rectangle (0, 0, 1350, 16615);
Document document = new Document(PageSize.A4.rotate());
document.setMargins(13, 0, 10, 10);           
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();

br = new BufferedReader(new FileReader(TEXT));

String line;
Paragraph p;       
//PDF font configuration
Font normal = new Font(FontFamily.COURIER, 5);
Font bold = new Font(FontFamily.COURIER, 5, Font.BOLD);

//add page to PDF       
boolean title = true;
    while ((line = br.readLine()) != null) {               
    p = new Paragraph(line, title ? bold : normal);
        document.add(p);
     }           
        document.close();

我不希望程序删除段落之间的空格。

【问题讨论】:

  • 你可以尝试用\u00a0替换你的空格。
  • Java 没有任何事情;您用来完成此操作的库是原因,如果没有要禁用的设置,您需要分叉它(假设它是开源的)并自己修改代码。
  • 我使用不同的库将.rtf转换为.pdf格式,但原理是一样的。 1. 将 .rtf 文档中的空白段落转换为换行符。 将正则表达式^$ 替换为QQQ,然后将QQQ 替换为\n。将^$ 直接转换为\n 会更快,但我的文字处理器不允许我一步完成。 2. 拥有完美格式的 .rtf 后,我将 .rtf 转换为 .pdf。
  • (@karel - 您是在说/暗示问题在于 OP 的“.rtf”文件的格式不正确?不是“符合”RTF?)
  • 你确定源文件真的是 rtf 文件吗?在这种情况下,您的结果可能到处都有 rtf 指令。话虽如此,在读取空行的情况下,您至少应该在创建Paragraph 时使用带空格的字符串而不是空行,因为没有内容的段落没有高度......

标签: java itext pdf-generation


【解决方案1】:

首先

我怀疑您的输入是否真的是 rtf 文件。一个 rtf 文件看起来像这样

{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard
This is some {\b bold} text.\par
}

(来自Wikipedia about Rich Text Format

如果你将该文件输入到你的代码中,你会得到类似的东西

这大概不是你想要的。

所以让我们假设您的输入是您逐行阅读的纯文本。

如何防止空行掉线

请注意,从空字符串构造的Paragraph 几乎不需要垂直空间,例如

doc.add(new Paragraph("1 Between this line and line 3 there is an empty paragraph."));
doc.add(new Paragraph(""));
doc.add(new Paragraph("3 This is line 3."));
doc.add(new Paragraph("4 Between this line and line 6 there is a paragraph with only a space."));
doc.add(new Paragraph(" "));
doc.add(new Paragraph("6 This is line 6."));

(EmptyParagraphs 测试testEmptyParagraphsForFazriBadri)

结果

观察到第 2 行有效地被删除了。

原因是Paragraph(String string)构造函数是一个方便的快捷方式,

p = new Paragraph(string);

本质上等价于

p = new Paragraph();
if (string != null && string.length() != 0) {
    p.add(new Chunk(string));
}

因此,对于new Paragraph(""),段落中没有添加任何块,它是空的,它的块不需要垂直空间。

在这种情况下,您可以开始使用段落本身或周围段落的LeadingSpacingBeforeSpacingAfter,但最简单的方法肯定是将空字符串"" 替换为一个包含空格" "的字符串。

在您的情况下,可以通过替换来完成

while ((line = br.readLine()) != null) {               
    p = new Paragraph(line, title ? bold : normal);
    document.add(p);
}           

通过

while ((line = br.readLine()) != null) {               
    p = new Paragraph(line.length() == 0 ? " " : line, title ? bold : normal);
    document.add(p);
}           

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2011-08-10
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多