Как заполнить оставшуюся пустую часть страницы в Itext5? - PullRequest
0 голосов
/ 12 сентября 2018

enter image description here

Как видно выше, я использовал pdfTable в качестве основной части страницы.Теперь я хочу заполнить все тело границей, столбцом, строкой таблицы, если таблица не заполняет всю часть тела. Как показано на рисунке ниже.

enter image description here

Большое спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете сортировать чит , чтобы выполнить это, если вы делаете это во время создания таблицы.

Я предложу частичное решение, которое использует одну из таблиц сложности в 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()

Пример вывода:

enter image description here

Обратите внимание, что единственная причина, по которой я говорю, что это неполные примеры, заключается в том, что могут быть некоторые корректировки, которые нужно внести в top в случае ячеек заголовка, или могут быть пользовательские стили ячеек (цвет фона, цвет линии и т. д.) Вы должны учитывать себя.

Я также отмечу еще один недостаток, о котором я только что подумал - в случае тегированных PDF-файлов это решение не может добавить теговые ячейки таблицы и, следовательно, нарушит соответствие, если у вас есть это требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...