You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:43