奇怪的setRowspan错误/无法正常工作

时间:2016-12-03 11:37:24

标签: java pdf itext

我为我的iText表设置了一个标题,其中包含6列,后来我想对另一个表使用相同的标题并将colspans设置为更通用,但是那一行没有工作了

这是我的原始(工作)代码,包含6列:

public static PdfPTable createHeaderContent() {
    PdfPTable table = new PdfPTable(6);
    table.setWidthPercentage(100);

    PdfPCell dobicell = new PdfPCell();
    dobicell.setColspan(2);
    dobicell.addElement(new Phrase(docType, DOBIFONTADR));
    dobicell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.TOP);
    table.addCell(dobicell);

    dobicell = new PdfPCell();
    dobicell.setColspan(2);
    dobicell.addElement(new Phrase("Ing. Mario J. Schwaiger", DOBIFONTADR));
    dobicell.setBorder(Rectangle.TOP);
    table.addCell(dobicell);

    dobicell = Dobilogo.getPiccell(92, 104);
    dobicell.setBorder(Rectangle.TOP | Rectangle.RIGHT);
    dobicell.setColspan(3);
    dobicell.setRowspan(2);
    table.addCell(dobicell);

    dobicell = getKundenCol(kunde);
    dobicell.setColspan(2);
    dobicell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
    table.addCell(dobicell);

    dobicell = getUserCell(user);
    dobicell.setColspan(2);
    table.addCell(dobicell);

    table.setHeaderRows(1);
    return table;
}

结果看起来应该是(我已经使用了一些漂亮的颜色来表示跨度: enter image description here

"通用"的修改代码几乎是一样的:

public static PdfPTable createHeaderContent(int[] coldist) {
    PdfPTable table = new PdfPTable(coldist[0] + coldist[1] + coldist[2]); //createHeaderContent(new int[]{4, 7, 4, 4, 7});
    table.setWidthPercentage(100);

    PdfPCell dobicell = new PdfPCell();
    dobicell.setColspan(coldist[0]); //used to be 2, now 4
    dobicell.addElement(new Phrase(doctype, DOBIFONTADR));        
    dobicell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.TOP);
    table.addCell(dobicell);

    dobicell = new PdfPCell();
    dobicell.setColspan(coldist[1]); //used to be 2, now 7
    dobicell.addElement(new Phrase("Ing. Mario J. Schwaiger", DOBIFONTTITEL));
    dobicell.setBorder(Rectangle.TOP);
    table.addCell(dobicell);

    dobicell = Dobilogo.getPiccell(92, 104);
    dobicell.setBorder(Rectangle.TOP | Rectangle.RIGHT);
    dobicell.setColspan(coldist[2]); //used to be 3, now 4
    dobicell.setRowspan(2);  // <--- This is fishy, but why?
    table.addCell(dobicell);

    dobicell = getKundenCol(kunde);
    dobicell.setColspan(coldist[3]); //used to be 2, now 4
    dobicell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
    table.addCell(dobicell);

    dobicell = getUserCell(user);
    dobicell.setColspan(coldist[4]); //used to be 2, now 7
    table.addCell(dobicell);

    table.setHeaderRows(1);
    return table;
}

但最后一栏有问题: enter image description here

起初我假设另一行隐藏并使用了dobicell.setRowspan(3);,但这已经改变了第一个数据行。尝试添加另一个单元格会将其放在标题之后的第一行。

奇怪的是,当我将最后一部分的用户单元扩展到整个行的单元格时,消失了。

这个问题是否存在解决方案或原因?

1 个答案:

答案 0 :(得分:1)

这里有两个问题,一个是iText似乎忽略的问题,另一个是导致问题的问题:

  • 在原始代码中,单元格需要7列,因为它们连续两次setColspan(2)setColspan(3)。但该表仅为6列构建:new PdfPTable(6)

    iText似乎忽略了这里缺少的列......

  • 代码将第一行声明为表格的标题:table.setHeaderRows(1)。这与第一行中最后一个单元格的声明冲突,跨越2行setRowspan(2)

    这里的iText忽略了标题行中的rowspan,导致出现不希望的外观。

    要解决此问题,请不要声明行间距或使用至少两行的行间距(如果有足够的行将会跟进)。

OP在评论中确认了

  

在修改后的版本中,我仍然有setHeaderRows(1)。用setHeaderRows(2)替换它解决了问题