打印

本指南展示了如何使用 Printing API。

概述

可以使用以下方式之一打印网页:

  1. 使用 window.print() JavaScript 函数。 可以从网页上的 JavaScript 代码调用此函数。
  2. 使用 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() }

在“打印预览”对话框中,您可以选择首选打印选项:

Print Preview

配置设置

使用以下代码告诉浏览器继续打印:

browser.set(PrintCallback.class, (params, tell) -> tell.print());
browser.set(PrintCallback::class.java, PrintCallback { params, tell -> tell.print() }

之后,将调用 PrintHtmlCallbackPrintPdfCallback 以允许您配置打印设置。 这些回调对应于浏览器中当前加载的内容类型。 对于 HTML 内容调用 PrintHtmlCallback ,对于 PDF 内容调用 PrintPdfCallback

现在,让我们看看如何使用这些回调。

步骤 1:选择打印机

首先,您需要选择要使用的打印机。 打印机有两种类型:PdfPrinterSystemPrinterPdfPrinter 相当于打印预览对话框中的 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() }
Go Top