有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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();
        }
    }

我想预防this并实现that
提前谢谢


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

    结果如下:

    result1

    不过,有一个伪像是两个连续的边界没有被折叠:

    enter image description here