«

»

Html to PDF con Java

¿Cómo convertir html a pdf con Java? Para convertir html a pdf con Java necesitas primero que el html sea un html válido del tipo XHTML
Si tienes tu xhtml listo, entonces podrás usar esta librería Flying Saucer que proporciona una manera simple para la transformación.
Si no tienes un html que sea válido, tendrás que usar alguna herramienta como Tidy para convertir tu html en un xhtml (al final te dejo un ejemplo).

Necesitas en tu proyecto estas librerías:

Este es un ejemplo sencillo que transforma código html en pdf.

//--
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
 
import org.xhtmlrenderer.pdf.ITextRenderer;
 
public class HtmlToPdf {
 
	public static void main(String[] args) throws Exception {
 
		File inputFile = new File("holaMundo.xhtml");
		OutputStream os = new FileOutputStream(new File(
				"xhtmlToPdf_holaMundo.pdf"));
 
		ITextRenderer renderer = new ITextRenderer();
		renderer.setDocument(inputFile);
		renderer.layout();
		renderer.createPDF(os);
 
		os.close();
	}
 
}
 
//--


Este es nuestro xhtml de entrada “holaMundo.xhtml”

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>HOLA MUNDO</title>
        <style type="text/css"> b { color: blue;} p { font-size: 18px; } </style>
    </head>
    <body>
        <p>
            <b>HOLA MUNDO... !</b>
        </p>
        <p>
            ...Un sutil pensamiento erroneo puede dar lugar a una indagacion fructifera que revela
            verdades de gran valor......
        </p>
    </body>
</html>


Este será nuestro resultado:

xhtmlToPdf_holaMundo
Si bajas el source encontraras buena documentación y ejemplos.

Una observación:
Si tu xhtml tiene hojas de estilo (CSS), deberás indicarlas con su URL absoluto para que puedan ser procesadas por la librería.

<link rel="stylesheet" type="text/css" href="http://tusitio.com/css/style.css" />

Te dejo este ejemplo sobre cómo pasar tu html a un xhtml utilizando la libreria Tidy:

//--
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
 
import org.w3c.tidy.Tidy;
 
public class HtmlToXhtml {
 
    public static void main(String[] args) {
 
        // codigo valido para html pero invalido para XHTML
    	// no esta cerrando el tag img
        String html = new String("<img scr='img.gif'>");
        //--
        ByteArrayInputStream b = new ByteArrayInputStream(html.getBytes());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
 
        Tidy tidy = new Tidy();
        tidy.setXHTML(true); // queremos que la salida sea xhtml
        tidy.parse(b, out);
        System.out.println(out.toString());
 
}
}
//--

La salida de Tidy para este ejemplo es la siguiente.
Vemos que Tidy le ha agregado cabeceras, y otros tag; además de cerrar correctamente el tag ‘img’.

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="HTML Tidy, see www.w3.org" />
<title></title>
</head>
<body>
<img scr='img.gif' />
</body>
</html>

Espero te sea de utilidad.

..

7 comentarios

  1. Eli escribió:

    Muy bien el ejemplo, quiero hacer algo así, convertir html a pdf, pero resulta que hay paginas html que tiene ya sea css o javascript para darle una funcionalidad a la pagina, como son mostrar información y el resultado de ese javascript no lo convierte a pdf.

    Quisiera saber de que forma puedo lograr que cualquier html que tenga javascript lo convierta a pdf.

    Espero que alguien pueda ayudarme, gracias.

  2. Fabiola escribió:

    Hola… estoy trabajando con estas librerias… pero mi problema es que tendre varios html… los cuales debo poner en paginas distintas… ¿como puedo indicar que salte a la proxima pagina?… si me pudieses ayudar te lo agradeceria muchísimo…

    GRACIAS!!

  3. Gustavo Peiretti escribió:

    Quizas puedas generar cada pdf por separado y luego concatenar los pdf. La libreria iText (mencionada en el post) provee esta utilidad:
    PdfReader r1 = new PdfReader(“primero.pdf”);
    PdfReader r2 = new PdfReader(“segundo.pdf”);
    PdfCopyFields pdfCopy = new PdfCopyFields(new FileOutputStream(“primeroMasSegundo.pdf”));
    pdfCopy.addDocument(r1);
    pdfCopy.addDocument(r2);
    pdfCopy.close();

    Espero te sea útil…!

  4. Fabiola escribió:

    Gracias por responder!!!!! probare esta solución y te cuento como me va.

    :) gracias…

  5. El sabiendo escribió:

    Tengo el mismo problema que Eli, yo utilizo más funcionalidades en la pagina, ya que la tengo hecha con jsp utilizo taglib y ese código no es procesado si lo haces por éste método.

  6. crispi escribió:

    tengo una duda en el ejemplo de tidy colocas es una linea de estring, para el caso de tener un archivo, debe traducir linea por linea del archivo, para pasarlo al xhtml?

    me podrias indicar como hacerlo

    gracias

  7. Christian escribió:

    Hola:

    Sabes si hay una forma de seter que la salida salga en A3?

    Gracias!

Deja un comentario

Tu email nunca se publicará.

Puedes utilizar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">