Presento adesso un esempio reale dell'utilizzo della libreria IText per la creazione di pettorali per una corsa podistica.
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)
 |
| Immagine di fondo |
 |
| QrCode |
 |
| Il risultato finale |
Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un
precedente post e viene usato un font speciale (CITYB.ttf
)
----------------------------------------------------------------------
package pettorale;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
/**
*
* @author l.innocenti
*/
public class Pettorale {
private static PdfWriter writer;
public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
//String numero = args[0];
String numero = "175";
int inizio = Integer.parseInt(numero);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
//Itext usa una unita' di misura in punti tipografici
//1 cm = 28.35 unita' per cui le dimesioni del foglio sono
//45 cm = 1285 u
//32 cm = 907 u
Rectangle pagina = new Rectangle(1275, 907);
Document doc = new Document (pagina,0,0,0,0);
try
{
writer = PdfWriter.getInstance (doc, out);
doc.open ();
PdfContentByte canvas = writer.getDirectContent();
//inserisce lo sfondo
Image pettorale = Image.getInstance("pettorale/vuoto.png");
pettorale.setAbsolutePosition(0f, 0f);
pettorale.scalePercent(24.5f);
doc.add(pettorale);
//inserisce il QrCode del numero del pettorale
Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
qrcode.setAbsolutePosition(475f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//2° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
qrcode.setAbsolutePosition(1125f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//3° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
qrcode.setAbsolutePosition(475f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//4° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
qrcode.setAbsolutePosition(1125f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//scrive il numero del pettorale alla giusta posizione
//1° numero
if (inizio <10) {
absText(Integer.toString(inizio),270,625);
}
if ((inizio >=10) && (inizio <= 99)) {
absText(Integer.toString(inizio),235,625);
}
if ((inizio >=100) && (inizio <= 999)) {
absText(Integer.toString(inizio),150,625);
}
//2°numero
if (inizio+1 <10) {
absText(Integer.toString(inizio+1),920,625);
}
if ((inizio+1 >=10) && (inizio+1 <= 99)) {
absText(Integer.toString(inizio+1),885,625);
}
if ((inizio+1 >=100) && (inizio+1 <= 999)) {
absText(Integer.toString(inizio+1),790,625);
}
//3°numero
if (inizio+2 <10) {
absText(Integer.toString(inizio+2),270,165);
}
if ((inizio+2 >=10) && (inizio+2 <= 99)) {
absText(Integer.toString(inizio+2),235,165);
}
if ((inizio+2 >=100) && (inizio+2 <= 999)) {
absText(Integer.toString(inizio+2),150,165);
}
//4°numero
if (inizio+3 <10) {
absText(Integer.toString(inizio+3),920,165);
}
if ((inizio+3 >=10) && (inizio+3 <= 99)) {
absText(Integer.toString(inizio+3),885,165);
}
if ((inizio+3 >=100) && (inizio+3 <= 999)) {
absText(Integer.toString(inizio+3),790,165);
}
}
catch (DocumentException e)
{
System.out.println ("Fatal PDF error: " + e);
}
doc.close ();
}
private static void absText(String text, int x, int y) {
try {
PdfContentByte cb = writer.getDirectContent();
BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.saveState();
cb.beginText();
cb.moveText(x, y);
cb.setFontAndSize(slam, 200);
cb.showText(text);
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
}
}
}
----------------------------------------------------------------------