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()); }
关键逻辑说明
- 复用JTable的打印逻辑:通过
JTable.getPrintable()获取自带的Printable对象,它已经处理了表格的分页、宽度适配等核心逻辑,避免重复造轮子。 - 自定义Logo绘制:在每页的顶部居中绘制Logo,通过
PageFormat获取页面的可打印区域坐标,确保Logo位置正确。 - 调整表格打印区域:克隆
PageFormat并修改其可打印起始Y坐标和高度,让表格内容在Logo下方打印,避免内容重叠,同时保证表格有足够空间分页显示所有数据。
直接生成PDF文件(可选)
如果不需要通过打印对话框,而是要程序直接生成PDF文件,可以使用第三方库(如Apache PDFBox、iText)来实现。以PDFBox为例,你可以将上述Printable渲染到PDF文档中,不过这需要额外引入依赖。
内容的提问来源于stack exchange,提问作者mohamed hossam
相关产品推荐
相关产品推荐

