Impressão

Este guia mostra como trabalhar com a API de impressão.

Visão Geral

A página Web pode ser impressa através de uma das seguintes formas:

  1. Utilizando a função JavaScript window.print(). Esta função pode ser invocada a partir do código JavaScript numa página Web.
  2. Utilizar o método Frame.print() da API JxBrowser. O método solicita a impressão do frame. Se precisar imprimir a página inteira, você deve chamar o método print() no frame principal. Por exemplo:

     browser.mainFrame().ifPresent(Frame::print);
    
     browser.mainFrame().ifPresent(Frame::print)
    

A página Web não é impressa imediatamente. O PrintCallback será invocado para dizer ao navegador como lidar com o pedido de impressão. Por padrão, todos os pedidos de impressão são cancelados.

Pré-Visualização de Impressão

Para permitir o pedido de impressão e apresentar a caixa de diálogo Visualização da Impressão, utilize o seguinte código:

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

Na caixa de diálogo Pré-visualização da Impressão, você pode selecionar as opções de impressão preferidas:

Pré-visualização da Impressão

Configurando as Definições

Diga ao navegador para prosseguir com a impressão utilizando o seguinte código:

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

Depois disso, o PrintHtmlCallback ou o PrintPdfCallback serão invocados para permitir a configuração das definições de impressão. Estas chamadas de retorno correspondem ao tipo de conteúdo que está atualmente carregado no navegador. Para conteúdo HTML é invocado o PrintHtmlCallback e para conteúdo PDF o PrintPdfCallback.

Agora, vamos ver como trabalhar com estas chamadas de retorno.

Passo 1: Escolher a Impressora

Em primeiro lugar, é necessário escolher a impressora em que deseja imprimir. Existem dois tipos de impressoras: PdfPrinter e SystemPrinter. O PdfPrinter é um equivalente da opção Salvar como PDF na caixa de diálogo Visualizar Impressão. O tipo SystemPrinter representa uma impressora instalada no sistema, podendo ser virtual ou física. Os parâmetros da chamada de retorno fornecem uma lista das impressoras disponíveis. Você pode obter a PdfPrinter, a impressora predefinida do sistema, ou escolher uma impressora entre as impressoras do sistema:

browser.set(PrintHtmlCallback.class, (params, tell) -> {
    // A impressora PDF está sempre disponível.
    PdfPrinter<PdfPrinter.HtmlSettings> pdfPrinter = params.printers().pdfPrinter();

    // A impressora padrão é opcional.
    SystemPrinter<SystemPrinter.HtmlSettings> defaultPrinter =
        params.printers()
              .defaultPrinter()
              .orElseThrow(
                  () -> new IllegalStateException("A impressora predefinida não foi encontrada."));

    // Encontrar uma impressora de sistema pelo nome.
    SystemPrinter<SystemPrinter.HtmlSettings> systemPrinter =
        params.printers()
              .list()
              .stream()
              .filter(printer -> printer.deviceName()
                                        .equals("Microsoft XPS Document Writer"))
              .findFirst()
              .orElseThrow(() -> new IllegalStateException("A impressora não foi encontrada."));
});
browser.set(PrintHtmlCallback::class.java, PrintHtmlCallback { params, tell ->
    // A impressora PDF está sempre disponível.
    val pdfPrinter = params.printers().pdfPrinter()

    // A impressora padrão é opcional.
    val defaultPrinter = params.printers()
        .defaultPrinter()
        .orElseThrow { IllegalStateException("A impressora predefinida não foi encontrada.") }

    // Localizar uma impressora do sistema pelo nome.
    val systemPrinter = params.printers()
        .list()
        .firstOrNull { it.deviceName() == "Microsoft XPS Document Writer" }
        ?: throw IllegalStateException("A impressora não foi encontrada.")
})

Passo 2: Configurar as Definições

Cada impressora é parametrizada com um tipo PrintSettings que define as configurações de impressão disponíveis para a impressora no contexto atual. Cada impressora contém um PrintJob que representa a operação de impressão atual. As definições de impressão são aplicadas a um trabalho de impressão:

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()

A chamada do método apply() aplicará as definições configuradas e gerará novamente o documento de pré-visualização de impressão que será posteriormente enviado para a impressora. Antes de dizer ao navegador para começar a imprimir na impressora, você pode se inscrever ao evento PrintCompleted para receber uma notificação quando a impressão em estiver concluída:

printJob.on(PrintCompleted.class, event -> {
    if (event.isSuccess()) {
        System.out.println("A impressão foi concluída com êxito.");
    } else {
        System.out.println("A impressão falhou.");
    }
});
printJob.on(PrintCompleted::class.java) { event ->
    if (event.isSuccess()) {
       println("A impressão foi concluída com sucesso.")
    } else {
       println("A impressão falhou.")
    }
}

Passo 3: Iniciar a Impressão

Agora estamos prontos para começar a imprimir:

tell.proceed(printer);
tell.proceed(printer)

Aqui está o trecho de código completo:

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("A impressão foi concluída com êxito.");
        } else {
            System.out.println("A impressão falhou.");
        }
    });
    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;'>Cabeçalho da página:</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("A impressão foi concluída com êxito.")
        } else {
            println("A impressão falhou.")
        }
    }
    tell.proceed(printer)
})

A impressão na PdfPrinter é idêntica, exceto que é necessário especificar o caminho do arquivo PDF de destino:

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("A impressão foi concluída com êxito.");
        } else {
            System.out.println("A impressão falhou.");
        }
    });
    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("A impressão foi concluída com êxito.")
        } else {
            println("A impressão falhou.")
        }
    }
    tell.proceed(printer)
})

O PrintPdfCallback tem a mesma interface e a única diferença reside nas definições de impressão que podem ser aplicadas a uma tarefa de impressão.

Cancelar a Impressão

Para cancelar a impressão, utilize a seguinte abordagem:

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