如何将多个段落包装在一个元素中?

时间:2019-07-08 12:24:21

标签: java itext wrapper paragraph

我正在使用iText 5在Java中创建一个相当复杂的PDF文档。我向文档中添加了一堆Paragraph对象。为了提高代码的可读性,我想创建多种方法来创建文档的不同方面。

我可以使用哪种类型将多个Paragraph对象包装在一个单元中,以便可以从子方法中返回它们? Element类没有add()方法,Chunk类也没有。

我尝试了Phrase,但后来我失去了所有换行符。将我的Paragraph对象包装在另一个Paragraph对象中会产生所需的输出,但是感觉很奇怪,我担心包装后的段落可能会在文档中引入额外的页边距。

那么包装Paragraph对象以便对其进行逻辑分组的最佳类型是什么?


代码示例

我当前的代码:

Document doc = new Document(...);
doc.add(new Paragraph("Aspect A.1"));
doc.add(new Paragraph("Aspect A.2"));
doc.add(new Paragraph("Aspect A.3"));

doc.add(new Paragraph("Aspect B.1"));
doc.add(new Paragraph("Aspect B.2"));

我追求的目标:

Document doc = new Document(...);
doc.add(createAspectA());
doc.add(createAspectB());

// ...

private WrapperElement createAspectA() {
  WrapperElement wrapper = new WrapperElement(...);

  wrapper.add(new Paragraph("Aspect A.1"));
  wrapper.add(new Paragraph("Aspect A.2"));
  wrapper.add(new Paragraph("Aspect A.3"));

  return wrapper;
}

private WrapperElement createAspectB() {
  WrapperElement wrapper = new WrapperElement(...);

  wrapper.add(new Paragraph("Aspect B.1"));
  wrapper.add(new Paragraph("Aspect B.2"));

  return wrapper;
}

1 个答案:

答案 0 :(得分:2)

  

将我的Paragraph对象包装到另一个Paragraph对象中会产生所需的输出,但感觉很奇怪

虽然确实确实有些奇怪,但它确实有效,并且是代码中明确考虑的用例。 (例如,查看Paragraph.breakUp()和继承的Phrase.process(ElementListener).的代码)

  

我担心换行段落可能会在文档中引入额外的空白

只有在您要求时(使用setIndentationLeft(float) / setIndentationRight(float) / setSpacingAfter(float) / setSpacingBefore(float)),它才会执行。因此,您可以通过 option 添加额外的缩进,但不会不愿意地接受不必要的额外缩进。


另一方面,如果您想100%确保不会有任何不良影响,则可以简单地返回有序的Iterable<Element>,例如ArrayList<Element>,然后将添加到文档中的内容更改为forEach调用:

private Iterable<Element> createAspectA() {
    ArrayList<Element> wrapper = new ArrayList<>();

    wrapper.add(new Paragraph("Aspect A.1"));
    wrapper.add(new Paragraph("Aspect A.2"));
    wrapper.add(new Paragraph("Aspect A.3"));

    return wrapper;
}

并替换

doc.add(createAspectA());

作者

for (Element e : createAspectA())  doc.add(e);

(不幸的是,doc.add会引发标记的异常,否则可能是createAspectA().forEach(doc::add)。)