JavaFX Print WebView as PDF仅打印一页

时间:2017-09-19 08:34:32

标签: java javafx

我尝试通过Microsoft Print to PDF打印机打印WebView的内容。

这是我的代码:

BorderPane root = new BorderPane();
Scene scene = new Scene(root,1920,4000);
scene.getStylesheets().add(getClass().
      getResource("application.css").toExternalForm());

WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.load(url.toString());
scene.setRoot(browser);
primaryStage.setScene(scene);

...

if(printerToUse != null) {
   PrinterJob job = PrinterJob.createPrinterJob();
   job.setPrinter(printerToUse);
   PageLayout pageLayout = printerToUse.createPageLayout(Paper.A4, 
   PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);
   job.printPage(pageLayout, browser);
   job.endJob();
}

系统会提示我选择保存位置并打印PDF,但它只包含WebPage的一个裁剪页面。即使我选择了一个带有A0的pageLayout(该页面将完全适合),我只会得到一个裁剪的页面PDF。 如何打印WebView中显示的整个区域?

2 个答案:

答案 0 :(得分:0)

而是使用job.printPage(),尝试使用WebEngine对象的print()方法。
例如:

if (job != null) {
    webEngine.print(job);
    job.endJob();
}

这可以解决您的问题。

答案 1 :(得分:0)

我发现在我的打印机上打印 ImageView 节点的结果非常差,所以我选择了另一种方法,该方法可以提供出色的打印结果。 如果您将 PDF 作为文件或字节 [],则可以将 java.awt.print.PrinterJob 与 Apache 的 PDFBox 结合使用。这是我的代码片段:

public Optional<PrintService> print(byte[] pdf) throws MyPrintException {
    try (PDDocument document = PDDocument.load(pdf)) {
      PrinterJob job = PrinterJob.getPrinterJob();
      job.setPageable(new PDFPageable(document));
      if (job.printDialog()) {
        job.print();
        return Optional.of(job.getPrintService());
      }
      return Optional.empty();
    } catch (PrinterException | IOException e) {
      log.error("Print error", e);
      throw new MyPrintException(e);
    }
}

但是请注意,这仅在 headless=false 时有效。在 Spring Boot 中,默认值为 headless=true。幸运的是,有很多帖子描述了配置 headless=false 的各种方式。