Olá Pessoal, tem um conjunto de classes que está me quebrando um galho enorme na geração de documentos em PDF.
As classes são as seguintes:
// GERA O PDF
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.w3c.dom.Document;
import org.w3c.tidy.Tidy;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;
public class Html2Pdf {
private Html2Pdf() {} // NOT INSTANCE
public static void convert(String input, OutputStream out) throws DocumentException{
convert(new ByteArrayInputStream(input.getBytes()), out);
}
public static void convert(InputStream input, OutputStream out) throws DocumentException{
Tidy tidy = new Tidy();
Document doc = tidy.parseDOM(input, null);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
renderer.layout();
renderer.createPDF(out);
}
}
// CONSTRÓI O PDF PARA GERACAO
package br.com.brabus.epico.component;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import br.com.brabus.epico.infra.EUtil;
/**
* IMPRESSÃO EM PDF
* http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html -- API
* http://www.guj.com.br/java/77682-converta-html-para-pdf-com-06-linhas-de-codigo/7 -- COMUNIDADE
* http://itextpdf.com/book/examples.php -- ITEXT EXEMPLOS
*/
public class EPdf {
private OutputStream pdfStream;
private FileReader cssReader;
private String cssConteudo, cabecalho;
private Logger log;
public EPdf() {
this.cabecalho = "";
this.cssConteudo = "";
this.log = LoggerFactory.getLogger(EPdf.class);
}
private boolean setPdfStream(String pdf){
try {
this.pdfStream = new FileOutputStream(pdf);
return true;
} catch (FileNotFoundException e) {
EUtil.exToMsg(e, "Problemas ao criar o arquivo pdf." + pdf + "\n\r" );
e.printStackTrace();
return false;
}
}
private boolean setCssReader(String css){
try {
cssReader = new FileReader( new File(css) );
} catch (FileNotFoundException e) {
EUtil.exToMsg(e, "Problemas ao ler o arquivo css." + css + "\n\r" );
e.printStackTrace();
return false;
}
BufferedReader bufferedReader = new BufferedReader( cssReader );
String linha = "";
try {
while ( ( linha = bufferedReader.readLine() ) != null) {
cssConteudo += linha;
}
} catch (IOException e) {
EUtil.exToMsg(e, "Problemas ao ler o arquivo css."+css+"\n\r" );
e.printStackTrace();
return false;
}
cssConteudo = "<style type=\"text/css\">"+cssConteudo+"</style>";
return true;
}
private boolean criar(String conteudo){
if( cabecalho.equals("") ){
this.log.error("Erro ao criar o PDF. O atributo cabecalho não foi preenchido");
return false;
}else if( pdfStream == null ){
this.log.error("Erro ao criar o PDF. O atributo pdfStream não foi instanciado");
return false;
}else if( conteudo == null ){
this.log.error("Erro ao criar o PDF. O parametro conteudo foi recebido em branco");
return false;
}
try {
log.info( cabecalho );
Html2Pdf.convert( cabecalho + conteudo + "</html>", pdfStream );
pdfStream.close();
return true;
} catch (Exception e) {
EUtil.exToMsg(e, "Problemas ao criar o arquivo pdf "+"\n\r" );
e.printStackTrace();
return false;
}
}
private void setCabecalho(String titulo){
cabecalho = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ // "ISO-8859-1", "UTF-8", "UTF-16", "cp1252"
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd \">"+
"<html xmlns=\"http://www.w3.org/1999/xhtml\">"+
"<head><title>"+titulo+"</title>"+
this.cssConteudo+
"</head>" ;
}
/**
* Com css
* @param pdf
* @param titulo
* @param conteudo
* @param css
* @return
*/
public boolean criar(String pdf, String conteudo, String titulo, String css){
this.setPdfStream(pdf);
this.setCssReader(css);
this.setCabecalho(titulo);
return this.criar(conteudo);
}
/**
* Sem css
* @param pdf
* @param titulo
* @param conteudo
* @return
*/
public boolean criar(String pdf, String conteudo, String titulo){
this.setPdfStream(pdf);
this.setCabecalho(titulo);
return this.criar(conteudo);
}
/**
* Sem css, sem titulo
* @param pdf
* @param titulo
* @param conteudo
* @return
*/
public boolean criar(String pdf, String conteudo){
this.setPdfStream(pdf);
return this.criar(conteudo);
}
}
Nesta ultima deixei comentado alguns encodes usados no cabeçalho do pdf gerado.
cabecalho = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ // "ISO-8859-1", "UTF-8", "UTF-16", "cp1252"
Método que dispara a solicitação de construgeração do pdf
@Public @Post("/analise/candidato/pdf")
public void pdf(){
EPdf ePdf = new EPdf();
String pdf = E.getInstace().getDirApp()+"images"+E.getInstace().getBarra()+E.getInstace().getBarra()+"relatorio-analise-candidato.pdf";
String css = E.getInstace().getDirApp()+"css"+E.getInstace().getBarra()+E.getInstace().getBarra()+"relatorioAnaliseCandidato\\pdf.css";
ePdf.criar(
pdf,
request.getParameter("conteudo_pdf"),
"Análise do candidato",
css
);
result.redirectTo("/images/relatorio-analise-candidato.pdf");
}
Em ambientes windows funciona qualquer encode, uma maravilha, mas em produção :: Linux centos não está funcionando.
Me ajudem por favor!!!
Abçs