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

How to wrap multiple paragraphs in one element?

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

我可以使用什么类型将多个 Paragraph 对象包装在一个单元中,这样我就可以从我的子方法中 return 它们? Element class 没有 add() 方法,Chunk class.

也没有

我尝试了 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;
}

Wrapping my Paragraph objects in another Paragraph object produces the desired output, but it feels odd

虽然这确实让人觉得奇怪,但它确实有效并且是代码中明确考虑的一个用例。 (比如看Paragraph.breakUp()的代码和继承的Phrase.process(ElementListener).

and I fear that the wrapping paragraph might introduce additional margins in the document

它仅在您要求时执行(使用 setIndentationLeft(float) / setIndentationRight(float) / setSpacingAfter(float) / setSpacingBefore(float))。因此,您可以选项添加额外的缩进,但您不会不情愿地接受不需要的额外缩进。


另一方面,如果您想 100% 确定不会有任何不必要的影响,您可以简单地 return 一个有序的 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)。)