我正在使用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;
}
答案 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)
。)