Le API di iText da usare per costruire un singolo file pdf sono com

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 ©