iText - Eventos en iText - ¿Como poner un membrete con iText? - ¿Como poner un pie de pagina con iText?

Hace un tiempo que no estamos hablando de iText y ya que hay mucho pero mucho para hablar del mismo vamos a retomar un poco mas esta guía, hoy vamos hablar de los evento en iText


iText - Eventos en iText

Los Eventos en general son acciones que se producen y luego se envía esa información a una clase o al usuario, lo cual después se le da el tratamiento deseado. Un ejemplo claro es cuando estamos escribiendo, nosotros presionamos una tecla y se produce un evento llamado "presión de tecla" luego toma el valor de la tecla y finalmente cuando levantamos el dedo se produce el evento "tecla soltada/liberada".

En iText cuando se agrega una porción de código para un instancia del documento, se traduce en la sintaxis PDF y la misma se escribe en el PDF mediante el objeto PDFWriter. En este proceso hay una clase importante que casi nunca hablamos de ella directamente PdfDocument. esta clase se encara de examinar los objetos de alto nivel. Es una cuerda "invisible" que ata al escritor con el documento. La clase PdfDocument es también la responsable del lanzamiento/manejo de los eventos de una pagina definidos por la interfaz PdfPageEvent, dicha interfaces tiene 11 métodos que se pueden dividir en 2 grupos:


  • Los métodos que implican el manejo del documento y sus paginas, estos son los llamados cuando el documento es abierto o cerrado, o cuando una pagina comienza o finaliza.
  • Los métodos que implican los bloques de construcción básica, ejemplo: Chunk, Chapters, Paragraphs,etc. Estos esta objetos se pueden manipular claramente con el método: onGenericTag();


Los 11 métodos que tiene la interface son:

  • onOpenDocument(PdfWriter, Document): Este método se ejecuta cuando se abre el documento.
  • onCloseDocument(PdfWriter, Document): Este método se ejecuta cuando se cierra el documento.
  • onStartPage(PdfWriter, Document): Este método se ejecuta cuando se inicia una pagina.
  • onEndPage(PdfWriter, Document): Este método se ejecuta cuando finaliza una pagina
  • onParagraph(PdfWriter, Document, float): Este método se ejecuta cuando se inicia un objeto Paragraph.
  • onParagraphEnd(PdfWriter, Document, float): Este método se ejecuta cuando se finaliza un objeto Paragraph.
  • onChapter(PdfWriter, Document, float, Paragraph): Este método se ejecuta cuando se incia un objeto Chapter.
  • onChapterEnd(PdfWriter, Document,float): Este método se ejecuta cuando se finaliza un objeto Chapter.
  • onSection(PdfWriter, Document, float, int , Paragraph ): Este método se ejecuta cuando se inicia un objeto Section
  • onSectionEnd(PdfWriter, Document, float) :  Este método se ejecuta cuando se finaliza un objeto Section
  • onGenericTag(PdfWriter, Document, Rectangle, String ): Llamado cuando un  Chunk con una etiqueta genérica se escribe. 


Siempre tenemos que tener en cuenta que la interface PdfPageEvent tiene las firma de los métodos, es importante mencionar que tenemos que usar la clase PdfPageEventHelper la cual contiene ya los métodos para sobre escribirlos.



iText - ¿Como poner un Header Page con iText? - ¿Como poner un membrete con iText?

Vamos a dar por sabido, ya que todos son lectores habituales de este blog  (???) que previamente han abierto ya el documento y han puesto el path del pdf si no es así pasar por acá.

Bueno comenzando por lo que explicamos mas arriba, para poner un encabezado/membrete al comienzo de cada pagina tenemos que detectar cuando se inicia una pagina para eso entraran en juego los eventos.

Para obtener una clase con los eventos/métodos y así poder manipularla tenemos que extender de la clase PdfPageEventHelper. Para esto hacemos una nueva clase, en nuestro ejemplo la llamaremos MembreteHeaderiText.

public class MembreteHeaderiText extends  PdfPageEventHelper

Dentro de los 11 métodos el que nos interesa en este caso es el onStartPage. Así que lo sobre escribimos:


@Override
public void onStartPage(PdfWriter writer, Document document) {
ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Inicio de Pagina - El lado oscuro de Java"),200,830,0);
}

En este ejemplo lo que podemos nota es que usamos el método estático de la clase ColumnText la cual nos permite poner el texto de manera estática en la posición que deseamos. Obviamente le pasamos los parámetros necesarios, sobre que escritor usaremos, como lo alineamos, el contenido en nuestro caso el Phrase con el texto que queremos, la posición en X e Y, y la rotación. Tener en cuenta que comienzan los valores en la intersección X e Y es decir margen inferior izquierdo es X=0 e Y= 0.

Ahora retornamos a nuestra clase "lanzadora o main" en la cual le aremos una modificaciones mínimas, anteriormente utilizamos el PdfWriter directamente:

PdfWriter.getInstance(documento, new FileOutputStream("EjemploHeader01.pdf"));

En cambio ahora obtendremos una instancia del PdfWriter:

PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("EjemploHeader01.pdf"));

Luego obtendremos una instancia de nuestra clase que maneja los eventos:

MembreteHeaderiText header = new MembreteHeaderiText();

Luego a nuestro PdfWriter le asignamos nuestro eventos personalizados:

writer.setPageEvent(header);

Finalmente abrimos el documentos, insertamos el texto deseado y cerramos el documento.

Resultado:


iText - ¿Como poner un Header Page con iText? - ¿Como poner un membrete con iText?

