Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iText:在CellEvent期间设置单元格高度_Java_Itext_Cell - Fatal编程技术网

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

Java iText:在CellEvent期间设置单元格高度,java,itext,cell,Java,Itext,Cell,我正在使用iText创建带有表的PDF。表格标题有90度旋转的文本,我正在使用CellEvent(下面的代码)添加这些文本。这非常有效,除非表格跨越多个页面,否则旋转的单元格标题文本会从页面顶部流出 我试过设置单元格。设置固定高度(100),但似乎对单元格没有影响。我也尝试过,但我无法让单元格显示带有文本的结果图像 @Override public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] ca

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

我试过设置单元格。设置固定高度(100),但似乎对单元格没有影响。我也尝试过,但我无法让单元格显示带有文本的结果图像

    @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月)

我希望根据实际使用的标题文本将单元格设置为任意高度。关于如何解决这个问题有什么想法吗?

在绘制单元格后,会触发单元格事件。您可能已经怀疑iText将带有
位置的
矩形
对象传递给
单元格布局
方法。传递了
PdfPCell
对象,但该对象仅用于只读目的。由于
位置是固定的,因此不能在其上使用
设置固定高度()

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

PdfPCell cell = new PdfPCell(new Phrase("May 16, 2016"));
cell.setRotation(90);
现在,内容将被旋转,单元格的大小将适应内容。请看一个例子:

public void createPdf(String dest)抛出IOException、DocumentException{
文档=新文档();
getInstance(文档,新文件输出流(dest));
document.open();
PdfPTable=新的PdfPTable(8);
对于(int i=0;i<8;i++){
PDFP电池=
新的PdfPCell(新短语(String.format(“May%s,2016”,i+15));
细胞旋转(90);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
表2.addCell(cell);
}
对于(int i=0;i<16;i++){
表1.addCell(“hi”);
}
文件。添加(表);
document.close();
}
结果如下所示:


请注意,“水平”和“垂直”这两个概念将旋转为。如果要使旋转的内容水平居中,则必须使内容的垂直对齐居中,并旋转对齐的内容。

这非常适用于90度增量的旋转,我接受这个答案。我用CellEvent处理它是因为需要任何角度的文本,但我想我会看看90 dgree旋转是否适用于所有要求。谢谢
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();
}