有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. # 1 楼答案

    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%确定不会有任何不必要的影响,只需返回一个有序的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)。)