Programación en Java/Apéndices/Crear un PDF en Java
Cómo crear un PDF en Java
[editar]Crear un PDF en Java utilizando la librería itext.jar, es gratis y se puede descargar en Itexdocs, cuyo manual está en Tutorial Itexdocs, puede ser muy útil cuando se requiere que en una aplicación web, el cliente reciba la respuesta en formato PDF al vuelo o en archivo, y escrupulosamente paginado del tipo página x de y, esto se logra programando metodos del tipo evento, por ejemplo cuando un documento es abierto (onOpenDocument), una página empieza (onStartPage), cuando una pagina termina (onEndPage), cuando se cierra el documento (onCloseDocument), Etc., estos métodos se programan y se ejecutan automáticamente siempre y cuando se extienda la clase en la que se encuentran a PdfPageEventHelper, de esta manera cuando ocurra un evento sucedera lo que se le programe a ese evento, pero para poner la paginación x de y, el valor de y lo sabremos al final cuando ya se va a cerrar el documento ó por programación se sabe, pero para poner en todas las páginas del documento el valor de y es una forma poner un lienzo (tipo Template) ese lienzo estará en blanco en el lugar de y, es como una variable que al final recibirá un valor y se pintará en todos lados del PDF donde lo pongamos, de esta manera ya cuando se sepa el valor de y se le asigna, este aparece pintado en el lienzo, ejemplo básico es el siguiente:
/* * $Id: PageNumbersWatermark.java,v 1.3 2005/05/09 11:52:50 blowagie Exp $ * $Name: $ * * This code is part of the 'iText Tutorial'. * You can find the complete tutorial at the following address: * http://itextdocs.lowagie.com/tutorial/ * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * itext-questions@lists.sourceforge.net */ package com.lowagie.examples.directcontent.pageevents; import java.awt.Color; import java.io.FileOutputStream; import com.lowagie.text.Chunk; import com.lowagie.text.Document; import com.lowagie.text.Element; import com.lowagie.text.ExceptionConverter; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfGState; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfPageEventHelper; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; /** * Demonstrates the use of templates to add Watermarks and Pagenumbers. */ public class PageNumbersWatermark extends PdfPageEventHelper { /** An Image that goes in the header. */ public Image headerImage; /** The headertable. */ public PdfPTable table; /** The Graphic state */ public PdfGState gstate; /** A template that will hold the total number of pages. */ public PdfTemplate tpl; /** The font that will be used. */ public BaseFont helv; /** * Generates a document with a header containing Page x of y and with a Watermark on every page. * @param args no arguments needed */ public static void main(String args[]) { try { // step 1: creating the document Document doc = new Document(PageSize.A4, 50, 50, 100, 72); // step 2: creating the writer PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("pageNumbersWatermark.pdf")); // si deseas que respusta sea al vuelo y no en archivo //esta clase debe importar -- import javax.servlet.http.*; //y recibir como parametro el objeto response //así el clien te recibira la respuesta en su navegador en pdf ejemplo: ///PdfWriter writer = PdfWriter.getInstance(doc, response.getOutputStream()); // step 3: initialisations + opening the document writer.setPageEvent(new PageNumbersWatermark()); doc.open(); // step 4: adding content String text = "some padding text "; for (int k = 0; k < 10; ++k) text += text; Paragraph p = new Paragraph(text); p.setAlignment(Element.ALIGN_JUSTIFIED); doc.add(p); // step 5: closing the document doc.close(); } catch ( Exception e ) { e.printStackTrace(); } } /** * @see com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onOpenDocument(PdfWriter writer, Document document) { try { // initialization of the header table headerImage = Image.getInstance("logo.gif"); table = new PdfPTable(2); Phrase p = new Phrase(); Chunk ck = new Chunk("lowagie.com\n", new Font(Font.TIMES_ROMAN, 16, Font.BOLDITALIC, Color.blue)); p.add(ck); ck = new Chunk("Ghent\nBelgium", new Font(Font.HELVETICA, 12, Font.NORMAL, Color.darkGray)); p.add(ck); table.getDefaultCell().setBackgroundColor(Color.yellow); table.getDefaultCell().setBorderWidth(0); table.addCell(p); table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); table.addCell(new Phrase(new Chunk(headerImage, 0, 0))); // initialization of the Graphic State gstate = new PdfGState(); gstate.setFillOpacity(0.3f); gstate.setStrokeOpacity(0.3f); // initialization of the template tpl = writer.getDirectContent().createTemplate(100, 100); tpl.setBoundingBox(new Rectangle(-20, -20, 100, 100)); // initialization of the font helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false); } catch(Exception e) { throw new ExceptionConverter(e); } } /** * @see com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.getDirectContent(); cb.saveState(); // write the headertable table.setTotalWidth(document.right() - document.left()); table.writeSelectedRows(0, -1, document.left(), document.getPageSize().height() - 50, cb); // compose the footer String text = "Page " + writer.getPageNumber() + " of "; float textSize = helv.getWidthPoint(text, 12); float textBase = document.bottom() - 20; cb.beginText(); cb.setFontAndSize(helv, 12); // for odd pagenumbers, show the footer at the left if ((writer.getPageNumber() & 1) == 1) { cb.setTextMatrix(document.left(), textBase); cb.showText(text); cb.endText(); cb.addTemplate(tpl, document.left() + textSize, textBase); } // for even numbers, show the footer at the right else { float adjust = helv.getWidthPoint("0", 12); cb.setTextMatrix(document.right() - textSize - adjust, textBase); cb.showText(text); cb.endText(); cb.addTemplate(tpl, document.right() - adjust, textBase); } cb.saveState(); // draw a Rectangle around the page cb.setColorStroke(Color.orange); cb.setLineWidth(2); cb.rectangle(20, 20, document.getPageSize().width() - 40, document.getPageSize().height() - 40); cb.stroke(); cb.restoreState(); // starting on page 3, a watermark with an Image that is made transparent if (writer.getPageNumber() >= 3) { cb.setGState(gstate); cb.setColorFill(Color.red); cb.beginText(); cb.setFontAndSize(helv, 48); cb.showTextAligned(Element.ALIGN_CENTER, "Watermark Opacity " + writer.getPageNumber(), document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45); cb.endText(); try { cb.addImage(headerImage, headerImage.width(), 0, 0, headerImage.height(), 440, 80); } catch(Exception e) { throw new ExceptionConverter(e); } cb.restoreState(); } } /** * @see com.lowagie.text.pdf.PdfPageEventHelper#onStartPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onStartPage(PdfWriter writer, Document document) { if (writer.getPageNumber() < 3) { PdfContentByte cb = writer.getDirectContentUnder(); cb.saveState(); cb.setColorFill(Color.pink); cb.beginText(); cb.setFontAndSize(helv, 48); cb.showTextAligned(Element.ALIGN_CENTER, "My Watermark Under " + writer.getPageNumber(), document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45); cb.endText(); cb.restoreState(); } } /** * @see com.lowagie.text.pdf.PdfPageEventHelper#onCloseDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onCloseDocument(PdfWriter writer, Document document) { tpl.beginText(); tpl.setFontAndSize(helv, 12); tpl.setTextMatrix(0, 0); tpl.showText("" + (writer.getPageNumber() - 1)); tpl.endText(); } }
Dudas escribir a ange_leos@yahoo.es 19:47 21 oct, 2005 (UTC) Angelica L.