itext
Таблицы: iText 5 и iText 7
Поиск…
замечания
Имена PdfPTable
iText 5 PdfPTable
и PdfPCell
были выбраны, потому что у нас уже были классы с именем Table
и Cell
для создания объектов таблицы и ячейки на самом высоком уровне программирования. Был также класс PdfTable
который будет использоваться iText внутри. У этих классов было много недостатков, и они устарели в пользу PdfPTable
и PdfPCell
. Они давно удалены.
На протяжении многих лет PdfPTable
и PdfPCell
также получали некоторую критику со стороны пользователей. Например: пользователи не понимали разницы между текстовым режимом и композитным режимом.
Текстовый режим используется при создании PdfPCell
следующим образом:
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
В этом случае вы определяете свойства, такие как горизонтальное выравнивание на уровне PdfPCell
.
Композитный режим срабатывает в тот момент, когда вы используете метод addElement()
:
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
В этом случае некоторые свойства, определенные на уровне PdfPCell
(например, горизонтальное выравнивание), игнорируются. Горизонтальное выравнивание должно быть определено на уровне элементов, добавленных в ячейку. Например: если вы хотите создать ячейку, в которой разные абзацы должны иметь другое горизонтальное выравнивание, вы переключитесь в композитный режим.
Если вы посмотрите на снимок экрана таблицы, созданной с помощью примера iText 5, вы заметите, что ячейки с содержимым Cell 1.1 (добавленные в текстовом режиме) и Cell 1.2 (добавленные в композитном режиме) выравниваются совсем по-другому.
В ответ на критику нечетного выравнивания мы ввели методы использования информации о зазоре и спуске. Мы используем эти методы для ячеек с содержимым Cell 2.1 (добавлено в текстовом режиме) и Cell 2.2 (добавлено в составном режиме). Мы также представили для этих ячеек прописку 5.
Теперь результат намного лучше.
Что мы зафиксировали в iText 7:
Поскольку мы создали iText 7 с нуля, у нас не было классов наследия с именами, которые мы не могли использовать повторно. Мы представили новую Table
и новый класс Cell
.
Текстового режима больше нет и нет композитного режима. Cell
создается либо без параметров, либо с параметрами, которые определяют rowspan и colspan. Все содержимое добавляется одинаково: с помощью метода add()
.
Наши клиенты также просили предоставить средства для определения разницы и отступов. В примере iText 7 мы добавили серый фон, чтобы показать разницу. В ячейке с содержимым Cell 2.1 мы определяем разницу в 5 пользовательских единиц. Отступ по умолчанию - 2. В ячейке с содержимым Cell 2.2 мы определяем заполнение из 5 пользовательских единиц, по умолчанию - 0.
Как вы можете сказать из снимков экрана, ячейки отображаются довольно красиво. Нам не нужно было использовать методы для установки зажима или спускателя. Поведение по умолчанию намного ближе к поведению, которое ожидает разработчик.
Хотите узнать больше о таблицах и ячейках в iText 7?
Чтение Добавление объектов AbstractElement (часть 2), которое является главой 5 в учебнике iText 7: Building Blocks . Получите бесплатную электронную книгу!
HelloWorldTable.java (iText 5)
В этом примере мы создадим следующую таблицу, используя iText 5:
Для этого нужен PdfPTable
и PdfPCell
:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(3);
PdfPCell cell = new PdfPCell(new Phrase("Cell with colspan 3"));
cell.setColspan(3);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
cell.setRowspan(2);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell 2.1"));
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell();
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
Paragraph p = new Paragraph("Cell 2.2");
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
table.addCell(cell);
document.add(table);
document.close();
}
Источник: developers.itxtpdf.com
HelloWorldTable.java (iText 7)
В этом примере мы создадим следующую таблицу, используя iText 7:
Для этого нам понадобится класс Table
и Cell
:
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
Table table = new Table(3);
Cell cell = new Cell(1, 3)
.setTextAlignment(TextAlignment.CENTER)
.add("Cell with colspan 3");
table.addCell(cell);
cell = new Cell(2, 1)
.add("Cell with rowspan 2")
.setVerticalAlignment(VerticalAlignment.MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
table.addCell(new Cell().add("Cell 1.2"));
table.addCell(new Cell()
.add("Cell 2.1")
.setBackgroundColor(Color.LIGHT_GRAY)
.setMargin(5));
table.addCell(new Cell()
.add("Cell 1.2")
.setBackgroundColor(Color.LIGHT_GRAY)
.setPadding(5));
document.add(table);
}
}
Источник: developers.itxtpdf.com и учебник iText 7: Building Blocks .