java - 在多个页面上打印节点

标签 java printing javafx javafx-8

我有一个表格 View 不能放在一页上,但是当我打印它时只打印一页。我应该怎么做才能将表格的其余部分打印在其他页面上?

下面的示例代码用 50 行填充表格 View 并打印它(我使用 foxit 作为 pdf 打印机,根据需要进行修改)。尽管 TableView 显示超过 45 行,但输出 pdf 仅包含一页以第 30 行结尾。

public class FXPrint extends Application {
    public static void main(String[] args) { launch(FXPrint.class); }

    @Override
    public void start(Stage stage) throws Exception {
        TableView<String> table = new TableView<>();
        for (int i = 0; i < 25; i++) {
            TableColumn<String, String> tc = new TableColumn<>("" + i);
            int index = i;
            tc.setCellValueFactory(param -> {
                String s = param.getValue();
                if (s.length() <= index) return new SimpleStringProperty();
                else return new SimpleStringProperty(s.substring(index, index + 1));
            });
            table.getColumns().add(tc);
        }
        for (int i = 0; i < 50; i++) table.getItems().add(i + "sdfghjklrthyjkcasdghasfdsfgdfgsdfggfdg");

        Button print =  new Button("print");
        print.setOnAction(e -> print(table));

        VBox box = new VBox(10, table, print);
        VBox.setVgrow(table, Priority.ALWAYS);
        stage.setScene(new Scene(box));
        stage.setWidth(600);
        stage.setHeight(1200);
        stage.show();
    }

    public void print(final TableView<?> table) {
        Printer printer = Printer.getAllPrinters().stream().filter(p -> p.getName().contains("Foxit")).findAny().get();
        PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);

        PrinterJob job = PrinterJob.createPrinterJob(printer);
        if (job != null) {
            job.getJobSettings().setPageLayout(pageLayout);
            if (job.printPage(table)) {
                job.endJob();
            }
        }
    }
}

最佳答案

您应该根据可打印区域的高度和行的高度在多个节点上拆分您的 TableView。然后为所有节点调用 job.PrintPage,并调用一次 job.endJob。 这是我的多页打印方法:

public static List<Node> getLineRecordPages(Collection<LineRecord> lineRecords, PageLayout layout) {
        LinkedList<Node> result = new LinkedList<>();
        VBox node = null;
        double totalHeight = Double.POSITIVE_INFINITY;
        for (LineRecord record : lineRecords) {
            PrintLineRecordView view = new PrintLineRecordView();
            final PrintLineRecordPresenter presenter = (PrintLineRecordPresenter) view.getPresenter();
            presenter.bind(record);
            final double elementHeight = view.getView().prefHeight(layout.getPrintableWidth());
            if (elementHeight + totalHeight > layout.getPrintableHeight()) {
                node = new VBox();
                node.setMaxWidth(layout.getPrintableWidth());
                result.add(node);
                totalHeight = 0;
            }
            totalHeight+=elementHeight;
            if (node != null) {
                node.getChildren().add(view.getView());
            }
        }
        return result;
    }

然后实际将页面发送到打印作业:

Printer printer = Printer.getDefaultPrinter();
PageLayout pageLayout = printer.getDefaultPageLayout();
PrinterJob printerJob = PrinterJob.createPrinterJob(printer);
final List<Node> pages = Formatter.getLineRecordPages(lineRecords, pageLayout);
final boolean print = printerJob.showPrintDialog(null);
if (print) {
    pages.forEach(printerJob::printPage);
    printerJob.endJob();
}

关于java - 在多个页面上打印节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185882/

相关文章:

java - Android AsyncTask,处理不可用的服务器

java - 使用 getPlacemarks 迭代 KML

c# - .net 以横向表示形式打印 HTML 文档

java - 如何定义 ListView 应该使用哪个属性来呈现

java - 如何在 JavaFX 中的另一个 Controller 中使用类似(面板、anchorpane)的组件

java - 使用 log4j 将不同的日志级别记录到不同的文件

java - 为什么反射不想加载我的测试类?

python - 在同一语句python中打印字典和字符串对象

asp.net - 使用 ASP.NET 生成打印质量 PDF

JavaFX BarChart,按系列名称设置系列颜色