在多个页面上打印 javafx WebEngine 的内容

Printing a javafx WebEngine's content on multiple pages

我想打印一个WebEngine的内容:

PrinterJob job = PrinterJob.createPrinterJob();
job.getJobSettings().setJobName("Print WebEngine");
job.getJobSettings().setPageLayout(job.getPrinter().createPageLayout(Paper.A4, PageOrientation.PORTRAIT, MarginType.DEFAULT));

webEngine.print(job);

job.endJob();

不幸的是,我的打印机只打印了一页,尽管加载了更多的内容,这些内容应该打印在更多页面上。此外,打印在单页上的内容在结果上是扭曲的。

有谁知道如何在多个页面上打印 WebEngine 的全部内容,以免缩放或类似的内容?

我可以使用您的代码打印多页。第一次打印将打印 Google 的主页。那是一页。在搜索栏中输入测试,然后按回车键。这应该 return 两个可打印页面。

//https://docs.oracle.com/javase/8/javafx/embedded-browser-tutorial/printing.htm
//http://tutorials.jenkov.com/javafx/webview.html



import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class App extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX WebView Example");

        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();        
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
            System.out.println("oldValue: " + oldValue);
            System.out.println("newValue: " + newValue);
            
            if (newValue == Worker.State.SUCCEEDED) {
                PrinterJob printerJob = PrinterJob.createPrinterJob();
                if(printerJob != null)
                {
                    printerJob.showPrintDialog(primaryStage);
                    webEngine.print(printerJob);
                    printerJob.endJob();
                }                
            }
        });
        
        webEngine.load("http://google.com");
        

        VBox vBox = new VBox(webView);
        Scene scene = new Scene(vBox, 960, 600);

        primaryStage.setScene(scene);
        primaryStage.show();

    }
}