viernes, marzo 13, 2009

PDFs con Java

Advertencia: Artículo técnico, aburrido y poco relevante para el lector casual. Acepto, a modo de compensación, saludos, abrazos e invitaciones a tomar cervezas.

El problema de armar un PDF con Java en realidad está resuelto hace bastante tiempo. Las opciones son medianamente claras, Apache FOP, iText, y otro par que se me escapa.

Personalmente siento que iText, a pesar de ser una herramienta muy poderosa, no es la mejor de las soluciones pués en realidad dibujas el PDF (como un dibujo), más que armarlo como un archivo de contenidos (texto e imágenes).
En ese sentido FOP me resulta mucho más natural, por cierto ayuda bastante tener conocimiento y entendimiento de HTML, pero también es cosa de preferencias y del contexto que abordemos.

JavaWorld ha publicado un artículo que habla de como hacer una aplicación para Twitter (plataforma que estoy evitando a toda costa). De este artículo rescato el siguiente segmento de código:
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setContentLength(pdf.size());
ServletOutputStream out = response.getOutputStream();
pdf.writeTo(out);
out.flush();


Esto corresponde a los headers para realizar una descarga de un PDF desde un servlet o un JSP.

Donde:

public void writeTo(OutputStream os) throws IOException {
if (document.isOpen()) return;
baos.writeTo(os);
os.close();
}

Lo ideal en este contexto hubiera sido:

PdfWriter.getInstance(document, response.getOutputStream());

(el PdfWriter es del iText...) pero muchos navegadores no soportan descargas donde se le entrega el arreglo de bytes de manera dinámica, ie es como si necesitaran a priori saber cuanto pesa el archivo.


No hay comentarios.: