我正在使用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月)。
我希望单元格的高度取决于所使用的实际标题文本。关于如何解决这个问题的任何想法?
答案 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
请注意,水平和垂直的概念会旋转到。如果要水平居中旋转的内容,则必须使内容的垂直对齐居中并旋转对齐的内容。