Converter HTML para PDF em Java pode ser desafiador.

Para realizar essa conversão, comece por renderizar corretamente o HTML e, em seguida, convertê-lo em um PDF. Embora isso possa parecer simples, apenas a renderização do HTML é uma tarefa extremamente complicada.

Felizmente, bibliotecas populares como o Flying Saucer não apenas renderizam decentemente o HTML, mas também podem criar arquivos PDF a partir dele. Infelizmente, há uma desvantagem que essas bibliotecas compartilham: elas não conseguem acompanhar os padrões da web.

Se você precisa usar CSS3, WebGL ou outra tecnologia atual, essas bibliotecas não são adequadas para você. Elas também não conseguem executar JavaScript.

Neste artigo, exploramos como converter HTML para PDF em Java e ser capaz de utilizar os padrões web mais recentes.

Abordagem ao problema 

Sugerimos usar o JxBrowser para renderizar páginas da web e convertê-las para PDF.

O JxBrowser é um engine de navegador integrado para aplicações Java. Baseia-se no Chromium e, portanto, pode renderizar qualquer página exatamente como o Google Chrome faria. Ele também fornece aos desenvolvedores uma API para usar muitas das capacidades do Chromium. Uma delas é converter páginas da web em PDFs.

Com o JxBrowser, a conversão ocorre em duas etapas:

  • Carregar a página.
  • Imprimir a página em PDF.

Vamos ver como isso funciona no código.

Exemplo de código HTML para PDF 

Este exemplo de código demonstra como carregar a página, configurar a impressão e imprimir o HTML para PDF em um único método:

private static void convert(Path htmlFile, Path pdfFile) {
    var whenCompleted = new CompletableFuture<Void>();

    // Criar um browser de navegador.
    try (var engine = Engine.newInstance(HARDWARE_ACCELERATED)) {
        var browser = engine.newBrowser();

        // Dizer ao engine para configurar a impressão pelo código em vez de
        // mostrar a caixa de diálogo de visualização de impressão.
        browser.set(PrintCallback.class, (params, action) -> action.print());

        // Carregar o arquivo no navegador. Isso pode ser qualquer URL.
        browser.navigation().loadUrlAndWait(htmlFile.toString());

        // Assim que a página estiver carregada, imprimir a página da web.
        browser.mainFrame().ifPresent(Frame::print);

        // Configurar a impressão.
        browser.set(PrintHtmlCallback.class, (params, action) -> {
            var printer = params.printers().pdfPrinter();
            var job = printer.printJob();
            job.settings()
               .paperSize(ISO_A4)
               .pageMargins(none()) // Sem espaços vazios nas bordas.
               .pdfFilePath(pdfFile) // Localização do arquivo resultante.
               .disablePrintingHeaderFooter() // Sem informações adicionais que não estavam na página.
        .apply();
            job.on(PrintCompleted.class, event -> whenCompleted.complete(null));
            action.proceed(printer);
        });

        // Aguardar até que o PDF seja criado.
        whenCompleted.join();
    }
}

O método resultante é muito fácil de usar:

convert(Paths.get("/path/to/file.html"), Paths.get("/path/to/file.pdf"));

HTML convertido para PDF com JxBrowser

HTML convertido para PDF com JxBrowser.

Spinner

Enviando…

Desculpe, o envio foi interrompido

Tente novamente. Se o problema persistir, contate-nos através do endereço info@teamdev.com.

Leia e aceite os termos para continuar.

A sua chave de avaliação pessoal de JxBrowser e o guia de início rápido chegarão à sua caixa de entrada de e-mail dentro de alguns minutos.

Conselhos práticos 

O exemplo acima é adequado para aplicações que convertem HTML para PDF ocasionalmente. Para aplicações que convertem HTML para PDF frequentemente e em grande volume, veja as dicas nesta seção.

1. Reutilize a instância do Engine. Criar e fechar o Engine é dispendioso porque inicia e para o processo principal do Chromium. Recomendamos criar o Engine uma vez e reutilizá-lo.

2. Use perfis para alcançar isolamento. Pode ser necessário carregar cada página no navegador livre de cache antigo e dados deixados por páginas carregadas anteriormente. Crie um novo Profile para cada conversão para abrir uma página em um ambiente isolado e limpo.

Aqui está um exemplo:

public final class HtmlToPdf {

    private static Engine engine;

    private static void convert(Path htmlFile, Path pdfFile) {
        ...
        if (engine == null) {
            // Criar um motor de navegador apenas uma vez.
            engine = Engine.newInstance(HARDWARE_ACCELERATED);
        }
        var profile = engine.profiles().newIncognitoProfile("temporary profile name");
        var browser = profile.newBrowser();
        ...
    }
}

3. Leia nosso artigo sobre como implantar o JxBrowser no Docker. Isso pode ser útil ao usar o JxBrowser em ambientes de nuvem.

Conclusão 

Este artigo demonstrou como converter HTML para PDF em Java usando o JxBrowser.

Para essa tarefa, sugerimos usar o JxBrowser porque ele pode renderizar páginas HTML que utilizam as mais recentes tecnologias web e executar JavaScript — uma característica que outras bibliotecas não possuem.

Saiba o que mais você pode fazer com o JxBrowser em a página do produto.