Creacion de un PDF usando la libreria iText

Bueno pues este es un ejemplo muy basico sobre como se puede generar un PDF usando la libreria iText. La libreria iText fue creada para crear archivos PDF usando el lenguaje de programacion Java. Bueno sin mas rodeos, a continuacion muestro el codigo fuente de la clase que genera el PDF:


//		Instituto Tecnologico de Zacatepec
//  	Descripcion:  Programa que genera un archivo PDF con ayuda de la libreria iText
//  	Author: Gonzalo Silverio   gonzasilve@gmail.com
//		Archivo: EjemploPDF.java

import java.awt.Color;
import java.io.FileOutputStream;
import java.util.Date;
import com.lowagie.text.Anchor;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Chapter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.List;
import com.lowagie.text.ListItem;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Section;
import com.lowagie.text.Table;
import com.lowagie.text.Element;

import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPTable;

import com.lowagie.text.Image;

public class EjemploPDF 
{
	private static String strNombreDelPDF = "MiPrimerPDF.pdf";
	private static Font fuenteMagenta36 = new Font(Font.TIMES_ROMAN, 36, Font.BOLD, Color.MAGENTA);
	private static Font fuenteNegra12 = new Font(Font.TIMES_ROMAN, 12, Font.BOLD, Color.BLACK);
	private static Font fuenteVerde12 = new Font(Font.TIMES_ROMAN, 12, Font.NORMAL, Color.GREEN);
	private static Font fuenteAzul25 = new Font(Font.TIMES_ROMAN, 25, Font.BOLD, Color.BLUE);
	private static Font fuenteRoja12 = new Font(Font.TIMES_ROMAN, 12, Font.NORMAL, Color.RED);
	private static Font fuenteAzul16 = new Font(Font.TIMES_ROMAN, 25, Font.BOLD, Color.BLUE);

	public static void main(String[] args) 
	{
		try 
		{
			Document document = new Document();
			PdfWriter writer = PdfWriter.getInstance(
			// that listens to the document
					document,
					// and directs a PDF-stream to a file
					new FileOutputStream(strNombreDelPDF));
			document.open();

			PdfContentByte cb = writer.getDirectContent();

			//Dibujar el cuadro color ROJO
			cb.setColorFill(Color.RED);
			cb.rectangle(100, 500, 150, 150);
			cb.fillStroke();			

			//Dibujar los dos circulos encima del cuadro, uno blanco y otro negro dentro del primero
			cb.setColorFill(Color.WHITE);  cb.setColorStroke(Color.WHITE);
			cb.circle(175, 580,60);
			cb.fillStroke();
			cb.setColorFill(Color.BLACK); cb.setColorStroke(Color.BLACK);
			cb.circle(155, 560,20);
			cb.fillStroke();
			
			//Dibujar una pequenia casa
			cb.setColorStroke(Color.ORANGE); 
			cb.setLineWidth(1);
			cb.moveTo(350,500);
			cb.lineTo(350,600);
			cb.lineTo(400,650);
			cb.lineTo(450,600);
			cb.lineTo(450,500);
			cb.lineTo(420,500);
			cb.lineTo(420,530);
			cb.lineTo(380,530);
			cb.lineTo(380,500);
			cb.lineTo(350,500);			

			cb.moveTo(400,650);
			cb.lineTo(500,700);
			cb.lineTo(550,650);

			cb.moveTo(450,600);
			cb.lineTo(550,650);
			cb.lineTo(550,550);
			cb.lineTo(450,500);			

			cb.stroke();			
			cb.setColorFill(Color.BLACK);

			agregarMetaDatos(document);
			agregarContenido(document);

			document.close();
	
			System.out.println("Se ha generado el PDF: "+ strNombreDelPDF);
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
	}

	private static void agregarMetaDatos(Document document) 
	{
		document.addTitle("Mi primer PDF");
		document.addSubject("Usando iText");
		document.addKeywords("Java, PDF, iText");
		document.addAuthor("Gonzalo Silverio");
		document.addCreator("Gonzalo Silverio");
	}

	private static void agregarContenido(Document document) throws DocumentException
	{
		Paragraph ParrafoHoja = new Paragraph();

		// Agregamos una linea en blanco
		agregarLineasEnBlanco(ParrafoHoja, 1);

		// Colocar un encabezado
		ParrafoHoja.add(new Paragraph("Instituto Tecnologico de Zacatepec", fuenteAzul25) );

		agregarLineasEnBlanco(ParrafoHoja, 1);
		ParrafoHoja.add(new Paragraph("Practica realizada por: Gonzalo Silverio para una demostracion de la libreria iText.", fuenteNegra12));
		agregarLineasEnBlanco(ParrafoHoja, 2);
		ParrafoHoja.add(new Paragraph("A continuacion se muestran algunas figuras que se pueden crear con iText! ", fuenteVerde12));
		agregarLineasEnBlanco(ParrafoHoja, 14);
		ParrafoHoja.add(new Paragraph("EL OJO SAGRADO ", fuenteMagenta36));		
		agregarLineasEnBlanco(ParrafoHoja, 1);

		try
		{
			Image im = Image.getInstance("guerrero.gif");
			im.setAlignment(Image.ALIGN_RIGHT | Image.TEXTWRAP );
	      ParrafoHoja.add(im);
		}
		catch(Exception e)
		{
			System.out.print(e.getMessage());
		}
		agregarLineasEnBlanco(ParrafoHoja, 3);
		ParrafoHoja.add(new Paragraph("La creacion de tablas con iText tambien es posible y de una manera muy facil, a continuacion un ejemplo:",	fuenteRoja12));

 		// Creamos la tabla
		crearTabla(ParrafoHoja);
		document.add(ParrafoHoja);
	}

	private static void crearTabla(Paragraph subCatPart) throws BadElementException 
	{
		PdfPTable tabla = new PdfPTable(2);		//Numero de columnas

		tabla.setWidthPercentage(70); // Porcentaje de la pagina que ocupa
		tabla.setHorizontalAlignment(Element.ALIGN_CENTER);//Alineacion horizontal

		PdfPCell cell = new PdfPCell(new Paragraph("Esta columna esta expandida en 2"));
		cell.setColspan(2);
		cell.setHorizontalAlignment(Element.ALIGN_CENTER);
		tabla.addCell(cell);
		
		tabla.addCell("Nombre");
		tabla.addCell("Calificacion (%)");		

		tabla.addCell("Xavier");
		tabla.addCell("90");
		tabla.addCell("Martita");
		tabla.addCell("60");
		tabla.addCell("Andreita");
		tabla.addCell("90");
		tabla.addCell("Gonzalo Silverio");
		tabla.addCell("100 (wao)");

		subCatPart.add(tabla);
	}

	private static void agregarLineasEnBlanco(Paragraph parrafo, int nLineas) 
	{
		for (int i = 0; i < nLineas; i++) 
			parrafo.add(new Paragraph(" "));
	}
}

como se puede observar para generar el PDF se necesita de una imagen, la cual es esta, ya saben, para guardarla: Click derecho–>Guardar imagen como…


Vista previa del documento PDF

hasta pronto, espero comentarios o dudas.

Acerca de gonzasilve
Freelance Web Developer.

30 Responses to Creacion de un PDF usando la libreria iText

