2

我正在尝试使用包含形状单元格的表格生成 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();
        }
    }

我想阻止这个并实现那个
提前致谢。

4

1 回答 1

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);

结果如下所示:

结果1

但是有两个连续边界没有被折叠的工件:

在此处输入图像描述

于 2019-11-13T18:15:10.487 回答