Java tutorial
/* Copyright (C) 2011 [Gobierno de Espana] * This file is part of "Cliente @Firma". * "Cliente @Firma" is free software; you can redistribute it and/or modify it under the terms of: * - the GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. * - or The European Software License; either version 1.1 or (at your option) any later version. * Date: 11/01/11 * You may contact the copyright holder at: soporte.afirma5@mpt.es */ package es.gob.afirma.signers.pades; import java.io.IOException; import java.util.Map; import java.util.Properties; import java.util.logging.Logger; import com.lowagie.text.Annotation; import com.lowagie.text.DocumentException; import com.lowagie.text.Image; import com.lowagie.text.Jpeg; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfStamper; import es.gob.afirma.core.misc.Base64; /** Utilidades para el manejo y modificación de PDF antes de firmarlo. * @author Tomás García-Merás */ public final class PdfPreProcessor { private static final Logger LOGGER = Logger.getLogger("es.gob.afirma"); //$NON-NLS-1$ private PdfPreProcessor() { // No permitimos la instancacion } /** Añade campos adicionales al diccionario PDF. * @param moreInfo Campos a añadir al diccionario PDF * @param stp Estampador de PDF, debe abrirse y cerrarse fuera de este método */ public static void addMoreInfo(final Map<String, String> moreInfo, final PdfStamper stp) { if (moreInfo == null || moreInfo.isEmpty()) { return; } stp.setMoreInfo(moreInfo); } static void attachFile(final Properties extraParams, final PdfStamper stp) throws IOException { if (extraParams == null) { return; } if (stp == null) { throw new IllegalArgumentException("No se puede adjuntar un fichero a un PdfStamper nulo"); //$NON-NLS-1$ } // Contenido a adjuntar (en Base64) final String b64Attachment = extraParams.getProperty("attach"); //$NON-NLS-1$ // Nombre que se pondra al fichero adjunto en el PDF final String attachmentFileName = extraParams.getProperty("attachFileName"); //$NON-NLS-1$ // Descripcion del adjunto final String attachmentDescription = extraParams.getProperty("attachDescription"); //$NON-NLS-1$ if (b64Attachment != null && attachmentFileName != null) { final byte[] attachment; try { attachment = Base64.decode(b64Attachment); } catch (final IOException e) { LOGGER.warning("Se ha indicado un adjunto, pero no estaba en formato Base64, se ignorara : " + e); //$NON-NLS-1$ return; } stp.getWriter().addFileAttachment(attachmentDescription, attachment, null, attachmentFileName); } } /** Sobreimpone una imagen JPEG en un documento PDF. * @param jpegImage Imagen JPEG * @param width Ancho de la imagen * @param height Alto de la imagen * @param left Distancia de la imagen al borde izquiero de la página del PDF * @param bottom Distancia de la imagen al borde inferior de la página del PDF * @param pageNum Número de página del PDF donde insertar la imagen * (la numeración comienza en 1) * @param url URL a la que enlazará la imagen si queremos que esta sea un hipervínculo * (puede ser <code>null</code>) * @param stp Estampador PDF de iText * @throws IOException En caso de errores de entrada / salida */ public static void addImage(final byte[] jpegImage, final int width, final int height, final int left, final int bottom, final int pageNum, final String url, final PdfStamper stp) throws IOException { final PdfContentByte content = stp.getOverContent(pageNum); try { final Image image = new Jpeg(jpegImage); if (url != null) { image.setAnnotation(new Annotation(0, 0, 0, 0, url)); } content.addImage(image, // Image width, // Image width 0, 0, height, // Image height left, // Lower left X position of the image bottom, // Lower left Y position of the image false // Inline ); } catch (final DocumentException e) { throw new IOException("Error durante la insercion de la imagen en el PDF: " + e, e); //$NON-NLS-1$ } } /** Sobreimpone una imagen en un documento PDF. * @param extraParams Datos de la imagen a añadir como <a href="doc-files/extraparams.html">parámetros adicionales</a> * @param stp Estampador de PDF, debe abrirse y cerrarse fuera de este método * @throws IOException Cuando ocurren errores de entrada / salida */ static void addImage(final Properties extraParams, final PdfStamper stp) throws IOException { if (extraParams == null || stp == null) { return; } final String imageDataBase64 = extraParams.getProperty("image"); //$NON-NLS-1$ if (imageDataBase64 == null || imageDataBase64.length() < 1) { return; } final byte[] image = Base64.decode(imageDataBase64); final Rectangle rect = getPositionOnPage(extraParams, "image"); //$NON-NLS-1$ if (rect == null) { return; } final String imagePage = extraParams.getProperty("imagePage"); //$NON-NLS-1$ if (imagePage == null) { return; } final int pageNum; try { pageNum = Integer.parseInt(imagePage); } catch (final NumberFormatException e) { throw new IOException( "Se ha indicado un numero de pagina con formato invalido para insertar la imagen (" + imagePage //$NON-NLS-1$ + "): " + e, //$NON-NLS-1$ e); } addImage(image, (int) rect.getWidth(), (int) rect.getHeight(), (int) rect.getLeft(), (int) rect.getBottom(), pageNum, null, stp); LOGGER.info("Anadida imagen al PDF antes de la firma"); //$NON-NLS-1$ } /** Devuelve la posición de la página en donde debe agregarse el elemento * gráfico indicado como prefijo. La medida de posicionamiento es el píxel y se cuenta en * el eje horizontal de izquierda a derecha y en el vertical de abajo a arriba. * @param extraParams Definición de las coordenadas como conjunto de propiedades * @param prefix Prefijo de las propiedades de coordenada en el conjunto * @return Rectángulo que define una posición de un elemento en una página del PDF */ static Rectangle getPositionOnPage(final Properties extraParams, final String prefix) { if (extraParams == null || prefix == null) { LOGGER.severe("Se ha pedido una posicion para un elemento grafico nulo"); //$NON-NLS-1$ return null; } if (extraParams.getProperty(prefix + "PositionOnPageLowerLeftX") != null && //$NON-NLS-1$ extraParams.getProperty(prefix + "PositionOnPageLowerLeftY") != null && //$NON-NLS-1$ extraParams.getProperty(prefix + "PositionOnPageUpperRightX") != null && //$NON-NLS-1$ extraParams.getProperty(prefix + "PositionOnPageUpperRightY") != null //$NON-NLS-1$ ) { try { return new Rectangle(Integer.parseInt(extraParams.getProperty(prefix + "PositionOnPageLowerLeftX")), //$NON-NLS-1$ Integer.parseInt(extraParams.getProperty(prefix + "PositionOnPageLowerLeftY")), //$NON-NLS-1$ Integer.parseInt(extraParams.getProperty(prefix + "PositionOnPageUpperRightX")), //$NON-NLS-1$ Integer.parseInt(extraParams.getProperty(prefix + "PositionOnPageUpperRightY")) //$NON-NLS-1$ ); } catch (final Exception e) { LOGGER.severe( "Se ha indicado una posicion invalida para el elemento grafico '" + prefix + "': " + e); //$NON-NLS-1$ //$NON-NLS-2$ } } return null; } static com.lowagie.text.Image getImage(final String imagebase64Encoded) { if (imagebase64Encoded == null || "".equals(imagebase64Encoded)) { //$NON-NLS-1$ return null; } final byte[] image; try { image = Base64.decode(imagebase64Encoded); } catch (final Exception e) { LOGGER.severe("Se ha proporcionado una imagen de rubrica que no esta codificada en Base64: " + e); //$NON-NLS-1$ return null; } try { return new Jpeg(image); } catch (final Exception e) { LOGGER.info("Se ha proporcionado una imagen de rubrica que no esta codificada en JPEG: " + e); //$NON-NLS-1$ } return null; } }