1 回答
TA贡献1840条经验 获得超5个赞
如果您在创建表时这样做,您可以通过欺骗来完成此操作。
我将提供一个部分解决方案,它利用 PDF 中的一个复杂性表:表只是 PDF 中的行。它们不是结构化内容。
您可以利用这一点 - 在渲染表格时跟踪您正在绘制垂直线的位置,然后将它们继续到页面底部。
让我们创建一个新的单元格事件。它跟踪4件事:left哪个是表格最左边的x坐标,right哪个是表格最右边的x坐标,xCoordinates它是我们画垂直线的所有x坐标的集合,最后cellHeights哪个是一个列表所有单元格高度。
class CellMarginEvent implements PdfPCellEvent {
Set<Float> xCoordinates = new HashSet<Float>();
Set<Float> cellHeights = new HashSet<Float>();
Float left = Float.MAX_VALUE;
Float right = Float.MIN_VALUE;
public void cellLayout(PdfPCell pdfPCell, Rectangle rectangle, PdfContentByte[] pdfContentBytes) {
this.xCoordinates.add(rectangle.getLeft());
this.xCoordinates.add(rectangle.getRight());
this.cellHeights.add(rectangle.getHeight());
left = Math.min(left,rectangle.getLeft());
right = Math.max(right, rectangle.getRight());
}
public Set<Float> getxCoordinates() {
return xCoordinates;
}
}
然后我们将所有单元格添加到表格中,但暂时不会将表格添加到文档中
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(OUTPUT_FILE));
document.open();
PdfPTable table = new PdfPTable(4);
CellMarginEvent cellMarginEvent = new CellMarginEvent();
for (int aw = 0; aw < 320; aw++) {
PdfPCell cell = new PdfPCell();
cell.addElement(new Paragraph("Cell: " + aw));
cell.setCellEvent(cellMarginEvent);
table.addCell(cell);
}
不,我们添加 get top- 表格的顶部位置,并将表格添加到文档中。
float top = writer.getVerticalPosition(false);
document.add(table);
然后我们绘制完成的表格的垂直和水平线。对于每个单元格的高度,我只使用了cellHeights.
Set<Float> xCoordinates = cellMarginEvent.getxCoordinates();
//Draw the column lines
PdfContentByte canvas = writer.getDirectContent();
for (Float x : xCoordinates) {
canvas.moveTo(x, top);
canvas.lineTo(x, 0 + document.bottomMargin());
canvas.closePathStroke();
}
Set<Float> cellHeights = cellMarginEvent.cellHeights;
Float cellHeight = (Float)cellHeights.toArray()[0];
float currentPosition = writer.getVerticalPosition(false);
//Draw the row lines
while (currentPosition >= document.bottomMargin()) {
canvas.moveTo(cellMarginEvent.left,currentPosition);
canvas.lineTo(cellMarginEvent.right,currentPosition);
canvas.closePathStroke();
currentPosition -= cellHeight;
}
最后关闭文档:
document.close()
示例输出:
请注意,我说这是一个不完整示例的唯一原因是因为您可能需要对top
标题单元格进行一些调整,或者您可能需要自定义单元格样式(背景颜色、线条颜色等)为自己记账。
我还会注意到我刚刚想到的另一个缺点 - 在标记的 PDF 的情况下,此解决方案无法添加标记的表格单元格,因此如果您有该要求,则会违反合规性。
添加回答
举报