lunes, 23 de agosto de 2010

iText - parte 1

¿Que es iText?
    iText es una librería para java (aunque está disponible también para el lenguaje C#), que permite generar archivos PDF de una forma muy sencilla. Dicha librería, la podemos descargar de forma gratuita desde el siguiente enlace: download.


    A continuación, mostrare el código del ejemplo y posteriormente explicare de forma breve las partes claves del mismo.
import java.io.FileOutputStream;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * @author Walter Herrera.
 * 
 * Código de ejemplo, que muestra como crear un archivo PDF simple.
 */
public class Ejemplo1 {

 /**
  * Raíz.
  */
 public static void main(String[] args) {
  //Creamos la representación de una página, con un tamaño
  //por defecto.
  Rectangle pagina = new Rectangle(PageSize.LETTER);  
  
  //Establecemos el color de la página y reescribimos la función
  //toString de la clase BaseColor para obtener el nombre del color.
  pagina.setBackgroundColor(new BaseColor(java.awt.Color.LIGHT_GRAY) {
   public String toString() {
    return "Light Gray";
   }
  });
  
   // Creamos un documento y le pasamos como parametro un objeto de
   // tipo Rectangle, dicho objeto contiene las especificaciones
   // de como se vera nuestra página.
  Document documento = new Document(pagina);

  try {
   
   // Obtenemos una instancia de un objeto PDFWriter
   PdfWriter.getInstance(documento, new FileOutputStream(
     "Ejemplo1.pdf"));
   documento.open();
   
   // Generamos nuestro contenido.
   String contenido = "Generación de un PDF simple:\n "
     + "\t\tAncho de página: "
     + documento.getPageSize().getWidth()
     + "\n\t\tAlto de página: "
     + documento.getPageSize().getHeight()
     + "\n\t\tColor de página: "
     + documento.getPageSize().getBackgroundColor().toString();

   // Lo agregamos al documento por medio de una instancia
   // de un obtjeto Paragraph.
   //
   documento.add(new Paragraph(contenido));
   
   // Cerramos el documento para hacer persistente el contenido.
   documento.close();
   
  } catch (DocumentException ex) {
   // Atrapamos excepciones concernientes al documento.
  } catch (java.io.IOException ex) {
   // Atrapamos excepciones concernientes al I/O.
  }
 }
}
    Como primer punto, debemos de importar la libreria iText-5.0.4.jar (Es la versión más reciente) al classpath de nuestro proyecto; ya realizado lo anterior podremos hacer uso de las clases, interfaces, etc. que nos ofrece iText.
    De la línea 3 a la 9, del código de ejemplo, son las importaciones básicas de las clases necesarias para la creación de nuestro archivo PDF (no mencione la línea 1 ya que es una clase bastante conicida :P), a continuación doy una breve explicación de cada una de ellas:
  • BaseColor: Nos permite crear un color ya se para la página o la fuente del documento.
  • Document: Está, se podría decir que es el modelo (en base al MVC); en ellá se almacenara tanto el contenido del documento, como su meta-información. iText nos ofrece 3 constructores para inicializar un Document:

    1. Document(): Un documento con sus parametros por default.
    2. Document(Rectangle pageSize): Crea un documento, cuyo parametro establece el tamaño de la página.
    3. Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom): Crea un documento, cuyos parametros son el tamaño de la página y los márgenes izquierdo, derecho, superior e inferior.
  • PageSize: Está clase, nos ofrece una basta colección de representaciones de objetos de tipo Rectangle (Es decir, los tamaños de tipos de hojas más comunes A3, A4, Letter, Legal, etc.)
  • Paragraph: Está clase, representa trozos de frases, dentro de un Document. Observando la documentación nos percatamos que nos ofrece una variedad de contructores para inicializar la misma.
  • Rectangle: Está clase, es la representación geométrica y física de nuestra página; a la misma se le pueden establecer varios atributos como: el color, los bordes, etc.
  • PdfWriter: Está clase, es la encargada de representar todos los elementos anexados de nuestro Document al OuputStream. Para asociar un Document y un OutputStream a un PdfWriter, disponemos del método getInstance(Document doc, OutputStream os), o bien, haciendo uso del constructor PdfWriter(Document doc, OutputStream os).
    NOTA 1: El tipo de medida que usa iText para definir ya sea el tamaño de la hoja, marjenes, etc. es el punto.
1 pulgada (inch) = 72 puntos


    NOTA 2: Toda la meta-información que le agreguemos al Document debe de realizarse antes de que habramos el docuemnto (antes de la línea 44 del código de ejemplo); en caso de que se la agreguemos despues obtendremos una excepción.

    NOTA 3: Después de habierto el documento podremos agregar todo el contenido que deseemos (línea 58).

    NOTA 4: Una vez finalizado el ingreso del contendio tendremos que cerrar el documento para hacer persistente nuestro archivo pdf (línea 61)


    Bueno espero que está breve introducción a iText les pueda servir de ayuda. Cualquier duda, comentario o corrección, pueden hacerla sin compromiso; la idea de estás futúras guias es brindarles un material de apoyo de calidad.
Exitos :D !!!!

3 comentarios:

  1. Amigo le agradecería un pequeño ejemplo como el anterior pero pasándole como parámetros contenidos de JLabel y JTextfield, de manera que cuando se presione por ejemplo un boton que diga Crear PDF, se cree con la información contenida en los JLabel y JTextfield. Java(Eclipse)y gracias de antemano

    ResponderEliminar
  2. me encataria saber como hago para q los margenes del pdf sean menores, es decir, colocar yo los margenes de la hoja

    ResponderEliminar
  3. Muy buen aporte Walter.

    Te dejo un link a mi blog en el cual explica esto un poco mas.
    http://java-white-box.blogspot.com.ar/2013/11/itext-clases-fundamentales-en-itext.html

    Saludos

    ResponderEliminar

Si lo deseas pudes dejar un comentario o sugerencia :).