co.unicauca.proyectobase.entidades.MetodosPDF.java Source code

Java tutorial

Introduction

Here is the source code for co.unicauca.proyectobase.entidades.MetodosPDF.java

Source

/*
 * 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 co.unicauca.proyectobase.entidades;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/**
 *
 * @author Juan
 */
public class MetodosPDF {
    //diferentes metodos para manipular un archivo PDF
    //link: http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-12#476-metadatapdf.java

    //metodo para crear un archivo PDF y anexar algunos metadatos basicos
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1: Crear el objeto
        Document document = new Document();
        // step 2: instanciar para escritura con el objeto creado 
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: agregar los metadatos
        document.addTitle("Hello World example");
        document.addAuthor("Bruno Lowagie");
        document.addSubject("This example shows how to add metadata");
        document.addKeywords("Metadata, iText, PDF");
        document.addCreator("My program using iText");
        document.open();
        // step 4: agregar el conteido, en este caso "Parrafo 1"
        document.add(new Paragraph("Parrafo 1"));
        // step 5: cerrar el archivo que se creo
        document.close();
    }

    //manipular el archivo PDF original (src) con el archivo de destino (dest) como resultado de la manipulacion
    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        HashMap<String, String> info = reader.getInfo();
        info.put("Title", "Hello World stamped");
        info.put("Subject", "Hello World with changed metadata");
        info.put("Keywords", "iText in Action, PdfStamper");
        info.put("Creator", "Silly standalone example");
        info.put("Author", "Also Bruno Lowagie");
        info.put("Cod", codigoFirma("104611024139"));
        stamper.setMoreInfo(info);
        stamper.close();
        reader.close();
    }

    public void mostrarHash() {
    }

    public void firmaDigital() {
        //        try { 
        //            KeyStore ks = KeyStore.getInstance("pkcs12");
        //            ks.load(new FileInputStream("RUTA_CERTIFICADO_PFX"), "CLAVE_PRIVADA_CERTIFICADO".toCharArray());
        //            String alias = (String)ks.aliases().nextElement();
        //            PrivateKey key = (PrivateKey)ks.getKey(alias, "CLAVE_PRIVADA_CERTIFICADO".toCharArray());
        //            Certificate[] chain = ks.getCertificateChain(alias);
        //            // Recibimos como parmetro de entrada el nombre del archivo PDF a firmar
        //            PdfReader reader = new PdfReader(args[0]); 
        //            FileOutputStream fout = new FileOutputStream("RUTA_ARCHIVO_PDF_FIRMADO");
        // 
        //            // Aadimos firma al documento PDF
        //            PdfStamper stp = PdfStamper.createSignature(reader, fout, '?');
        //            PdfSignatureAppearance sap = stp.getSignatureAppearance();
        //            sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
        //            sap.setReason("Firma PKCS12");
        //            sap.setLocation("Imaginanet");
        //            // Aade la firma visible. Podemos comentarla para que no sea visible.
        //            sap.setVisibleSignature(new Rectangle(100,100,200,200),1,null);
        //            stp.close();
        //        }
        //        catch(Exception e) {
        //            e.printStackTrace();
        //        }
    }

    private static byte[] hashFile(File file) throws Exception {

        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        FileInputStream fis = new FileInputStream(file.getAbsolutePath());

        byte[] bytesBuffer = new byte[1024];
        int bytesRead = 0;

        while ((bytesRead = fis.read(bytesBuffer)) != -1) {
            digest.update(bytesBuffer, 0, bytesRead);
        }

        byte[] hashed = digest.digest();
        return hashed;
    }

    public String obtenerHash(String ruta) {
        try {
            File fichero = new File(ruta);
            FileInputStream ficheroStream = new FileInputStream(fichero);
            byte contenido[] = new byte[(int) fichero.length()];
            ficheroStream.read(contenido);
            return getHash(contenido);
        } catch (Exception e) {
            return null;
        }
    }

    private String toHexadecimal(byte[] digest) {
        //        String hash = ""; 
        //        for(byte aux : digest) { 
        //            int b = aux & 0xff; 
        //            if (Integer.toHexString(b).length() == 1) hash += "0"; 
        //            hash += Integer.toHexString(b); 
        //        } 
        //        return hash; 

        String hash = "";
        for (byte aux : digest) {
            int b = aux & 0xff;
            if (Integer.toHexString(b).length() == 1)
                hash += "0";
            hash += Integer.toHexString(b);
        }
        return hash;
    }

    public String getHash(byte[] contenido/*String cadena, int tipoAlgoritmo*/) {
        //        byte[] digest = null; 
        //        byte[] buffer = cadena.getBytes(); 
        //        try { 
        //            MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
        //            messageDigest.reset(); 
        //            messageDigest.update(buffer); 
        //            digest = messageDigest.digest(); 
        //        } catch (NoSuchAlgorithmException ex) { 
        //            System.out.println("Error creando Hash"); 
        //        } 
        //        return toHexadecimal(digest); 
        byte[] digest = null;

        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
            messageDigest.reset();
            messageDigest.update(contenido);
            digest = messageDigest.digest();
        } catch (NoSuchAlgorithmException ex) {
            System.out.println("Error creando Hash");
        }
        return toHexadecimal(digest);
    }

    public String codigoFirma(String codigoEstudiante) {
        String cadenaAleatoria = "";
        long milis = new java.util.GregorianCalendar().getTimeInMillis();
        Random r = new Random(milis);
        int i = 0;
        while (i < 6) {
            char c = (char) r.nextInt(255);
            if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')) {
                cadenaAleatoria += c;
                i++;
            }
        }
        return codigoEstudiante + "_" + cadenaAleatoria;
    }
    //El codigo comentado es solo para probar la funcionalidad. 
    /* public static void main(String[] args){ 
      System.out.println("hola"+ " MD2 "+ getHash("hola",0)); 
      System.out.println("hola"+ " MD5 "+ getHash("hola",1)); 
      System.out.println("hola"+ " SHA-1 "+ getHash("hola",2)); 
      System.out.println("hola"+ " SHA-256 "+ getHash("hola",3)); 
      System.out.println("hola"+ " SHA-384 "+ getHash("hola",4)); 
      System.out.println("hola"+ " SHA-512 "+ getHash("hola",5)); 
     }*/
}

//    public void addLtv(String src, String dest, OcspClient ocsp, CrlClient crl, TSAClient tsa)
//        throws IOException, DocumentException, GeneralSecurityException {
//        PdfReader r = new PdfReader(src);
//        FileOutputStream fos = new FileOutputStream(dest);
//        PdfStamper stp = PdfStamper.createSignature(r, fos, '\0', null, true);
//        LtvVerification v = stp.getLtvVerification();
//        AcroFields fields = stp.getAcroFields();
//        List<String> names = fields.getSignatureNames();
//        String sigName = names.get(names.size() - 1);
//        PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
//        if (pkcs7.isTsp()) {
//            v.addVerification(sigName, ocsp, crl,
//                LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
//                LtvVerification.Level.OCSP_CRL,
//                LtvVerification.CertificateInclusion.NO);
//        }
//        else {
//            for (String name : names) {
//                v.addVerification(name, ocsp, crl,
//                    LtvVerification.CertificateOption.WHOLE_CHAIN,
//                    LtvVerification.Level.OCSP_CRL,
//                    LtvVerification.CertificateInclusion.NO);
//            }
//        }
//        PdfSignatureAppearance sap = stp.getSignatureAppearance();
//        LtvTimestamp.timestamp(sap, tsa, null);
//    }