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

Java Swing实现PDF顶部带Logo的JTable打印方案咨询

解决JTable与顶部Logo一同打印到PDF的问题

直接将JTable放入JPanel打印时,JPanel只会绘制当前可见区域的内容,无法处理JTable的分页与滚动逻辑,因此仅能显示部分数据。要实现Logo与完整JTable内容的分页打印,你可以通过自定义Printable接口,复用JTable自带的打印逻辑,同时在每页顶部添加Logo。

具体实现代码

假设你的Logo已存储在名为logoLabel的JLabel中,以下是完整的解决方案:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.Icon;
import javax.swing.JTable;
import java.text.MessageFormat;

public class PrintWithLogo {
    public static void printTableWithLogo(JTable table, Icon logoIcon) {
        MessageFormat head = new MessageFormat(""); // 清空默认页眉,我们自己绘制Logo
        MessageFormat foot = new MessageFormat("page {0}");
        
        // 获取JTable自带的Printable对象,复用其分页、适配逻辑
        Printable tablePrintable = table.getPrintable(JTable.PrintMode.FIT_WIDTH, head, foot);
        
        // 自定义组合Logo与表格的Printable
        Printable combinedPrintable = (Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
            Graphics2D g2d = (Graphics2D) g.create();
            
            // 绘制Logo:页面顶部居中,预留边距
            int logoWidth = logoIcon.getIconWidth();
            int logoHeight = logoIcon.getIconHeight();
            int logoX = (int) (pf.getImageableX() + (pf.getImageableWidth() - logoWidth) / 2);
            int logoY = (int) pf.getImageableY() + 10; // 顶部10px边距
            logoIcon.paintIcon(null, g2d, logoX, logoY);
            
            // 调整表格打印区域:Logo下方预留15px间距
            int tableStartY = logoY + logoHeight + 15;
            PageFormat tablePageFormat = (PageFormat) pf.clone();
            tablePageFormat.setImageableY(tableStartY);
            // 计算表格可用高度:页面总可打印高度减去Logo占用的高度
            tablePageFormat.setImageableHeight(pf.getImageableHeight() - (tableStartY - pf.getImageableY()));
            
            // 调用JTable的Printable完成表格打印
            int printResult = tablePrintable.print(g2d, tablePageFormat, pageIndex);
            
            g2d.dispose();
            return printResult;
        };
        
        // 初始化打印任务
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        printerJob.setPrintable(combinedPrintable);
        
        // 显示打印对话框,选择PDF打印机即可输出PDF文件
        if (printerJob.printDialog()) {
            try {
                printerJob.print();
            } catch (PrinterException ex) {
                ex.printStackTrace();
            }
        }
    }

    // 使用示例:在你的业务代码中调用
    // printTableWithLogo(yourTable, yourLogoLabel.getIcon());
}

关键逻辑说明

  1. 复用JTable的打印逻辑:通过JTable.getPrintable()获取自带的Printable对象,它已经处理了表格的分页、宽度适配等核心逻辑,避免重复造轮子。
  2. 自定义Logo绘制:在每页的顶部居中绘制Logo,通过PageFormat获取页面的可打印区域坐标,确保Logo位置正确。
  3. 调整表格打印区域:克隆PageFormat并修改其可打印起始Y坐标和高度,让表格内容在Logo下方打印,避免内容重叠,同时保证表格有足够空间分页显示所有数据。

直接生成PDF文件(可选)

如果不需要通过打印对话框,而是要程序直接生成PDF文件,可以使用第三方库(如Apache PDFBox、iText)来实现。以PDFBox为例,你可以将上述Printable渲染到PDF文档中,不过这需要额外引入依赖。

内容的提问来源于stack exchange,提问作者mohamed hossam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:23:11