Как обернуть несколько абзацев в один элемент? - PullRequest
2 голосов
/ 08 июля 2019

Я создаю довольно сложный PDF-документ на Java, используя iText 5. Я добавляю в свой пакет несколько 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 Ответ

2 голосов
/ 08 июля 2019

Обтекание моих Paragraph объектов в другом Paragraph объекте дает желаемый результат, но кажется странным

Хотя это действительно может показаться странным, оно работает и является вариантом использования, явно рассмотренным в коде. (Например, посмотрите на код Paragraph.breakUp() и унаследованный Phrase.process(ElementListener).)

и я боюсь, что заключительный абзац может привести к дополнительным полям в документе

Это происходит только в том случае, если вы попросите об этом (используя 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).)

...