我尝试通过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中显示的整个区域?
答案 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
的各种方式。