  1. Luis Galviz dice:

    Hola amigo, una consulta…
    Yo genero un pdf por medio de Itext, y le coloco el texto del mismo por medio de una variable que me envian. El caso es que cuando se genera el PDF, si el texto tiene pocas palabras me sobra mucho espacio en blanco, porque la hoja ya tenia un valor definido (Rentangle).
    La pregunta es la siguiente: Tengo alguna forma de definir el alto de forma dinamica, o sea que en la medida que se le coloque mas o menos texto, el se ajuste, y genere el PDF con un tamaño exacto de la pagina.
    Espero me entienda… Muchas gracias y espero sus comentarios…

  2. Germán dice:

    hola amigo,
    Resulta que hice un documento pdf de este tipo, pero ahora que lo tengo terminado, me han pedido que sea editable (que una vez generado el pdf, el texto sea editable desde teclado) , ¿hay alguna propiedad para eso, o itext no me sirve en este caso?

  3. Fernando dice:

    Excelente Ejemplo, tengo 2 preguntas, sabes si una tabla se puede colocar en una posicion tal como lo haces con una imagen? y la segunda pregunta es si se puede poner 2 parrafos en una misma linea del documento, la idea de hacer esto es que tengan su propio font y tamano, gracias…

    • gonzasilve dice:

      Que tal Fer,
      Las respuesta a tus 2 preguntas es SI, sobre la primera pregunta aqui tienes un ejemplo
      http://what-when-how.com/itext-5/adding-a-table-at-an-absolute-position-itext-5/

      y sobre la segunda pregunta aqui:
      http://stackoverflow.com/questions/8486124/merge-two-itext-paragraphs

      realmente no lo e probado, te recomiendo que leas la documentacion oficial de iText ‘iText in Action’ esta buenisimo.

      Saludos cordiales.

  4. Lucy dice:

