Остановить разделение таблицы iText на новой странице

Я разрабатываю приложение для Android, которое генерирует pdf.

Я использую itextpdf для создания pdf.

У меня есть следующая проблема:

У меня есть таблица с 3 строками, и когда эта таблица находится ближе к концу страницы, иногда она помещает одну строку на одну страницу и две строки на следующую страницу.

Есть ли способ заставить эту таблицу начинаться на следующей странице, чтобы я мог иметь полную таблицу на следующей странице?

Спасибо


person Shura Capricorn    schedule 22.10.2015    source источник
comment
Пожалуйста, прочитайте раздел о том, как задать хороший вопрос и опубликовать свой код.   -  person LBes    schedule 22.10.2015
comment
Я понимаю вопрос. Это явная техническая проблема, на которую можно легко ответить. Начну писать ответ.   -  person Bruno Lowagie    schedule 22.10.2015


Ответы (2)


Взгляните на пример Разделение:

Paragraph p = new Paragraph("Test");
PdfPTable table = new PdfPTable(2);
for (int i = 1; i < 6; i++) {
    table.addCell("key " + i);
    table.addCell("value " + i);
}
for (int i = 0; i < 40; i++) {
    document.add(p);
}
document.add(table);

У нас есть таблица с 5 строками, и в этом случае мы добавляем несколько абзацев, чтобы таблица была добавлена ​​в конец страницы.

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

введите здесь описание изображения

Вы хотите избежать такого поведения: вы не хотите, чтобы таблица разделялась.

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

PdfPTable nesting = new PdfPTable(1);
PdfPCell cell = new PdfPCell(table);
cell.setBorder(PdfPCell.NO_BORDER);
nesting.addCell(cell);
document.add(nesting);

Теперь вы получаете этот результат:

введите здесь описание изображения

На предыдущей странице было достаточно места для рендеринга пары строк, но поскольку мы поместили полную таблицу в строку с одним столбцом, iText перенаправит всю таблицу на следующую страницу.

person Bruno Lowagie    schedule 22.10.2015

В качестве альтернативы подходу Бруно к вложению таблицы в таблицу с одной ячейкой для предотвращения разделения вы также можете использовать PdfPTable.setKeepTogether(true) для запуска таблицы на новой странице, если она не помещается на текущей странице.

Используя аналогичный пример:

Paragraph p = new Paragraph("Test");
PdfPTable table = new PdfPTable(2);
for (int i = 1; i < 6; i++) {
    table.addCell("key " + i);
    table.addCell("value " + i);
}
for (int i = 0; i < 40; i++) {
    document.add(p);
}
// Try to keep the table on 1 page
table.setKeepTogether(true);
document.add(table);

Оба подхода (вложение в таблицу с 1 ячейкой и использование setKeepTogether()) ведут себя в моих тестах совершенно одинаково. Это включает в себя случаи, когда таблица слишком велика для размещения на новой странице, и ее все еще необходимо разделить, например. при добавлении 50 вместо 5 строк в примере выше.

person rhens    schedule 22.10.2015