Laboratorio di sistemi Pdf in Java Java [NetBeans] iText è una libreria (ottimizzata per l’uso in java) per generare pdf al volo ideata da Bruno Lowagie e Paolo Soares. Per poter sviluppare un’applicazione con NetBeans, dobbiamo intanto scaricare il file jar itext-1.4.3.jar (versione stabile) dal sito degli sviluppatori (http://www.lowagie.com/iText/download.html) e copiare il file nella cartella lib (subdirectory di WEB-INF). Le API di iText da usare per costruire un singolo file pdf sono com.lowagie.text e com.lowagie.text.pdf. <%@page <%@page <%@page <%@page <%@page contentType="text/html"%> pageEncoding="UTF-8"%> import="com.lowagie.text.*"%> import="com.lowagie.text.pdf.*"%> errorPage="errore.jsp" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>JSP Page</h2> <% Document document = new Document(); //creare un Writer che è in ascolto sul nostro documento e lo scrive su un OutputStream // di nostra scelta PdfWriter.getInstance(document, new FileOutputStream( "test_pdf.pdf") ); // apriamo il documento document.open(); // aggiungiamo un contenuto document.add(new Paragraph("Hello World")); // chiusura del documento document.close(); out.println("Il file test_pdf.pdf è stato generato"); %> </body> </html> Questo approccio tuttavia è sconsigliato in quanto non sappiamo dove il Servlet Container inserirà il file. pdf_in_java.pdf Pag. 1/6 Cozzetto © Laboratorio di sistemi Pdf in Java Java [NetBeans] Figura 1 - Il file test.pdf è stato generato in C:\Programmi\netbeans-5.0\enterprise2\jakarta-tomcat5.5.9\bin Conviene mandare il file generato all’interno del browser. Per complicare leggermente le cose scegliamo di creare un pdf contenente del testo, un’immagine e una tabella. Ecco l’output del programma: Figura 2 - Il pdf è generato da una servlet e inviato al browser Segue codice: pdf_in_java.pdf Pag. 2/6 Cozzetto © Laboratorio di sistemi <%@page <%@page <%@page <%@page <%@page <%@page <%@page Pdf in Java Java [NetBeans] contentType="text/html"%> pageEncoding="UTF-8"%> import="com.lowagie.text.*"%> import="com.lowagie.text.pdf.*"%> import="com.lowagie.text.Image.*"%> import="java.io.*"%> errorPage="errore.jsp" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>JSP Page</h2> <% Document doc = new Document(); // L'oggetto baosPDF conterrà i caratteri che costituiscono il file PDF ByteArrayOutputStream baosPDF = new ByteArrayOutputStream(); PdfWriter docWriter = null; // Crea l'associazione tra l'oggetto di tipo ByteArrayOutputStream che rappresenta il PDF e il documento // Ritorna un oggetto di tipo PdfWriter docWriter = PdfWriter.getInstance(doc, baosPDF); // Apro il documento doc.open(); // Aggiungo due paragrafi e una riga vuota doc.add(new Paragraph("Questo documento è stato creato da una classe chiamata: " + this.getClass().getName())); doc.add(new Paragraph("Questo documento è stato creato il " + new java.util.Date())); doc.add(new Paragraph("\n")); // Aggiungo un'immagine Image jpg = Image.getInstance( application.getRealPath("/") + "\\img\\nikki_1.jpg" ); doc.add(jpg); // Riga vuota doc.add(new Paragraph("\n")); // Genero una tabella PdfPTable table = new PdfPTable(3); PdfPCell cell = new PdfPCell(new Paragraph("header with colspan 3")); cell.setColspan(3); table.addCell(cell); table.addCell("1.1"); table.addCell("2.1"); table.addCell("3.1"); pdf_in_java.pdf Pag. 3/6 Cozzetto © Laboratorio di sistemi Pdf in Java Java [NetBeans] table.addCell("1.2"); table.addCell("2.2"); table.addCell("3.2"); cell = new PdfPCell(new Paragraph("cell test1")); table.addCell(cell); cell = new PdfPCell(new Paragraph("cell test2")); cell.setColspan(2); table.addCell(cell); doc.add(table); // Chiudo il documento e l'oggetto docWriter doc.close(); docWriter.close(); // Mando nel browser l'output rappresentato dal flusso baosPDF response.setContentType("application/pdf"); response.setHeader("Content-disposition", "inline; filename=foobar.pdf") ; response.setContentLength(baosPDF.size()); ServletOutputStream sos; sos = response.getOutputStream(); baosPDF.writeTo(sos); sos.flush(); %> </body> </html> Esistono tantissimi altri metodi per intervenire su certi aspetti quali le dimensioni della pagina, i margini, i colori del testo, per inserire della grafica ecc ecc oltre che metodi per modificare pdf già esistenti. iText è una libreria con doppia licenza MPL e LGPL (per maggiori informazioni consultare il sito web degli sviluppatori http://www.lowagie.com/iText/). Esistono inoltre tante altre librerie per creare pdf, alcune gratuite altre di tipo commerciale. Tra le versioni gratuite, segnaliamo DynamicPDF™ Generator for Java Community Edition di ceTesoftware (http://www.dynamicpdf.com/). pdf_in_java.pdf Pag. 4/6 Cozzetto © Laboratorio di sistemi Pdf in Java Java [NetBeans] Figura 3 - L'output generato dalle librerie DynamicPdf Una volta scaricato dal sito http://www.cete.com/Products/GeneratorForJava/DownloadWinPackage.csp il file jar DPDFGen.jar e copiato nella solita cartella lib, scriviamo ed eseguiamo il seguente codice. <%@ page language="java" import="com.cete.dynamicpdf.*, com.cete.dynamicpdf.pageelements.Label" contentType="application/pdf" session="false" %> <%@ page pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>JSP Page</h2> <% Document objDocument = new Document(); objDocument.setCreator("HelloWorldJSP.jsp"); objDocument.setAuthor("Your Name"); objDocument.setTitle("Hello World"); Page objPage = new Page(PageSize.LETTER, PageOrientation.PORTRAIT, 54.0f); String strText = "Hello World...\nFrom DynamicPDF Generator for Java\nDynamicPDF.com"; pdf_in_java.pdf Pag. 5/6 Cozzetto © Laboratorio di sistemi Pdf in Java Java [NetBeans] Label objLabel = new Label(strText, 0, 0, 504, 100, Font.getHelvetica(), 18, TextAlign.CENTER); objPage.getElements().add(objLabel); objDocument.getPages().add(objPage); ServletOutputStream sOut = response.getOutputStream(); objDocument.drawToWeb(request, response, sOut, "HelloWorldJSP.pdf"); sOut.flush(); %> </body> </html> Una cosa interessante di questa libreria è che per mandare in output il pdf all’interno del browser è sufficiente scrivere objDocument.drawToWeb(request, response, sOut, "HelloWorldJSP.pdf"); sollevando il programmatore dal costruire flussi o oggetti di vario tipo. Si possono realizzare report abbastanza sofisticati come nella figura che segue. Figura 4 – La lista dei contatti del database NorthWind Per esaminare il codice si veda il link http://java.cete.com/DynamicPDFv40/SourceView?class=ContactList pdf_in_java.pdf Pag. 6/6 Cozzetto ©