Código completo:
package com.java.white.box.itext.header;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class MembreteHeaderiText extends PdfPageEventHelper {

@Override
public void onStartPage(PdfWriter writer, Document document) {
ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Inicio de Pagina - El lado oscuro de Java"), 200,830,0);
}
}
package com.java.white.box.itext.header;
import java.io.FileOutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;

/**
* @author usuario
*/
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// Por defecto es A4
Document documento = new Document();
try {
// Obtenemos una instancia de un objeto PDFWriter
PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("EjemploHeader01.pdf"));
// Obtenemos una instancia de nuestro manejador de eventos
MembreteHeaderiText header = new MembreteHeaderiText();
//Asignamos el manejador de eventos al escritor.
writer.setPageEvent(header);
//Abrimos una nueva pagina
documento.open();
//Inserto algo para que el documento no se sea vació
documento.add(new Chunk("El lado oscuro de java"));
//Agregamos una nueva pagina para que se note que se agrega el texto por pagina.
documento.newPage();
//Cerramos el documento
documento.close();
} catch (DocumentException ex) {
// Atrapamos excepciones concernientes al documentoo.
} catch (java.io.IOException ex) {
// Atrapamos excepciones concernientes al I/O.
}
}
}

iText - ¿Como poner un Footer Page con iText? - ¿Como poner un pie de pagina con iText?

Vamos a dar por sabido, ya que todos son lectores habituales de este blog  (???) que previamente han abierto ya el documento y han puesto el path del pdf si no es así pasar por acá.

Bueno comenzando por lo que explicamos mas arriba, para poner un footer/pie de pagina al comienzo de cada pagina tenemos que detectar cuando se inicia una pagina para eso entraran en juego los eventos.

Para obtener una clase con los eventos/métodos y así poder manipularla tenemos que extender de la clase PdfPageEventHelper. Para esto hacemos una nueva clase, en nuestro ejemplo la llamaremos FooterPiePaginaiText.

public class FooterPiePaginaiText extends  PdfPageEventHelper

Dentro de los 11 métodos el que nos interesa en este caso es el onEndPage. Así que lo sobre escribimos:


@Override
public void onEndPage(PdfWriter writer, Document document) {
ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Fin de Pagina - El lado oscuro de Java"),200,20,0);
}

En este ejemplo lo que podemos nota es que usamos el método estático de la clase ColumnText la cual nos permite poner el texto de manera estática en la posición que deseamos. Obviamente le pasamos los parámetros necesarios, sobre que escritor usaremos, como lo alineamos, el contenido en nuestro caso el Phrase con el texto que queremos, la posición en X e Y, y la rotación. Tener en cuenta que comienzan los valores en la intersección X e Y es decir margen inferior izquierdo es X=0 e Y= 0.

Ahora retornamos a nuestra clase "lanzadora o main" en la cual le aremos una modificaciones mínimas, anteriormente utilizamos el PdfWriter directamente:

PdfWriter.getInstance(documento, new FileOutputStream("EjemploHeader01.pdf"));

En cambio ahora obtendremos una instancia del PdfWriter:

PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("EjemploFooter01.pdf"));

Luego obtendremos una instancia de nuestra clase que maneja los eventos:

FooterPiePaginaiText footer= new FooterPiePaginaiText();

Luego a nuestro PdfWriter le asignamos nuestro eventos personalizados:

writer.setPageEvent(footer);

Finalmente abrimos el documentos, insertamos el texto deseado y cerramos el documento.

Resultado:


iText - ¿Como poner un Footer Page con iText? - ¿Como poner un pie de pagina con iText?


Código fuente:


package com.java.white.box.itext.footer;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class FooterPiePaginaiText extends PdfPageEventHelper {

@Override
public void onEndPage(PdfWriter writer, Document document) {
ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Fin de Pagina - El lado oscuro de Java"), 200,20,0);
}
}

package com.java.white.box.itext.footer;

import java.io.FileOutputStream;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;

/**
* @author usuario
*/
public class Main {

/**
* @param args
*/
public static void main(String[] args) {

// Por defecto es A4
Document documento = new Document();

try {
// Obtenemos una instancia de un objeto PDFWriter
PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("EjemploFooter01.pdf"));
// Obtenemos una instancia de nuestro manejador de eventos
FooterPiePaginaiText footer = new FooterPiePaginaiText();
//Asignamos el manejador de eventos al escritor.
writer.setPageEvent(footer);
//Abrimos una nueva pagina
documento.open();
//Inserto algo para que el documento no se sea vacio
documento.add(new Chunk("El lado oscuro de java"));
//Agregamos una nueva pagina para que se note que se agrega el texto por pagina.
documento.newPage();
//Cerramos el documento
documento.close();

} catch (DocumentException ex) {
// Atrapamos excepciones concernientes al documentoo.
} catch (java.io.IOException ex) {
// Atrapamos excepciones concernientes al I/O.
}
}
}


Bueno gente espero que el post allá sido explicativo y útil, espero comentarios! Saludos!

iText - Eventos en iText - ¿Como poner un membrete con iText? - ¿Como poner un pie de pagina con iText? iText - Eventos en iText -  ¿Como poner un membrete con iText? - ¿Como poner un pie de pagina con iText? Reviewed by El lado oscuro de java on julio 10, 2014 Rating: 5

2 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. una consulta como se puede poner en ves de un texto una imagen o un logo ?

    ResponderEliminar

Con la tecnología de Blogger.