iText:具有不同单元格/列宽度的不同表格行

时间:2015-12-30 23:49:29

标签: pdf-generation itext

如何使用Java创建一个包含三行的表,如下所示:

  • 第一行有一个单元格,100%整个表格宽度
  • 第二行首先从左侧单元格宽度50mm,第二行20mm和第三行30mm,总共是表格宽度的100%
  • 第三行首先从左侧单元格宽度30mm,第二行50mm和第三行10mm,总共是表格宽度的90%

iText的代码怎么样? enter image description here

1 个答案:

答案 0 :(得分:1)

所以你想用iText创建一个如下所示的表:

enter image description here

屏幕截图中的PDF是使用TableMeasurements示例创建的。生成的PDF也可以下载以供检查:table_measurements.pdf

在观看此屏幕截图时,第一眼跳到眼睛的事实是表格看起来并不完整"。这意味着我们必须按照昨天已经在SO上解释的方式(以及之前的许多次)完成表格:Why the 2nd row of table won't be written?(实际上是How to generate pdf if our column less than the declared table columnItextSharp, number of Cells not dividable by the length of the row的副本, Odd Numbered Cell Not Added To PdfPdfTable: last cell is not visible以及......)

在评论部分,我被问到:

  

如何使用没有边框的单元格完成行?

我回答:

  

使用table.getDefaultCell().setBorder(Rectangle.NO_BORDER);

请注意,PdfPCell.NO_BORDER也适用于PdfPCell扩展Rectangle类。

在你的情况下,我们有这样的事情:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(10);
    table.setTotalWidth(Utilities.millimetersToPoints(100));
    table.setLockedWidth(true);
    table.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
    table.addCell(getCell(10));
    table.addCell(getCell(5));
    table.addCell(getCell(3));
    table.addCell(getCell(2));
    table.addCell(getCell(3));
    table.addCell(getCell(5));
    table.addCell(getCell(1));
    table.completeRow();
    document.add(table);
    document.close();
}

为了使示例更加逼真,我创建了一个精确宽度为100 mm的表格。为了确认宽度,我锁定宽度。如前所述,我确保默认单元格没有边框。在添加了不同宽度(10厘米,5厘米,3厘米,2厘米,3厘米,5厘米,1厘米)的所有细胞后,我完成了这一行。

你可能想知道getCell()方法是什么样的。 Amedee在评论中已经回答了这个问题(出于某些原因你忽略了):

private PdfPCell getCell(int cm) {
    PdfPCell cell = new PdfPCell();
    cell.setColspan(cm);
    cell.setUseAscender(true);
    cell.setUseDescender(true);
    Paragraph p = new Paragraph(
            String.format("%smm", 10 * cm),
            new Font(Font.FontFamily.HELVETICA, 8));
    p.setAlignment(Element.ALIGN_CENTER);
    cell.addElement(p);
    return cell;
}

我们创建一个PdfPCell并设置colspan以反映以cm为单位的宽度。我添加了一些更奇特的东西。我没有使用此示例中的任何功能,但未在官方网站或StackOverflow上进行说明。

有关更多rowpan和colspan示例,请查看Colspan and rowspan中的official documentation部分。