iText:在CellEvent期间设置单元格高度

时间:2016-05-16 04:46:07

标签: java itext cell

我正在使用iText创建带有表格的PDF。表头有90度旋转文本,我使用CellEvent(下面的代码)添加。这很有效,除非表格跨越多个页面,旋转的单元格标题文本从页面顶部流出。

我已尝试设置 cell.setFixedHeight(100),但它似乎不会影响单元格。我也尝试了this solution,但我无法让单元格显示带有文本的结果图像。

    @Override
public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {

    PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];

    try {
                    canvas.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, false), this.fontSize);
    } catch (DocumentException | IOException e) {
        e.printStackTrace();
    }

    if (this.alignment == PdfPCell.ALIGN_CENTER) {
        this.left = ((position.getRight() - position.getLeft()) / 2 );
    }
    else if (this.alignment == PdfPCell.ALIGN_MIDDLE) {
        this.top = ((position.getTop() - position.getBottom()) / 2 );
    }
    canvas.showTextAligned(this.alignment, this.text, position.getLeft() + this.left, position.getTop() - this.top, this.rotation);
}

这是单元头溢出的样子。在此示例中,它应显示月份和年份(2016年3月)。

enter image description here

我希望单元格的高度取决于所使用的实际标题文本。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

在绘制单元格后触发单元格事件。您可能已经怀疑iText将Rectangle对象与position传递给cellLayout方法。传递PdfPCell对象,但它仅用于只读目的。由于position已修复,您无法在其上使用setFixedHeight()

看着屏幕截图,我很困惑:你为什么要使用单元格事件来添加旋转90度的内容?问题的解决方案是使用setRotation()方法:

PdfPCell cell = new PdfPCell(new Phrase("May 16, 2016"));
cell.setRotation(90);

现在内容将被旋转,单元格的大小将根据内容进行调整。请查看RotatedCell示例:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(8);
    for (int i = 0; i < 8; i++) {
        PdfPCell cell =
            new PdfPCell(new Phrase(String.format("May %s, 2016", i + 15)));
        cell.setRotation(90);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        table.addCell(cell);
    }
    for(int i = 0; i < 16; i++){
        table.addCell("hi");
    }
    document.add(table);
    document.close();
}

结果如下所示:rotated_cell.pdf

enter image description here

请注意,水平和垂直的概念会旋转到。如果要水平居中旋转的内容,则必须使内容的垂直对齐居中并旋转对齐的内容。