iText 7 предотвращает разделение ячейки при разрыве страницы
Я пытаюсь создать PDF-файл с таблицей, содержащей ячейки с фигурами.
Я отменяюCellRenderer
класса и внутри нового класса я рисую фигуры в DrawableCellRenderer#draw
.
Иногда, когда таблицу необходимо разделить, а в ячейке есть диапазон строк, я хочу предотвратить ее разделение и начать со следующей страницы.
Я пытался setKeepTogether(true)
но это не сработало. Вложенные таблицы тоже не работали.
Вот код, который я использую:
public void test2() {
try {
pdfDocument = new PdfDocument(new PdfWriter(filePath));
document = new Document(pdfDocument);
Table masterTable = new Table(2).setExtendBottomRowOnSplit(true);
masterTable.addHeaderCell(new Cell().add(new Paragraph("icon")))
.addHeaderCell(new Cell().add(new Paragraph("i")));
int rowSpan = 15;
for(int i = 0; i < 50; i++) {
Cell cell = new Cell(rowSpan, 1);
cell.setNextRenderer(new DrawableCellRenderer(cell, SOME_SHAPE));
cell.setKeepTogether(true);
masterTable.addCell(cell);
for(int j = 0; j < rowSpan; j++) {
cell = new Cell();
cell.add(new Paragraph(i + ", " + j));
masterTable.addCell(cell);
}
}
document.add(masterTable);
} catch (FileNotFoundException e) {
ErrorMessage.outPrintln(ErrorMessage.DEBUG,
e.getMessage());
} finally {
pdfDocument.close();
}
}
1 ответ
Этот код должен более или менее достичь того, чего вы хотите. Это требует, чтобы вы установили фиксированную ширину столбца, хотя
Document document = new Document(pdfDocument);
Table masterTable = new Table(1).setExtendBottomRowOnSplit(true);
UnitValue[] columnWidths = UnitValue.createPointArray(new float[] {50, 100});
float borderThickness = 0.5f;
Border solidBorder = new SolidBorder(borderThickness);
Table innerHeader = new Table(columnWidths)
.addCell(new Cell().setBorder(Border.NO_BORDER).setBorderRight(solidBorder).add(new Paragraph("icon")))
.addCell(new Cell().setBorder(Border.NO_BORDER).setBorderLeft(solidBorder).add(new Paragraph("i")));
masterTable.addHeaderCell(new Cell().setBorder(Border.NO_BORDER)
.setBorderTop(solidBorder).setBorderLeft(solidBorder).setBorderRight(solidBorder)
.setPadding(0).add(innerHeader));
int rowSpan = 15;
for(int i = 0; i < 50; i++) {
Table innerTable = new Table(columnWidths).setKeepTogether(true);
Cell cell = new Cell(rowSpan, 1).setBorder(Border.NO_BORDER).setBorderRight(solidBorder)
.setBorderBottom(solidBorder);
innerTable.addCell(cell);
for(int j = 0; j < rowSpan; j++) {
cell = new Cell().setBorder(Border.NO_BORDER).setBorderLeft(solidBorder);
cell.add(new Paragraph(i + ", " + j));
if (j == rowSpan - 1) {
cell.setBorderBottom(solidBorder);
}
innerTable.addCell(cell);
}
masterTable.addCell(new Cell().setPadding(0).add(innerTable));
}
document.add(masterTable);
Результат выглядит так:
h ttps:https://stackru.com/images/11d8025b27d8d773771a85defbfc3e638ee3bf66.png
Однако есть артефакт двух последовательных границ, которые не разрушаются:
h ttps:https://stackru.com/images/ac636b494d912c3b7557c51e4e9cd669c4916053.png