如何在Itext5中填充页面的其余空白部分?

时间:2018-09-12 08:11:38

标签: java itext

enter image description here

如上所述,我使用pdfTable作为页面的正文部分。现在,我想用表的边框,列,行填充整个身体,如果该表没有填充整个身体的部分。如下图所示。

enter image description here

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您在创建表格时这样做,您可以作弊作弊。

我将提供一个利用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);
    }

不,我们添加获取表顶部位置,并将该表添加到文档中。

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,此解决方案无法添加加标签的表格单元格,因此如果您有此要求,则会破坏合规性。