Apache PDFBox生成PDF时新增页面无法显示数据行问题
问题原因与修复方案
问题出在新建页面后未重新创建对应的PDPageContentStream,原有的contentStream始终关联第一页,所有后续绘制操作都只会在第一页 common薛(于六十九3追Currentaccstore而非oko(SampleDataGenerator.generateSampleData().getJsonObject("data").getJsonArray("transactionList");执行,导致新页面无数据。
修复步骤
- 每次新增页面时,先关闭旧的contentStream(防止资源泄漏)
- 基于新创建的页面初始化新的contentStream
- 调整contentStream的作用域,确保循环中能正确更新
修改后的代码示例
float dataXPosition = 10f; float dataYPosition = 560f; float margin = 100f; float rowHeight = 20f; // 初始化contentStream,关联第一页 PDPageContentStream contentStream = new PDPageContentStream(document, page); JsonArray transactionList = SampleDataGenerator.generateSampleData().getJsonObject("data").getJsonArray("transactionList"); for (int i = 0; i < transactionList.size(); i++) { JsonObject transaction = transactionList.getJsonObject(i); if (dataYPosition - rowHeight < margin) { // 关闭旧的contentStream contentStream.close(); // 创建新页面并添加到文档 page = new PDPage(); document.addPage(page); // 基于新页面初始化新的contentStream contentStream = new PDPageContentStream(document, page); // 重置Y坐标到新页面的起始位置 dataYPosition = page.getMediaBox().getHeight() - margin; } List<String> transactionValues = generateTransactionRow.doGenerateRow(transaction); for (String dataValues: transactionValues) { contentStream.beginText(); contentStream.setFont(HELVETICA, 6.5f); contentStream.newLineAtOffset(dataXPosition, dataYPosition); contentStream.showText(dataValues); contentStream.endText(); dataXPosition += 100; } dataXPosition -= 600; dataYPosition -= rowHeight; } // 循环结束后关闭最后一个contentStream contentStream.close();
关键改动说明
- 初始化时创建第一页的contentStream,循环内新增页面时先关闭旧流,再创建新流关联新页面
- 循环结束后务必关闭最后一个contentStream,确保所有内容都写入PDF
- 保留原有坐标重置逻辑,保证新页面从正确位置开始绘制
内容的提问来源于stack exchange,提问作者Plus Ultra
相关产品推荐
相关产品推荐

