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
28
29
30 public class CreateReservationPDF {
31
32 private static final String HTDOCS = "/var/www/html";
33
34 private File file;
35
36
37
38
39 private PDDocument pdDocument;
40
41
42
43
44 private PDPage pdPage;
45
46
47
48
49 private PDFont pdFont;
50
51
52
53
54 private PDPageContentStream pdPageContentStream;
55
56
57
58
59 private Reservation reservation;
60
61
62
63
64 private File pdfBarcodeFile;
65 private PDXObjectImage pdfBarcodeImage;
66 private float pdfBarcodeScale = 0.538f;
67
68
69
70
71 private PDXObjectImage titleImage;
72 private float titleScale = 0.858f;
73
74
75
76
77 private File logoFile;
78 private PDXObjectImage logoImage;
79 private float logoScale = 0.738f;
80
81
82
83
84 private PDXObjectImage locationImage;
85 private float locationScale = 0.35f;
86
87
88
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
110 pdDocument = new PDDocument();
111
112 pdPage = new PDPage(PDPage.PAGE_SIZE_A4);
113
114 pdDocument.addPage(pdPage);
115
116 pdFont = PDTrueTypeFont.loadTTF(pdDocument, fontFile);
117
118
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
125 BufferedImage titleAwtImage = ImageIO.read(new File(HTDOCS
126 + reservation.getEvent().getPicture().getPictureUrl("NORMAL")));
127 titleImage = new PDPixelMap(pdDocument, titleAwtImage);
128
129
130 BufferedImage locationAwtImage = ImageIO.read(new File(HTDOCS
131 + reservation.getEvent().getLocation().getPicture()
132 .getPictureUrl("NORMAL")));
133 locationImage = new PDPixelMap(pdDocument, locationAwtImage);
134
135
136 BufferedImage logoAwtImage = ImageIO.read(logoFile);
137 logoImage = new PDPixelMap(pdDocument, logoAwtImage);
138
139
140 BufferedImage adAwtImage = ImageIO.read(adFile);
141 adImage = new PDPixelMap(pdDocument, adAwtImage);
142
143
144 pdPageContentStream = new PDPageContentStream(pdDocument, pdPage);
145
146 }
147
148 private void close() throws IOException, COSVisitorException {
149
150 pdDocument.save(file);
151
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
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 }