如何使用PDFBox和Boxable在同一PDF页面创建多个不重叠的表格
问题根源
你遇到的表格重叠问题核心是每次创建新表格时都使用了固定的初始Y坐标:PDFBox的页面坐标系以左下角为原点,Y值越大对应页面位置越靠上,你没有在每个表格绘制完成后更新下一个表格的起始Y坐标,导致所有表格都从同一个顶部位置开始渲染,自然就重叠了。另外你当前代码缺少了table.draw()的调用,这是Boxable实际将表格渲染到页面的必要步骤。
修复方案
只需要调整Y坐标的传递逻辑即可,修改后的代码如下:
// 循环外初始化起始Y坐标,用你原本的yStart初始值 float currentY = yStart; for(ProductGroup productGroup: productGroups) { // 创建表格时第一个参数用当前的currentY,而非固定的yStart BaseTable table = new BaseTable(currentY, yStartNewPage, bottomMargin, tableWidth, margin, doc, page, true, drawContent); Row<PDPage> headerRow = table.createRow(15f); Cell<PDPage> cell; createHeader(headerRow, table); Row<PDPage> row; for(Article article: productGroup.getArticles()) { row = table.createRow(10f); cell = row.createCell((100 / 9f) , article.getBranch().replace("\n", "").replace("\r", "")); cell.setFont(PDType1Font.HELVETICA); cell.setFontSize(fontSize10); cell = row.createCell((100 / 9f) , article.getMode().replace("\n", "").replace("\r", "")); cell.setFont(PDType1Font.HELVETICA); cell.setFontSize(fontSize10); cell = row.createCell((100 / 3f) , article.getFeatureText().replace("\n", "").replace("\r", "")); cell.setFont(PDType1Font.HELVETICA); cell.setFontSize(fontSize10); } // 绘制表格,返回值是表格结束位置的Y坐标,赋值给currentY供下一个表格使用 currentY = table.draw(); // 可选:两个表格之间加20pt的间距,根据需要调整数值 currentY -= 20; // 可选:判断当前页剩余空间是否足够放下下一个表格,不够就新建页面 if (currentY < bottomMargin) { page = new PDPage(); doc.addPage(page); currentY = yStartNewPage; } }
补充说明
BaseTable.draw()方法的返回值就是当前表格最后一行底部对应的Y坐标,直接作为下一个表格的起始Y坐标就能保证上下顺序排列无重叠。- 如果你不需要表格之间的间距,去掉
currentY -= 20这行即可。 - 上面代码中的可选换页逻辑可以避免表格超出当前页底部被截断的问题。
内容的提问来源于stack exchange,提问作者kalipts
相关产品推荐
相关产品推荐

