答案 0 :(得分:0)
如果您在创建表格时这样做,您可以作弊作弊。
我将提供一个利用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);
}
不,我们添加获取表顶部位置,并将该表添加到文档中。
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,此解决方案无法添加加标签的表格单元格,因此如果您有此要求,则会破坏合规性。