Вы можете сортировать чит , чтобы выполнить это, если вы делаете это во время создания таблицы.
Я предложу частичное решение, которое использует одну из таблиц сложности в PDF: таблицы - это просто строки в PDF. Это не структурированный контент.
Вы можете воспользоваться этим преимуществом - следите за тем, где вы рисуете вертикальные линии при рендеринге таблицы, и просто продолжайте их до конца страницы.
Давайте создадим новое событие ячейки. Он отслеживает 4 вещи: left
, которая является крайней левой координатой x таблицы, right
, которая является крайней правой координатой x таблицы, xCoordinates
, которая является набором всех координат x, которые мы рисуем по вертикали и, наконец, cellHeights
, который представляет собой список всех высот ячеек.
class CellMarginEvent implements PdfPCellEvent {
Set<Float> xCoordinates = new HashSet<Float>();
Set<Float> cellHeights = new HashSet<Float>();
Float left = Float.MAX_VALUE;
Float right = Float.MIN_VALUE;
public void cellLayout(PdfPCell pdfPCell, Rectangle rectangle, PdfContentByte[] pdfContentBytes) {
this.xCoordinates.add(rectangle.getLeft());
this.xCoordinates.add(rectangle.getRight());
this.cellHeights.add(rectangle.getHeight());
left = Math.min(left,rectangle.getLeft());
right = Math.max(right, rectangle.getRight());
}
public Set<Float> getxCoordinates() {
return xCoordinates;
}
}
Затем мы добавим все наши ячейки в таблицу, но не добавим таблицу к документу
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(OUTPUT_FILE));
document.open();
PdfPTable table = new PdfPTable(4);
CellMarginEvent cellMarginEvent = new CellMarginEvent();
for (int aw = 0; aw < 320; aw++) {
PdfPCell cell = new PdfPCell();
cell.addElement(new Paragraph("Cell: " + aw));
cell.setCellEvent(cellMarginEvent);
table.addCell(cell);
}
Нет, мы добавляем get top - верхнюю позицию нашей таблицы и добавляем таблицу в документ.
float top = writer.getVerticalPosition(false);
document.add(table);
Затем мы рисуем вертикальные и горизонтальные линии заполненной таблицы. Для высоты каждой ячейки я просто использовал первый элемент в cellHeights
.
Set<Float> xCoordinates = cellMarginEvent.getxCoordinates();
//Draw the column lines
PdfContentByte canvas = writer.getDirectContent();
for (Float x : xCoordinates) {
canvas.moveTo(x, top);
canvas.lineTo(x, 0 + document.bottomMargin());
canvas.closePathStroke();
}
Set<Float> cellHeights = cellMarginEvent.cellHeights;
Float cellHeight = (Float)cellHeights.toArray()[0];
float currentPosition = writer.getVerticalPosition(false);
//Draw the row lines
while (currentPosition >= document.bottomMargin()) {
canvas.moveTo(cellMarginEvent.left,currentPosition);
canvas.lineTo(cellMarginEvent.right,currentPosition);
canvas.closePathStroke();
currentPosition -= cellHeight;
}
И, наконец, закройте документ:
document.close()
Пример вывода:
Обратите внимание, что единственная причина, по которой я говорю, что это неполные примеры, заключается в том, что могут быть некоторые корректировки, которые нужно внести в top
в случае ячеек заголовка, или могут быть пользовательские стили ячеек (цвет фона, цвет линии и т. д.) Вы должны учитывать себя.
Я также отмечу еще один недостаток, о котором я только что подумал - в случае тегированных PDF-файлов это решение не может добавить теговые ячейки таблицы и, следовательно, нарушит соответствие, если у вас есть это требование.