View Javadoc

1   /**
2    * 
3    */
4   package de.tivsource.page.helper.pdf;
5   
6   import java.awt.Color;
7   import java.awt.image.BufferedImage;
8   import java.io.File;
9   import java.io.IOException;
10  import java.text.SimpleDateFormat;
11  
12  import javax.imageio.ImageIO;
13  
14  import org.apache.pdfbox.exceptions.COSVisitorException;
15  import org.apache.pdfbox.pdmodel.PDDocument;
16  import org.apache.pdfbox.pdmodel.PDPage;
17  import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
18  import org.apache.pdfbox.pdmodel.font.PDFont;
19  import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
20  import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap;
21  import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
22  
23  import de.tivsource.page.entity.reservation.Reservation;
24  import de.tivsource.page.helper.barcode.CreateBarcode;
25  
26  /**
27   * @author Marc Michele
28   *
29   */
30  public class CreateReservationPDF {
31  
32  	private static final String HTDOCS = "/var/www/html";
33  
34  	private File file;
35  	
36      /**
37       * PDF Dokument
38       */
39      private PDDocument pdDocument;
40  
41      /**
42       * Einzige Seite des Dokumentes
43       */
44      private PDPage pdPage;
45  
46      /**
47       * Standard Font des Dokumentes
48       */
49      private PDFont pdFont;
50  
51      /**
52       * ContentStream der den Gesamten Inhalt des Dokumentes enthält
53       */
54      private PDPageContentStream pdPageContentStream;
55  
56      /**
57       *  Reservierung 
58       */
59      private Reservation reservation;
60  
61      /**
62       * Variablen für den PDF Barcode
63       */
64      private File pdfBarcodeFile;
65      private PDXObjectImage pdfBarcodeImage;
66      private float pdfBarcodeScale = 0.538f;
67  
68      /**
69       * Variablen für das Title Bild
70       */
71      private PDXObjectImage titleImage;
72      private float titleScale = 0.858f;
73  
74      /**
75       * Variablen für das Logo Bild
76       */
77      private File logoFile;
78      private PDXObjectImage logoImage;
79      private float logoScale = 0.738f;
80  
81      /**
82       * Variablen für das Location Bild
83       */
84      private PDXObjectImage locationImage;
85      private float locationScale = 0.35f;
86  
87      /**
88       * Variablen für das Werbe Bild
89       */
90      private File adFile;
91      private PDXObjectImage adImage;
92      private float adScale = 0.443f;
93  
94      private File fontFile;
95      
96      public CreateReservationPDF(File file, Reservation reservation, File logoFile, File adFile, File fontFile) throws IOException, COSVisitorException {
97  		super();
98  		this.file = file;
99  		this.reservation = reservation;
100 		this.logoFile = logoFile;
101 		this.adFile = adFile;
102 		this.fontFile = fontFile;
103     	init();
104     	generate();
105     	close();
106 	}
107 
108     private void init() throws IOException {
109     	// Erstelle das Dokument
110         pdDocument = new PDDocument();
111         // Erstelle die Seite
112         pdPage = new PDPage(PDPage.PAGE_SIZE_A4);
113         // Füge die Seite zum Dokument hinzu
114         pdDocument.addPage(pdPage);
115         // Erstelle Font Objekt
116         pdFont = PDTrueTypeFont.loadTTF(pdDocument, fontFile);
117 
118         // Erstelle Barcode Bild
119         pdfBarcodeFile = new File("/tmp/" + reservation.getUuid() + ".png");
120         new CreateBarcode(pdfBarcodeFile, reservation.getUuid());
121         BufferedImage pdfBarcodeAwtImage = ImageIO.read(pdfBarcodeFile);
122         pdfBarcodeImage = new PDPixelMap(pdDocument, pdfBarcodeAwtImage);
123 
124         // Erstelle Event Bild
125 		BufferedImage titleAwtImage = ImageIO.read(new File(HTDOCS
126 				+ reservation.getEvent().getPicture().getPictureUrl("NORMAL")));
127         titleImage = new PDPixelMap(pdDocument, titleAwtImage);
128 
129         // Erstelle Location Bild
130 		BufferedImage locationAwtImage = ImageIO.read(new File(HTDOCS
131 				+ reservation.getEvent().getLocation().getPicture()
132 						.getPictureUrl("NORMAL")));
133         locationImage = new PDPixelMap(pdDocument, locationAwtImage);
134 
135         // Erstelle Bild
136         BufferedImage logoAwtImage = ImageIO.read(logoFile);
137         logoImage = new PDPixelMap(pdDocument, logoAwtImage);
138 
139         // Erstelle Bild
140         BufferedImage adAwtImage = ImageIO.read(adFile);
141         adImage = new PDPixelMap(pdDocument, adAwtImage);
142 
143         // Erstelle das ContentStream Objekt
144         pdPageContentStream = new PDPageContentStream(pdDocument, pdPage);
145 
146     }
147 
148     private void close() throws IOException, COSVisitorException {
149     	// Speicher das Dokument unter dem angegebenen Pfad und Namen
150     	pdDocument.save(file);
151     	// Schließe das Dokument
152     	pdDocument.close();
153     	pdfBarcodeFile.delete();
154     }
155 
156     private void generate() throws IOException {
157 
158     	pdPageContentStream.drawXObject(logoImage, 40, 713, logoImage.getWidth() * logoScale, logoImage.getHeight() * logoScale);
159     	
160     	generateHeader();
161 
162     	pdPageContentStream.drawXObject(titleImage, 40, 452, titleImage.getWidth() * titleScale, titleImage.getHeight() * titleScale);
163 
164     	generatePerson();
165     	
166     	generateDetails();
167 
168     	generateLocation();
169 
170     	generateRectangle();
171 
172     	pdPageContentStream.drawXObject(adImage, 39, 140, adImage.getWidth() * adScale, adImage.getHeight() * adScale);
173 
174     	pdPageContentStream.drawXObject(locationImage, 345, 140, locationImage.getWidth() * locationScale, locationImage.getHeight() * locationScale);
175 
176         pdPageContentStream.drawXObject(pdfBarcodeImage, 20, 20, pdfBarcodeImage.getWidth() * pdfBarcodeScale, pdfBarcodeImage.getHeight() * pdfBarcodeScale);
177 
178         generateUuid();
179         
180         // Schleiße den ContentStream
181     	pdPageContentStream.close();
182     }
183 
184 	private void generateRectangle() throws IOException {
185 		pdPageContentStream.setLineWidth(2f);
186     	pdPageContentStream.setStrokingColor(new Color(239,128,21));
187     	pdPageContentStream.drawLine(20, 822, 576, 822);
188     	pdPageContentStream.drawLine(20, 120, 20, 822);
189     	pdPageContentStream.drawLine(20, 120, 576, 120);
190     	pdPageContentStream.drawLine(576, 822, 576, 120);
191     	pdPageContentStream.setLineWidth(1f);
192 	}
193 
194 	private void generateLocation() throws IOException {
195 		int fontSize = 10;
196 		float text_width;
197 		
198 		pdPageContentStream.setLineWidth(2f);
199     	pdPageContentStream.setStrokingColor(new Color(239,128,21));
200     	pdPageContentStream.drawLine(325, 130, 325, 440);
201 
202 		pdPageContentStream.setNonStrokingColor(Color.BLACK);
203 
204 		pdPageContentStream.beginText();
205     	pdPageContentStream.setFont( pdFont, fontSize );
206     	text_width = (pdFont.getStringWidth(reservation.getEvent().getLocation().getName("de")) / 1000.0f) * fontSize;
207     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 315 );
208     	pdPageContentStream.drawString(reservation.getEvent().getLocation().getName("de"));
209     	pdPageContentStream.endText();
210     	
211     	pdPageContentStream.beginText();
212     	pdPageContentStream.setFont( pdFont, fontSize );
213     	text_width = (pdFont.getStringWidth(reservation.getEvent().getLocation().getAddress().getStreet()) / 1000.0f) * fontSize;
214     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 300 );
215     	pdPageContentStream.drawString(reservation.getEvent().getLocation().getAddress().getStreet());
216     	pdPageContentStream.endText();
217 
218     	pdPageContentStream.beginText();
219     	pdPageContentStream.setFont( pdFont, fontSize );
220     	text_width = (pdFont.getStringWidth(reservation.getEvent().getLocation().getAddress().getZip() + " " + reservation.getEvent().getLocation().getAddress().getCity()) / 1000.0f) * fontSize;
221     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 285 );
222     	pdPageContentStream.drawString(reservation.getEvent().getLocation().getAddress().getZip() + " " + reservation.getEvent().getLocation().getAddress().getCity());
223     	pdPageContentStream.endText();
224 
225     	pdPageContentStream.beginText();
226     	pdPageContentStream.setFont( pdFont, fontSize );
227     	text_width = (pdFont.getStringWidth("Tel.: " + reservation.getEvent().getLocation().getContactDetails().getTelephone()) / 1000.0f) * fontSize;
228     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 265 );
229     	pdPageContentStream.drawString("Tel.: " + reservation.getEvent().getLocation().getContactDetails().getTelephone());
230     	pdPageContentStream.endText();
231 
232     	pdPageContentStream.beginText();
233     	pdPageContentStream.setFont( pdFont, fontSize );
234     	text_width = (pdFont.getStringWidth("Fax: " + reservation.getEvent().getLocation().getContactDetails().getFax()) / 1000.0f) * fontSize;
235     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 250 );
236     	pdPageContentStream.drawString("Fax: " + reservation.getEvent().getLocation().getContactDetails().getFax());
237     	pdPageContentStream.endText();
238 
239     	pdPageContentStream.beginText();
240     	pdPageContentStream.setFont( pdFont, fontSize );
241     	text_width = (pdFont.getStringWidth("E-Mail: " + reservation.getEvent().getLocation().getContactDetails().getEmail()) / 1000.0f) * fontSize;
242     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 235 );
243     	pdPageContentStream.drawString("E-Mail: " + reservation.getEvent().getLocation().getContactDetails().getEmail());
244     	pdPageContentStream.endText();
245 
246     	pdPageContentStream.beginText();
247     	pdPageContentStream.setFont( pdFont, fontSize );
248     	text_width = (pdFont.getStringWidth(reservation.getEvent().getLocation().getContactDetails().getHomepage()) / 1000.0f) * fontSize;
249     	pdPageContentStream.moveTextPositionByAmount( 556 - text_width, 220 );
250     	pdPageContentStream.drawString(reservation.getEvent().getLocation().getContactDetails().getHomepage());
251     	pdPageContentStream.endText();
252     	
253 	}
254 
255 	private void generatePerson() throws IOException {
256 		pdPageContentStream.addRect(40, 335, 264, 95);
257 
258     	pdPageContentStream.beginText();
259     	pdPageContentStream.setFont( pdFont, 10 );
260     	pdPageContentStream.moveTextPositionByAmount( 50, 415 );
261     	pdPageContentStream.drawString( "Reservierung für:" );
262     	pdPageContentStream.endText();
263 
264     	pdPageContentStream.beginText();
265     	pdPageContentStream.setFont( pdFont, 20 );
266     	pdPageContentStream.moveTextPositionByAmount( 50, 395 );
267     	pdPageContentStream.drawString( reservation.getGender() ? "Frau" : "Herrn" );
268     	pdPageContentStream.endText();
269 
270     	pdPageContentStream.beginText();
271     	pdPageContentStream.setFont( pdFont, 20 );
272     	pdPageContentStream.moveTextPositionByAmount( 50, 370 );
273     	pdPageContentStream.drawString( reservation.getFirstname() );
274     	pdPageContentStream.endText();
275 
276     	pdPageContentStream.beginText();
277     	pdPageContentStream.setFont( pdFont, 20 );
278     	pdPageContentStream.moveTextPositionByAmount( 50, 345 );
279     	pdPageContentStream.drawString( reservation.getLastname() );
280     	pdPageContentStream.endText();
281 	}
282 	
283 	private void generateDetails() throws IOException {
284 		int fontSize = 22;
285 		float text_width;
286 		float text_position;
287 
288 		pdPageContentStream.addRect(345, 340, 100, 90);
289 
290 		pdPageContentStream.beginText();
291     	pdPageContentStream.setFont( pdFont, fontSize );
292     	text_width = (pdFont.getStringWidth("- " + reservation.getQuantity() + " -") / 1000.0f) * fontSize;
293     	text_position = (100 - text_width) / 2;
294     	pdPageContentStream.moveTextPositionByAmount( 345 + text_position , 395 );
295     	pdPageContentStream.drawString( "- " + reservation.getQuantity() + " -" );
296     	pdPageContentStream.endText();
297 
298 		pdPageContentStream.beginText();
299     	pdPageContentStream.setFont( pdFont, fontSize );
300     	text_width = (pdFont.getStringWidth("Pers.") / 1000.0f) * fontSize;
301     	text_position = (100 - text_width) / 2;
302     	pdPageContentStream.moveTextPositionByAmount( 345 + text_position , 365 );
303     	pdPageContentStream.drawString( "Pers." );
304     	pdPageContentStream.endText();
305 
306     	pdPageContentStream.addRect(465, 340, 90, 90);
307 
308 		pdPageContentStream.beginText();
309     	pdPageContentStream.setFont( pdFont, fontSize );
310     	
311     	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
312     	String time = simpleDateFormat.format(reservation.getTime());
313     	text_width = (pdFont.getStringWidth(time) / 1000.0f) * fontSize;
314     	text_position = (90 - text_width) / 2;
315     	pdPageContentStream.moveTextPositionByAmount( 465 + text_position , 395 );
316     	pdPageContentStream.drawString(time);
317     	pdPageContentStream.endText();
318 
319 		pdPageContentStream.beginText();
320     	pdPageContentStream.setFont( pdFont, fontSize );
321     	text_width = (pdFont.getStringWidth("Uhr") / 1000.0f) * fontSize;
322     	text_position = (90 - text_width) / 2;
323     	pdPageContentStream.moveTextPositionByAmount( 465 + text_position , 365 );
324     	pdPageContentStream.drawString( "Uhr" );
325     	pdPageContentStream.endText();
326 	}
327 
328 	private void generateHeader() throws IOException {
329 
330 		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
331 		String date = simpleDateFormat.format(reservation.getEvent().getBeginning());
332 
333     	pdPageContentStream.beginText();
334     	pdPageContentStream.setFont( pdFont, 25 );
335     	pdPageContentStream.moveTextPositionByAmount( 40, 680 );
336     	pdPageContentStream.drawString( "Reservierungsbestätigung" );
337     	pdPageContentStream.endText();
338 
339     	
340     	pdPageContentStream.setNonStrokingColor(new Color(239,128,21));
341     	pdPageContentStream.beginText();
342     	pdPageContentStream.setFont( pdFont, 25 );
343     	pdPageContentStream.moveTextPositionByAmount( 40, 650 );
344     	pdPageContentStream.drawString( reservation.getEvent().getName("de") + " am " + date );
345     	pdPageContentStream.endText();
346 
347     	pdPageContentStream.beginText();
348     	pdPageContentStream.setFont( pdFont, 25 );
349     	pdPageContentStream.moveTextPositionByAmount( 40, 620 );
350     	pdPageContentStream.drawString( "im " + reservation.getEvent().getLocation().getName("de") );
351     	pdPageContentStream.endText();
352 	}
353 
354 	private void generateUuid() throws IOException {
355 		int fontSize = 8;
356 		float text_width;
357 		float text_position;
358 		text_width = (pdFont.getStringWidth(reservation.getUuid()) / 1000.0f) * fontSize;
359 		text_position = (556 - text_width) / 2;
360     	pdPageContentStream.beginText();
361     	pdPageContentStream.setFont( pdFont, fontSize );
362     	pdPageContentStream.moveTextPositionByAmount( 20 + text_position , 14 );
363     	pdPageContentStream.drawString(reservation.getUuid());
364     	pdPageContentStream.endText();
365 	}
366 }// Ende class