如何将ResultSet打印到PDF?Boxable(基于PDFBox)实现遇阻求助
解决Boxable导出ResultSet到PDF的问题
我猜你现在卡在了把ResultSet数据转化为PDF表格这一步,毕竟网上的示例有时候会漏掉关键细节。我帮你整理了一套完整的可运行代码,结合你给出的片段,一步步实现导出功能:
第一步:确认依赖
首先要确保你的项目里引入了Boxable和PDFBox的正确依赖(以Maven为例):
<dependency> <groupId>com.github.dhorions</groupId> <artifactId>boxable</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.29</version> </dependency>
Gradle用户可以对应调整依赖配置。
第二步:完整实现代码
结合你给出的result集合和addNewPage方法,我把完整逻辑补全:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; import com.github.dhorions.boxable.Table; import com.github.dhorions.boxable.Row; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; public class ResultSetToPdf { public static ArrayList<String[]> result = new ArrayList<String[]>(); public static void main(String[] args) { PDDocument doc = new PDDocument(); try { // 1. 先从数据库获取ResultSet(替换成你的数据库连接逻辑) Connection con = getYourDatabaseConnection(); String sql = "SELECT * FROM your_table"; PreparedStatement ps = con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); // 2. 把ResultSet转化为ArrayList<String[]>(填充你的result集合) convertResultSetToList(rs); rs.close(); ps.close(); con.close(); // 3. 构建PDF表格 PDPage page = addNewPage(doc); // 设置页面边距,使用A4纸尺寸 float margin = 50; float tableWidth = page.getMediaBox().getWidth() - 2 * margin; float yStart = page.getMediaBox().getHeight() - margin; float bottomMargin = margin; // 创建表格实例,自动处理分页 Table table = new Table(yStart, tableWidth, bottomMargin, result, page, doc, true, true); // 自定义表头样式(可选) Row<PDPage> headerRow = table.getHeaderRow(); headerRow.setFontSize(12); headerRow.setBackgroundColor(new java.awt.Color(200, 200, 200)); // 渲染表格到PDF table.draw(); // 保存PDF文件 doc.save("result_set_export.pdf"); System.out.println("PDF导出成功!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (doc != null) doc.close(); } catch (Exception e) { e.printStackTrace(); } } } // 你的addNewPage方法,保持不变 private static PDPage addNewPage(PDDocument doc) { PDPage page = new PDPage(PDRectangle.A4); doc.addPage(page); return page; } // 把ResultSet转化为ArrayList<String[]>的工具方法 private static void convertResultSetToList(ResultSet rs) throws Exception { ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); // 先添加表头行 String[] header = new String[columnCount]; for (int i = 1; i <= columnCount; i++) { header[i-1] = metaData.getColumnName(i); } result.add(header); // 再添加数据行,处理空值避免异常 while (rs.next()) { String[] row = new String[columnCount]; for (int i = 1; i <= columnCount; i++) { row[i-1] = rs.getString(i) != null ? rs.getString(i) : ""; } result.add(row); } } // 替换成你自己的数据库连接获取方法 private static Connection getYourDatabaseConnection() { // 这里写你的数据库连接逻辑,比如JDBC连接MySQL/Oracle等 return null; } }
关键细节说明
- ResultSet转集合:必须把ResultSet的表头和数据行都存入
result集合,Boxable的Table构造器依赖这个完整的二维数组结构。 - 自动分页:Boxable的
Table.draw()方法会自动处理分页,当内容超过一页时,会自动创建新页面。 - 空值处理:转换时把
null值转为空字符串,避免PDF渲染时抛出异常。 - 样式自定义:你可以按需修改表头的字体、背景色,或者调整数据行的字体大小,只需要修改
Row的相关属性即可。
常见问题排查
如果还是失败,先检查这几点:
- 依赖版本是否匹配:Boxable 1.5.1对应PDFBox 2.x版本,不要混用1.x的PDFBox。
- 数据库连接是否正常:确保
getYourDatabaseConnection()能正确获取连接,ResultSet有数据返回。 - 文件权限:保存PDF的路径是否有写入权限。
内容的提问来源于stack exchange,提问作者Xenon
相关产品推荐
相关产品推荐

