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) {
}
}
}
----------------------------------------------------------------------