JavaFX中使用PrinterJob如何实现表格完整打印?
解决JavaFX TableView打印仅显示部分列的问题
你遇到的是典型的打印内容超出页面可打印区域的问题——5列表格的总宽度超过了纵向A4页面的可用宽度,所以右侧列被自动裁切了。结合你使用的HP LaserJet P1102打印机,给你几个实用的解决办法:
1. 切换为横向打印
横向A4页面的可用宽度比纵向大很多,大概率能放下所有5列。只需要修改页面方向参数:
PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.HARDWARE_MINIMUM);
2. 自定义打印边距,扩大可打印区域
HP P1102的硬件最小边距可能仍有冗余,你可以手动设置更小的自定义边距来增加可用宽度(单位为点,1英寸=72点):
// 设置上下左右各20点的窄边距 double leftMargin = 20; double rightMargin = 20; double topMargin = 20; double bottomMargin = 20; PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, leftMargin, rightMargin, topMargin, bottomMargin);
3. 自动缩放表格适配页面宽度
如果不想调整页面方向或边距,可以让表格自动缩放到适合页面宽度的大小,同时保持比例:
private void print(Node node) { Printer printer = Printer.getDefaultPrinter(); PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM); // 计算缩放比例:页面可打印宽度 / 表格实际宽度 double tableWidth = node.getBoundsInParent().getWidth(); double printableWidth = pageLayout.getPrintableWidth(); double scale = printableWidth / tableWidth; // 应用缩放变换 ScaleTransform scaleTransform = new Scale(scale, scale); node.getTransforms().add(scaleTransform); PrinterJob job = PrinterJob.createPrinterJob(); if (job != null && job.showPrintDialog(node.getScene().getWindow())) { boolean success = job.printPage(pageLayout, node); if (success) { job.endJob(); } } // 打印完成后移除缩放,避免影响界面正常显示 node.getTransforms().remove(scaleTransform); }
额外小提示
你也可以先优化TableView本身的列宽布局,比如开启自动列宽调整:
tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
不过这只是辅助优化,核心还是要确保打印时内容能适配页面宽度。
内容的提问来源于stack exchange,提问作者nemke nemke
相关产品推荐
相关产品推荐

