【问题标题】:iText: set cell height during CellEventiText:在 CellEvent 期间设置单元格高度
【发布时间】:2016-09-11 19:48:02
【问题描述】:

我正在使用 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 月)。

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

【问题讨论】:

    标签: java itext cell


    【解决方案1】:

    一个单元格事件被触发一个单元格被绘制。您可能已经怀疑 iText 将带有 positionRectangle 对象传递给 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

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

    【讨论】:

    • 这非常适用于 90 度增量的旋转,我会接受这个答案。由于需要任何角度的文本,我正在使用 CellEvent 处理它,但我想我会看看 90 dgree 旋转是否适用于所有要求。谢谢!
    猜你喜欢
    • 2012-01-06
    • 2021-11-09
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2012-08-08
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多