Duas opções para trabalhar com documentos em sua aplicação Java
- Eduardo Nepomuceno da Rocha
- 20 de fev. de 2024
- 4 min de leitura
Atualizado: 13 de mai.
Automatizar a criação de documentos sob determinado padrão não é uma tarefa simples. Na verdade, criar um documento realmente bonito e elegante, fora do ambiente padrão Windows é uma tarefa complicada. No entanto, existem linguagens e ferramentas simples, voltadas para texto, e muito poderosas e eficazes no que diz respeito à concepção de um documento: Latex e HTML. Enquanto o primeiro é o preferido da comunidade acadêmica, sendo fácil encontrar diversos templates na Internet, modelos prontos nos quais apenas o usuário precisa editar para utilizar, o HTML é a linguagem preferida para criação de telas, sites, e outros (com auxílios de bibliotecas e frameworks poderosos atualmente). Entretanto, o HTML pode ser utilizado tal como o Latex. É possível utilizar um CSS para padronizar um relatório tranquilamente, automatizá-lo via Spring Batch conforme o último artigo desse blog. Abordaremos como converter HTML para PDF nesse artigo e abordar a integração do Latex com Java, falando a respeito da biblioteca que permite integrar essas tecnologias.
HTML para PDF
Para entender como procedi, acho importante mostrar em imagem a organização interna do meu projeto:

O código apresentado é muito parecido com o recomendado pela documentação. Apenas adaptei a minhas exigências.
Primeiramente adicionei as seguintes configurações às dependêcias do pom do Maven:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.2</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-openpdf</artifactId>
<version>9.3.1</version>
</dependency>
package com.eduardondarocha.mindsimapp.pdfutils;
import org.jsoup.Jsoup;import org.jsoup.nodes.Document;
import org.xhtmlrenderer.layout.SharedContext;
import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class PdfHtmlConverter {
private static Document criarDocumentoAPartirDeHTML(String nomeArquivo){
try {
String pathname = "D:/Codigos_VSCODE/Programas_didaticos_Java/Projetos_Batch/mindsimapp/src/main/java/com/eduardondarocha/mindsimapp/files/" + nomeArquivo + ".html";
File inputHTML = new File(pathname);
Document document = Jsoup.parse(inputHTML, "UTF-8");
document.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
return document;
}catch (IOException e) {
System.out.println(e);
return null;
}
}
public static String converterHTMLparaPDF(String nomeArquivo){
Document xhtml = criarDocumentoAPartirDeHTML(nomeArquivo);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String outputpdf = "D:/Codigos_VSCODE/Programas_didaticos_Java/Projetos_Batch/mindsimapp/src/main/java/com/eduardondarocha/mindsimapp/pdfs/" + nomeArquivo + dateTimeFormatter.format(LocalDateTime.now()).substring(0,11) + ".pdf";
try (OutputStream outputStream = new FileOutputStream(outputpdf)) {
ITextRenderer renderer = new ITextRenderer();
SharedContext sharedContext = renderer.getSharedContext();
sharedContext.setPrint(true);
sharedContext.setInteractive(false);
renderer.setDocumentFromString(xhtml.html());
renderer.layout();
renderer.createPDF(outputStream);
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
return null;
} catch (IOException e) {
System.out.println(e.getMessage());
return null;
}
return outputpdf;
}
}
O primeiro método é privado e retorna uma classe documento. Ela é usada pra gerar o PDF, junto à classe OutputStream, que aponta para onde será gerado o arquivo. No meu projeto Spring Batch em construção, apresentado no texto anterior, assim ficou o disparo de e-mail:
@EnableBatchProcessing
@Configuration
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private EmailService emailService;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean public Job imprimeOlaJob(){
return jobBuilderFactory
.get("imprimeOlaOjb")
.start(enviaEmailStep())
.build();
}
public Step enviaEmailStep(){
return stepBuilderFactory
.get("enviaEmailStep").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
String anexo = PdfHtmlConverter.converterHTMLparaPDF("arquivoteste");
System.out.println("Enviando e-mail");
MensagemEmail mensagemEmail = MensagemEmail.builder()
.texto("Esse e-mail foi enviado após converter um HTML para PDF")
.destinatarios(Stream.of("fmurad@mindsim.com.br", "enrocha0312@gmail.com").collect(Collectors.toList()))
.assunto("Teste Spring Batch de envio de arquivo")
.remetente("enrtecnologiaeconhecimento@gmail.com")
.anexo(anexo) .build();
try {
emailService.sendEmailWithFile(mensagemEmail); }catch (Exception e){
System.out.println(e.getMessage());
}
return RepeatStatus.FINISHED;
}
}
).build();
}
}
Opção simples e poderosa para utilizar o melhor do HTML para fazer documentações.
Latex e Java
É possível criar uma classe própria de compilação de comandos Latex em Java e compilar o documento Latex após integrá-lo com o Java. É um caminho complexo que será abordado posteriormente. No entanto, já existem APIs que funcionam como dependências, possuindo algumas funcionalidades interessantes principalmente com relação ao ambiente matemático. Abordarei com mais detalhes em futuro texto. Abaixo segue um link para uma API:
Qual a melhor opção?
Particularmente acho o Latex superior ao HTML para documentos. É mais prático e faz documentos mais elegantes, além de uma maior disponibilidade de templates. No entanto, pensando em automação por exemplo, o HTML leva vantagem, pois compilar o HTML é um processo mais rápido do que o Latex. Além disso, a documentação do Html é muito mais robusta devido ao front-end de qualquer aplicação WEB hoje utilizá-lo. Dependerá muito do uso. Acho mais prático escrever um documento elegante em Latex do que em HTML, mas o processo para Latex é mais demorado. Atualmente trabalho com automação de disparo de relatórios mensais e utilizo o HTML para escrever os relatórios. A customização é um pouco mais verbosa, no entanto encontrei facilmente as tags das quais precisavas em tutoriais na internet. O Latex em compensação leva vantagem se, além de não ter uma automação ou algo similar envolvido, tiver por exemplo ambientes matemáticos, especifidades que um pacote Latex tem para textos. Uma escolha dependerá do escopo da aplicação, mas é provável que o leitor encontre mais aplicações com renderização via HTML por aí. A intenção do texto é apresentar as possibilidades.
Comments