Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package wbs.jsf1.pdf; import com.itextpdf.io.font.FontConstants; import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.border.Border; import com.itextpdf.layout.element.Cell; import com.itextpdf.layout.element.Image; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.element.Table; import com.itextpdf.layout.property.HorizontalAlignment; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.ejb.EJB; import javax.ejb.Stateless; import wbs.jsf1.persistence.Lottoschein; import wbs.jsf1.persistence.LottoscheinFacadeLocal; import wbs.jsf1.util.ByteLongConverter; import wbs.jsf1.util.LottoUtil; /** * * @author Guy Boldon */ // @Stateless public class LottoReceiptBean0 implements LottoReceiptBeanLocal { // @EJB LottoscheinFacadeLocal lottoscheinFacadeLocal; private static final Logger LOG = Logger.getLogger(LottoReceiptBean0.class.getName()); private static final int annahmeschlussMittwoch = 18; private static final int annahmeschlussSamstag = 19; private static final String IMAGE_NAME = "lotto6aus49.png"; private static String imagePath; private static String datum = new SimpleDateFormat("ddMMyyyy").format(new Date()); private Lottoschein zahlen; @PostConstruct public void init() { // imagePath = this.getClass().getResource(IMAGE_NAME).getPath(); // imagePath = LottoReceiptBean.class.getResource(IMAGE_NAME).getPath(); imagePath = Thread.currentThread().getContextClassLoader().getResource(IMAGE_NAME).getPath(); } public byte[] createPdfFrom(Lottoschein lottoschein) { try { zahlen = lottoschein; ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(pdfStream); PdfDocument pdf = new PdfDocument(writer); PageSize pageSize = new PageSize(PageSize.A6); Document document = new Document(pdf, pageSize); document.setMargins(20, 20, 40, 20); PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA); PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD); // Header document.add(getHeaderTable()); // Lottozahlen auflisten document.add(getZiehungsDatenTable(font, bold)); // Losnummer document.add(getLosnummerTable(font, bold)); // Spieltage document.add(getSpieltageTable(font, bold)); // Laufzeit document.add(getLaufzeitTable(font, bold)); // Betrag document.add(getBetragTable(font, bold)); document.close(); LOG.log(Level.INFO, "PDF succesfully created."); return pdfStream.toByteArray(); } catch (IOException ex) { Logger.getLogger(LottoReceiptBean0.class.getName()).log(Level.SEVERE, "pdf creation problem", ex); } return null; } private Table getHeaderTable() throws MalformedURLException { Table table = new Table(new float[] { 1 }) { }; table.setWidthPercent(100); getHeaderImage(table); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); return table; } private void getHeaderImage(Table table) { Image headerLogo; try { headerLogo = new Image(ImageDataFactory.create(imagePath)).setAutoScale(true) .setBorder(Border.NO_BORDER); table.addCell(new Cell().add(headerLogo).setBorder(Border.NO_BORDER)); } catch (Exception e) { LOG.log(Level.WARNING, "cannot find the image file for the pdf"); table.addCell(new Cell().setBorder(Border.NO_BORDER)); } } private Table getZiehungsDatenTable(PdfFont font, PdfFont bold) { Table table = new Table(new float[] { 1, 1, 1, 1, 1, 1, 1 }) { }; table.setWidthPercent(100); int lineCnt = 0; long[] result = ByteLongConverter.byteToLong(zahlen.getTipps()); for (long l : result) { table.addCell(new Cell().add(new Paragraph(String.valueOf(++lineCnt) + ".").setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(20)); List<Integer> lz = LottoUtil.tippAsArrayList(l); for (Integer i : lz) { table.addCell(new Cell().add(new Paragraph(String.valueOf(i)).setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(13)); } } return table; } private Table getLosnummerTable(PdfFont font, PdfFont bold) { Table table = new Table(new float[] { 1, 1, 1 }) { }; table.setWidthPercent(100); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add(new Paragraph("Superzahl").setFont(font)).setBorder(Border.NO_BORDER) .setWidthPercent(55)); table.addCell( new Cell().add(new Paragraph("").setFont(font)).setBorder(Border.NO_BORDER).setWordSpacing(35)); String superzahl = String.valueOf(zahlen.getLosnummer()); table.addCell(new Cell().add(new Paragraph(superzahl.substring(superzahl.length() - 1)).setFont(font)) .setBorder(Border.NO_BORDER).setWordSpacing(10).setHorizontalAlignment(HorizontalAlignment.RIGHT)); table.addCell(new Cell().add(new Paragraph("Losnummer").setFont(font)).setBorder(Border.NO_BORDER) .setWidthPercent(55)); table.addCell(new Cell().add(new Paragraph("Super6").setFont(font)).setBorder(Border.NO_BORDER) .setWordSpacing(35)); table.addCell(new Cell().add(new Paragraph(isGame(zahlen.getIsSuper6())).setFont(font)) .setBorder(Border.NO_BORDER).setWordSpacing(10)); table.addCell(new Cell().add(new Paragraph(String.valueOf(zahlen.getLosnummer())).setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(55)); table.addCell(new Cell().add(new Paragraph("Spiel77").setFont(font)).setBorder(Border.NO_BORDER) .setWordSpacing(35)); table.addCell(new Cell().add(new Paragraph(isGame(zahlen.getIsSpiel77())).setFont(font)) .setBorder(Border.NO_BORDER).setWordSpacing(10)); return table; } private Table getSpieltageTable(PdfFont font, PdfFont bold) { Table table = new Table(new float[] { 1 }) { }; table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell() .add(new Paragraph(getSpieltageText(zahlen.getIsMittwoch(), zahlen.getIsSamstag()).toString()) .setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(55)); return table; } private Table getLaufzeitTable(PdfFont font, PdfFont bold) { Table table = new Table(new float[] { 1, 1 }) { }; table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add(new Paragraph(getLaufzeitText(zahlen.getLaufzeit()).toString()).setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(55)); table.addCell(new Cell().add(new Paragraph("vom " + dateFormatter(zahlen.getAbgabeDatum())).setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(45)); table.addCell( new Cell().add(new Paragraph("").setFont(font)).setBorder(Border.NO_BORDER).setWidthPercent(55)); table.addCell(new Cell().add(new Paragraph("bis " + dateFormatter(getEndDatum())).setFont(font)) .setBorder(Border.NO_BORDER).setWidthPercent(45)); return table; } private Table getBetragTable(PdfFont font, PdfFont bold) { Table table = new Table(new float[] { 1, 1 }) { }; table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add("").setBorder(Border.NO_BORDER)); table.addCell(new Cell().add("Betrag: ").setBorder(Border.NO_BORDER).setWidthPercent(80)); table.addCell(new Cell().add(zahlen.getKosten().toString() + " ").setBorder(Border.NO_BORDER) .setWidthPercent(20).setHorizontalAlignment(HorizontalAlignment.RIGHT)); return table; } // TODO: Schlauer machen /* * Ermittelt das letzte Spieldatum. Problematik: Um den tatschlich letzten * Ziehungstag zu errechnen, kann man nicht einfach 2 Wochen zum Abgabedatum * dazu rechnen. Reiche ich beispielsweise am Dienstag 20.03. den Lottoschein * ein und gebe 2 Wochen Laufzeit an, spiele aber nur Mittwochslotto, dann wrde * bei einer Aufrechnung von 2 Wochen der letzte Samstag mit eingeschlossen und * somit angezeigt werden, obwohl ich nur Mittwochslotto spiel. Daher muss * geprft werden, welche Tage (Mi oder Sa) gespielt werden, um diese dann von * meinen Zhlern abzuziehen. Wenn 0 erreicht wurde, muss die Schleife beendet * werden. Das dann ermittelte Datum ist der letzte tatschlich Ziehungstag, an * dem man teilnimmt. */ private Date getEndDatum() { int wochenlaufzeit = zahlen.getLaufzeit(); int tage = wochenlaufzeit * 7; Date datumStart = zahlen.getAbgabeDatum(); int m = wochenlaufzeit; int s = wochenlaufzeit; Calendar curr = Calendar.getInstance(); curr.get(Calendar.HOUR_OF_DAY); Calendar cal = Calendar.getInstance(); cal.setTime(datumStart); if (cal.get(Calendar.DAY_OF_WEEK) == 4 & curr.get(Calendar.HOUR_OF_DAY) > annahmeschlussMittwoch) { cal.add(Calendar.DATE, 1); } if (cal.get(Calendar.DAY_OF_WEEK) == 7 & curr.get(Calendar.HOUR_OF_DAY) > annahmeschlussSamstag) { cal.add(Calendar.DATE, 1); } for (int i = 0; i < tage; i++) { cal.add(Calendar.DATE, 1); if (cal.get(Calendar.DAY_OF_WEEK) == 4) { m--; } if (cal.get(Calendar.DAY_OF_WEEK) == 7) { s--; } if (zahlen.getIsMittwoch() & zahlen.getIsSamstag()) { if (m == 0 & s == 0) { break; } } else { if (zahlen.getIsMittwoch()) { if (m == 0) { break; } } if (zahlen.getIsSamstag()) { if (s == 0) { break; } } } } return cal.getTime(); } private String dateFormatter(Date date) { DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy"); return formatter.format(date); } private StringBuilder getLaufzeitText(int wochen) { StringBuilder laufzeit = new StringBuilder(); laufzeit.append("Laufzeit: " + wochen + " Woche"); if (wochen > 1) { laufzeit.append("n"); } return laufzeit; } private StringBuilder getSpieltageText(boolean isM, boolean isS) { StringBuilder spieltage = new StringBuilder(); spieltage.append("Spieltag"); if (isM & isS) { spieltage.append("e"); } if (isM) { spieltage.append(" Mittwoch "); } if (isM & isS) { spieltage.append("und"); } if (isS) { spieltage.append(" Samstag"); } return spieltage; } private String isGame(boolean check) { return check ? "JA" : "NEIN"; } }