/* * eID Applet Project. * Copyright (C) 2008-2009 FedICT. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version * 3.0 as published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, see * http://www.gnu.org/licenses/. */ package be.fedict.eid.applet.service.impl; import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.lowagie.text.BadElementException; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.Barcode128; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfWriter; import be.fedict.eid.applet.service.Address; import be.fedict.eid.applet.service.EIdData; import be.fedict.eid.applet.service.Identity; import be.fedict.eid.applet.service.PdfServlet; /** * PDF generator for eID identity data. The implementation is using iText. * * @author Frank Cornelis * @author Bart Hanssens * @see PdfServlet */ public class PdfGenerator { private static final Log LOG = LogFactory.getLog(PdfGenerator.class); /** * Generate a Code128C barcode * * @param rrn * unique Rijksregister number * @param cardNumber * number of the card * @return Image containing barcode * @throws IOException * @throws BadElementException */ private Image createBarcodeImage(String rrn, String cardNumber) throws IOException, BadElementException { if (null == rrn || rrn.length() != 11 || null == cardNumber || cardNumber.length() < 9) { throw new IllegalArgumentException("Missing or invalid length for RRN or Card Number"); } String lastDigits = cardNumber.substring(cardNumber.length() - 9); String code = rrn + lastDigits; Barcode128 barcode = new Barcode128(); barcode.setCodeType(Barcode128.CODE_C); barcode.setCode(code); barcode.setFont(null); return Image.getInstance(barcode.createAwtImage(Color.BLACK, Color.WHITE), null, true); } /** * Create a PDF image from eID photo * * @param photoData * raw bytes * @return PDF image * @throws IOException * @throws BadElementException */ private Image createImageFromPhoto(byte[] photoData) throws IOException, BadElementException { Image image = Image.getInstance(photoData); image.setAlt("Photo"); image.setAlignment(Element.ALIGN_CENTER); image.setSpacingAfter(20); return image; } /** * Set the metadata on the PDF document * * @param doc * PDF document * @param firstName * first name of the person * @param lastName * last name of the person */ private void setDocumentMetadata(Document doc, String firstName, String lastName) { doc.addTitle(firstName + " " + lastName); doc.addSubject("Data from the eID card"); doc.addCreator("Belgian eID applet"); doc.addProducer(); doc.addCreationDate(); } public byte[] generatePdf(EIdData eIdData) throws DocumentException { Document document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document, baos); document.open(); Paragraph titleParagraph = new Paragraph("eID Identity Data"); titleParagraph.setAlignment(Paragraph.ALIGN_CENTER); Font titleFont = titleParagraph.getFont(); titleFont.setSize((float) 20.0); titleFont.setStyle(Font.BOLD); titleParagraph.setSpacingAfter(20); document.add(titleParagraph); if (null != eIdData && null != eIdData.getIdentity()) { if (null != eIdData.getPhoto()) { try { Image image = createImageFromPhoto(eIdData.getPhoto()); document.add(image); } catch (Exception e) { LOG.error("Error getting photo: " + e.getMessage()); } Identity identity = eIdData.getIdentity(); // metadata setDocumentMetadata(document, identity.firstName, identity.name); writer.createXmpMetadata(); // create a table with the data of the eID card PdfPTable table = new PdfPTable(2); table.getDefaultCell().setBorder(0); table.addCell("Name"); table.addCell(identity.name); table.addCell("First name"); String firstName = identity.firstName; if (null != identity.middleName) { firstName += " " + identity.middleName; } table.addCell(firstName); table.addCell("Nationality"); table.addCell(identity.nationality); table.addCell("National Registration Number"); table.addCell(identity.nationalNumber); table.addCell("Gender"); table.addCell(identity.gender.toString()); table.addCell("Date of birth"); SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); table.addCell(formatter.format(identity.dateOfBirth.getTime())); table.addCell("Place of birth"); table.addCell(identity.placeOfBirth); if (null != eIdData.getAddress()) { Address address = eIdData.getAddress(); table.addCell("Address"); PdfPCell cell = new PdfPCell(); cell.setBorder(0); cell.addElement(new Paragraph(address.streetAndNumber)); cell.addElement(new Paragraph(address.zip + " " + address.municipality)); table.addCell(cell); } document.add(table); // TODO: to be tested /* * try { Image barcodeImage = * createBarcodeImage(identity.nationalNumber, * identity.cardNumber); * * barcodeImage.setAlignment(Element.ALIGN_CENTER); Paragraph * barcodePara = new Paragraph(); barcodePara.add(barcodeImage); * * document.add(barcodeImage); } catch (Exception e) { * LOG.error("Error adding barcode: " + e.getMessage()); } */ } else { document.add(new Paragraph("No eID identity data available.")); } } document.close(); return baos.toByteArray(); } }