打印
本指南展示了如何使用 Printing API。
概述
可以使用以下方式之一打印网页:
- 使用
window.print()
JavaScript 函数。 可以从网页上的 JavaScript 代码调用此函数。 -
使用 JxBrowser API 的
Frame.print()
方法。 该方法请求打印框架。 如果需要打印整页,应该调用主框架中的print()
方法。 例如:browser.mainFrame().ifPresent(Frame::print);
browser.mainFrame().ifPresent(Frame::print)
网页不会立即打印出来。 PrintCallback
将被调用以告诉浏览器如何处理打印请求。默认情况下,所有打印请求都被取消。
打印预览
要允许打印请求并显示打印预览对话框,请使用以下代码:
browser.set(PrintCallback.class, (params, tell) -> tell.showPrintPreview());
browser.set(PrintCallback::class.java, PrintCallback { params, tell -> tell.showPrintPreview() }
在“打印预览”对话框中,您可以选择首选打印选项:
配置设置
使用以下代码告诉浏览器继续打印:
browser.set(PrintCallback.class, (params, tell) -> tell.print());
browser.set(PrintCallback::class.java, PrintCallback { params, tell -> tell.print() }
之后,将调用 PrintHtmlCallback
或 PrintPdfCallback
以允许您配置打印设置。 这些回调对应于浏览器中当前加载的内容类型。 对于 HTML 内容调用 PrintHtmlCallback
,对于 PDF 内容调用 PrintPdfCallback
。
现在,让我们看看如何使用这些回调。
步骤 1:选择打印机
首先,您需要选择要使用的打印机。 打印机有两种类型:PdfPrinter
和 SystemPrinter
。 PdfPrinter
相当于打印预览对话框中的 Save as PDF
选项。 SystemPrinter
类型表示系统中安装的打印机,它可以是虚拟的也可以是物理的。 回调参数提供可用打印机的列表。 您可以检索默认系统打印机 PdfPrinter
,或从系统打印机中选择打印机:
browser.set(PrintHtmlCallback.class, (params, tell) -> {
// The PDF printer is always available.
PdfPrinter<PdfPrinter.HtmlSettings> pdfPrinter = params.printers().pdfPrinter();
// The default printer is optional.
SystemPrinter<SystemPrinter.HtmlSettings> defaultPrinter =
params.printers()
.defaultPrinter()
.orElseThrow(
() -> new IllegalStateException("The default printer is not found."));
// Find a system printer by name.
SystemPrinter<SystemPrinter.HtmlSettings> systemPrinter =
params.printers()
.list()
.stream()
.filter(printer -> printer.deviceName()
.equals("Microsoft XPS Document Writer"))
.findFirst()
.orElseThrow( () -> new IllegalStateException("The printer is not found."));
});
browser.set(PrintHtmlCallback::class.java, PrintHtmlCallback { params, tell ->
// The PDF printer is always available.
val pdfPrinter = params.printers().pdfPrinter()
// The default printer is optional.
val defaultPrinter = params.printers()
.defaultPrinter()
.orElseThrow { IllegalStateException("The default printer is not found.") }
// Find a system printer by name.
val systemPrinter = params.printers()
.list()
.firstOrNull { it.deviceName() == "Microsoft XPS Document Writer" }
?: throw IllegalStateException("The printer is not found.")
})
步骤 2:配置设置
每台打印机都有一个 PrintSettings
类型的参数,该类型定义打印机在当前环境下可用的打印设置。 每台打印机都包含一个代表当前打印操作的 PrintJob
。 打印设置应用于打印作业:
SystemPrinter<HtmlSettings> printer = params.printers()
.defaultPrinter()
.orElseThrow(IllegalStateException::new);
PrintJob<HtmlSettings> printJob = printer.printJob();
printJob.settings()
.header("<span style='font-size: 12px;'>Page header:</span>"
+ "<span class='title'></span>")
.footer("<span style='font-size: 12px;'>Page footer:</span>"
+ "<span class='pageNumber'></span>")
.paperSize(ISO_A4)
.colorModel(COLOR)
.enablePrintingBackgrounds()
.disablePrintingHeaderFooter()
.orientation(PORTRAIT)
.apply();
val printer = params.printers()
.defaultPrinter()
.orElseThrow { IllegalStateException() }
val printJob = printer.printJob()
printJob.settings()
.header("<span style='font-size: 12px;'>Page header:</span>"
+ "<span class='title'></span>")
.footer("<span style='font-size: 12px;'>Page footer:</span>"
+ "<span class='pageNumber'></span>")
.paperSize(ISO_A4)
.colorModel(COLOR)
.enablePrintingBackgrounds()
.disablePrintingHeaderFooter()
.orientation(PORTRAIT)
.apply()
调用 apply()
方法将应用配置好的设置,并重新生成打印预览文档,随后将其发送到打印机。 在告诉浏览器开始打印之前,您可以订阅 PrintCompleted
事件,以便在打印完成后收到通知:
printJob.on(PrintCompleted.class, event -> {
if (event.isSuccess()) {
System.out.println("Printing is completed successfully.");
} else {
System.out.println("Printing has failed.");
}
});
printJob.on(PrintCompleted::class.java) { event ->
if (event.isSuccess()) {
println("Printing is completed successfully.")
} else {
println("Printing has failed.")
}
}
### 步骤 3:开始打印
现在我们准备开始打印:
<div class="code-tabs">
<embed-code file="examples/src/main/java/com/teamdev/jxbrowser/examples/PrintSettings.java" fragment="Proceed"></embed-code>
```java
tell.proceed(printer);
tell.proceed(printer)
</div>
以下是完整的代码片段:
browser.set(PrintHtmlCallback.class, (params, tell) -> {
SystemPrinter<HtmlSettings> printer = params.printers()
.defaultPrinter()
.orElseThrow(IllegalStateException::new);
PrintJob<HtmlSettings> printJob = printer.printJob();
printJob.settings()
.header("<span style='font-size: 12px;'>Page header:</span>"
+ "<span class='title'></span>")
.footer("<span style='font-size: 12px;'>Page footer:</span>"
+ "<span class='pageNumber'></span>")
.paperSize(ISO_A4)
.colorModel(COLOR)
.enablePrintingBackgrounds()
.disablePrintingHeaderFooter()
.orientation(PORTRAIT)
.apply();
printJob.on(PrintCompleted.class, event -> {
if (event.isSuccess()) {
System.out.println("Printing is completed successfully.");
} else {
System.out.println("Printing has failed.");
}
});
tell.proceed(printer);
});
browser.set(PrintHtmlCallback::class.java, PrintHtmlCallback { params, tell ->
val printer = params.printers()
.defaultPrinter()
.orElseThrow { IllegalStateException() }
val printJob = printer.printJob()
printJob.settings()
.header("<span style='font-size: 12px;'>Page header:</span>"
+ "<span class='title'></span>")
.footer("<span style='font-size: 12px;'>Page footer:</span>"
+ "<span class='pageNumber'></span>")
.paperSize(ISO_A4)
.colorModel(COLOR)
.enablePrintingBackgrounds()
.disablePrintingHeaderFooter()
.orientation(PORTRAIT)
.apply()
printJob.on(PrintCompleted::class.java) { event ->
if (event.isSuccess()) {
println("Printing is completed successfully.")
} else {
println("Printing has failed.")
}
}
tell.proceed(printer)
})
在 PdfPrinter
上打印是一样的,只是您必须指定目标 PDF 文件的路径。
browser.set(PrintHtmlCallback.class, (params, tell) -> {
PdfPrinter<HtmlSettings> printer = params.printers().pdfPrinter();
PrintJob<HtmlSettings> printJob = printer.printJob();
printJob.settings()
.paperSize(ISO_A4)
.enablePrintingBackgrounds()
.pdfFilePath(Paths.get("<path-to-pdf-file>"))
.apply();
printJob.on(PrintCompleted.class, event -> {
if (event.isSuccess()) {
System.out.println("Printing is completed successfully.");
} else {
System.out.println("Printing has failed.");
}
});
tell.proceed(printer);
});
browser.set(PrintHtmlCallback::class.java, PrintHtmlCallback { params, tell ->
val printer = params.printers().pdfPrinter()
val printJob = printer.printJob()
printJob.settings()
.paperSize(ISO_A4)
.enablePrintingBackgrounds()
.pdfFilePath(Path("<path-to-pdf-file>"))
.apply()
printJob.on(PrintCompleted::class.java) { event ->
if (event.isSuccess()) {
println("Printing is completed successfully.")
} else {
println("Printing has failed.")
}
}
tell.proceed(printer)
})
PrintPdfCallback
具有相同的接口,唯一的区别在于可应用于打印作业的打印设置。
取消打印
要取消打印,请使用以下方法:
browser.set(PrintCallback.class, (params, tell) -> tell.cancel());
browser.set(PrintCallback::class.java, PrintCallback { params, tell -> tell.cancel() }