    No tienes idea cuanto me ayudaste :’) después de casi 3 años, sigues haciendo magia!!
    Gracias!!

    • gonzasilve dice:

      Por nada, y gracias a ti por visitar,

      Saludos.

  5. Johanna dice:

    Buen aporte, sólo una pregunta, se puede imprimir la tabla en la misma alineación donde inician las letras de los párrafos?, ando buscando info sobre eso.

    • gonzasilve dice:

      Claro que si se puede, no tengo un ejemplo a la mano pero se que si, te aconsejo que te descargues este libro ahi seguro vendra algo.

      https://code.google.com/p/agilepractice/downloads/detail?name=iText%20in%20Action.pdf

      Saludos.

  6. Hola amigo necesito tu ayuda, tengo una archivo pdf que se genero desde un xslt dicho xslt tiene definida el tipo de letra calibri y deseo que al pdf de salida salga en calibri tambien ya que me lo arroja en times roman ya que por lo que sè itext no soporta el tipo de letra calibri te dejo un pedazo del codigo a continuacion

    // Arma el nombre de archivo
    SimpleDateFormat sdf = new SimpleDateFormat(“ddMMyyyy_kkmmss”);
    String filename = “export_” + sdf.format(new Date());

    // Escribe el xhtml en file
    File fileXHTML = new File(filename+”.xhtml”);
    FileUtils.writeByteArrayToFile(fileXHTML,html.getBytes());

    // Genera el pdf en base al xhtml
    File filePDF = new File(filename+”.pdf”);
    OutputStream os = new FileOutputStream(filePDF);
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(fileXHTML);
    renderer.layout();
    renderer.createPDF(os);
    os.close();

    • gonzasilve dice:

      Upss no podria ayudarte por falta de tiempo amigo.

      Saludos

    • o lo otro seria setear el pdf generado en respnose la aplicacion esta en jsp y esta en base a java 1.4

  7. martin dice:

    Hola buenos días.
    Me podrías indicar como podría hacer para exportar en un pdf el contenido de un select de una tabla de una base de datos que tengo corriendo sobre sqlserver? Gracias Martin. tubidj@hotmail.com

    • gonzasilve dice:

      …En el metodo crearTabla() podrias hacer la conexion a la BD con JDBC y desde ahi hacer la conculta para rellenar tu PDF.

      Saludos!

  8. Javier Garcia dice:

    hola amigo muy bueno pero tengo un problema y es que necesito que al darle descargar me descargue en el navegador ya que cree un proyecto desde un jsp validando el botón de descarga en un servlet y generando mi pdf en una clase java quisiera saber si hay alguna forma que en ves de descargarlo en una ruta especifica lo abra en el navegador … muchas gracias y estaré atento a tu respuesta …

    • Pues basta con que pongas un link al PDF generado y si el usuario tiene el plugin de Adobe Acrobat Reader o Foxit reader al darle click debe de abrirlo directamente en el navegador. Saludos cordiales

  9. gonzasilve dice:

    enviadooo!!!!!!!

  10. neftali dice:

    muy buen programa oye me podrias mandar el programa para estudiarlo gracias

    • gonzasilve dice:

      ya tiene tiempo que te lo envie pero habia olvidado confirmarte. Saludos

  11. omar dice:

    Muchísimas gracias, buena guía para empezar.

    • gonzasilve dice:

      ..por nada!°

  12. Ronaldo dice:

    jpg perdon

  13. Ronaldo dice:

    Muy bueno el aporte jejeje ahora si yo quiero modificar un archivo pdf que ya tiene un formato sin tocar el mismo como se hace jeje osea tengo un tamplate y solo quiero despues del tiempo q se cambien ciertos datos que serian imagenes jpj a y trate con jpj y no me funciono porq sera jeje

    muchas gracias

    • gonzasilve dice:

      pues con BD vas sustituyendo esos datos.

  14. Hola, muy buen tu codigo, pero tengo una gran duda, y es que como puedo agregar un tabulador? porque ya he probado con “\t” pero no funciona.

    Me ayudarias mucho.
    Gracias

  15. Joivar dice:

    El codigo me ha servido bastante, pero quiero ponerle una contraseña al archivo generado y para ello estoy utilizando las siguientes lines, pero me genera error, me pueden ayudar incicandome que estoy haciendo mal o que puedo utilizar.

    Este codigo va despues del Document.close();

    File pdf = new File(nomArchivo);
    if(pdf.exists()){ //Aunque esta validacion podria sobrar
    try{
    PdfReader reader = new PdfReader(nomArchivo);
    PdfEncryptor.encrypt(reader,new FileOutputStream(path+nomArchivoNuevo),”clave”.getBytes(),””.getBytes(),PdfWriter.AllowPrinting,false);
    }
    catch(Exception e){

    }

    }

  16. Saúl dice:

    Me gustó muucho tu página. De verdad me ayudaste bastante con todo el código que pusiste a disposición de todos. Muchas gracias.

    Aunque tengo duda con las fuentes:
    Cuando pones Font.TIMES_ROMAN me aparecen como error.

    Y lo otro es cuando importas las librerías:
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.List;
    import com.itextpdf.text.ListItem;

    Yo pongo “itextpdf” y tú pones “lowagie”
    ¿Eso, por qué?

    • KradBurg dice:

      depende de la version de la libreria que uses!

  17. Merling Javier dice:

    Gracias man por el aporte ………………….

  18. daniel dice:

    hola un buen aporte solo quiero saber donde se guarda o como cambiar la direccion de donde se guarda graxias

    • gonzasilve dice:

      hola que tal mi amigo daniel, ps mira el PDF se guarda en el mismo lugar donde esta el .class. y para cambiar donde se guarda pues en la linea 32 (en esta private static String strNombreDelPDF = “MiPrimerPDF.pdf”;) indicas la ruta exacta donde quieres que se genere el archivo. por ejemplo si quieres que se genere en c:\docs\pdfs, se haria asi:
      private static String strNombreDelPDF = “c:\docs\pdfs\MiPrimerPDF.pdf”;

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: