All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.gob.afirma.signers.pades.PdfPreProcessor Maven / Gradle / Ivy

/* 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.
 * You may contact the copyright holder at: [email protected]
 */

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.aowagie.text.Annotation;
import com.aowagie.text.DocumentException;
import com.aowagie.text.Image;
import com.aowagie.text.Jpeg;
import com.aowagie.text.Rectangle;
import com.aowagie.text.pdf.PdfContentByte;
import com.aowagie.text.pdf.PdfReader;
import com.aowagie.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 static final int LAST_PAGE = -1;
    private static final int ALL_PAGES = 0;
    private static final int FIRST_PAGE = 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 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(PdfExtraParams.ATTACH);

		// Nombre que se pondra al fichero adjunto en el PDF
		final String attachmentFileName = extraParams.getProperty(PdfExtraParams.ATTACH_FILENAME);

		// Descripcion del adjunto
		final String attachmentDescription = extraParams.getProperty(PdfExtraParams.ATTACH_DESCRIPTION);

		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 null)
	 * @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 parámetros
	 *                    adicionales.
	 * @param stp Estampador de PDF, debe abrirse y cerrarse fuera de este método.
	 * @param pdfReader Lector PDF, para obtener el número de páginas del documento.
	 * @throws IOException Cuando ocurren errores de entrada / salida. */
	static void addImage(final Properties extraParams, final PdfStamper stp, final PdfReader pdfReader) throws IOException {

		if (extraParams == null || stp == null) {
			return;
		}

		final String imageDataBase64 = extraParams.getProperty(PdfExtraParams.IMAGE);
		if (imageDataBase64 == null || imageDataBase64.length() < 1) {
			return;
		}
		final byte[] image = Base64.decode(imageDataBase64);

		final Rectangle rect = PdfUtil.getPositionOnPage(extraParams, PdfExtraParams.IMAGE);

		if (rect == null) {
			return;
		}

		final String imagePage = extraParams.getProperty(PdfExtraParams.IMAGE_PAGE);
		if (imagePage == null) {
			return;
		}

		int pageNum;
		try {
			pageNum = Integer.parseInt(imagePage.trim());
		}
		catch(final NumberFormatException e) {
			throw new IOException(
				"Se ha indicado un numero de pagina con formato invalido para insertar la imagen (" + imagePage + "): " + e, e //$NON-NLS-1$ //$NON-NLS-2$
			);
		}

		if (pageNum == LAST_PAGE) {
			pageNum = pdfReader.getNumberOfPages();
		}
		final int pageLimit;
		if (pageNum == ALL_PAGES) {
			pageNum = FIRST_PAGE;
			pageLimit = pdfReader.getNumberOfPages();
		}
		else {
			pageLimit = pageNum;
		}

		for (int i= pageNum; i<=pageLimit; i++) {
			addImage(
				image,
				(int) rect.getWidth(),
				(int) rect.getHeight(),
				(int) rect.getLeft(),
				(int) rect.getBottom(),
				i,
				null,
				stp
			);
		}

		LOGGER.info("Anadida imagen al PDF antes de la firma"); //$NON-NLS-1$
	}

    static com.aowagie.text.Image getImage(final String imagebase64Encoded) {
    	if (imagebase64Encoded == null || imagebase64Encoded.isEmpty()) {
    		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;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy