algoritmos.Recorte.java Source code

Java tutorial

Introduction

Here is the source code for algoritmos.Recorte.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 algoritmos;

import controlador.Manager;
import ij.IJ;
import ij.ImagePlus;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import model.Adherente;
import model.PartidoPolitico;
import static net.sourceforge.tess4j.ITessAPI.TessPageSegMode.PSM_SINGLE_CHAR;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import preprocessing.Utils;
import static preprocessing.Utils.binarization;
import static preprocessing.Utils.cropper;
import static preprocessing.Utils.executeTesseract;
import static preprocessing.Utils.executeTesseractNumbers;
import static preprocessing.Utils.limpiarBordeImagen;
import static preprocessing.Utils.removeNoisePoints;

/**
 *
 * @author Cecilia
 */
public class Recorte {
    private static int registrosPorJpg = 8;
    private static int cantDni = 8;
    private static BufferedImage ImagenHuella = null;
    private static BufferedImage ImagenFirma = null;
    private static double umbral1_firma = 0.55;
    private static double umbral2_firma = 0.45;
    private static double umbral1_huella = 0.65;
    private static double umbral2_huella = 0.40;
    private static int registro_aprobado = 1;
    private static int registro_observado = 2;
    private static int registro_rechazado = 3;
    public static String rutaGeneral = "";
    public static String rutaHuella = "";
    public static String rutaFirma = "";

    public static BufferedImage extraerCuadroData(BufferedImage test) {
        BufferedImage cuadro;
        for (int i = 5; i < test.getHeight() / 4; i++) {
            int[] linea = new int[test.getWidth()];
            for (int j = 0; j < test.getWidth(); j++)
                linea[j] = test.getRGB(j, i);
            if (esLineaNegra(linea)) {
                test = test.getSubimage(0, i, test.getWidth(), test.getHeight() - i);
                break;
            }
        }
        for (int i = test.getHeight() - 5; i > test.getHeight() / 2; i--) {
            int[] linea = new int[test.getWidth()];
            for (int j = 0; j < test.getWidth(); j++)
                linea[j] = test.getRGB(j, i);
            if (esLineaNegra(linea)) {
                test = test.getSubimage(0, 0, test.getWidth(), i);
                break;
            }
        }
        for (int i = 5; i < test.getWidth() / 4; i++) {
            int[] linea = new int[test.getHeight()];
            for (int j = 0; j < test.getHeight(); j++)
                linea[j] = test.getRGB(i, j);
            if (esLineaNegra(linea)) {
                test = test.getSubimage(i, 0, test.getWidth() - i, test.getHeight());
                break;
            }
        }
        for (int i = test.getWidth() - 7; i > test.getWidth() / 2; i--) {
            int[] linea = new int[test.getHeight()];
            for (int j = 0; j < test.getHeight(); j++)
                linea[j] = test.getRGB(i, j);
            if (esLineaNegra(linea)) {
                test = test.getSubimage(0, 0, i, test.getHeight());
                break;
            }
        }

        int blancos = 1;
        int fila = 0;
        boolean ant_negra = false;
        while (blancos < 3 && fila < test.getHeight() - 1) {
            int[] linea = new int[test.getWidth()];
            for (int i = 0; i < test.getWidth(); i++)
                linea[i] = test.getRGB(i, fila);
            if (esLineaNegra(linea)) {
                if (!ant_negra)
                    blancos++;
                ant_negra = true;
            } else
                ant_negra = false;
            fila++;
        }
        int nuevoHeight = test.getHeight() - fila;
        cuadro = test.getSubimage(0, fila, test.getWidth(), nuevoHeight);
        return cuadro;
    }

    public static BufferedImage[] extraerRegistros(BufferedImage test) {
        BufferedImage[] resultados = new BufferedImage[registrosPorJpg];
        int alto = test.getHeight() / registrosPorJpg;
        for (int i = 0; i < registrosPorJpg; i++) {
            BufferedImage registro = test.getSubimage(0, i * alto, test.getWidth(), alto);
            resultados[i] = registro;

        }
        return resultados;
    }

    public static BufferedImage[] extraerDni(BufferedImage registro) {
        BufferedImage[] dni = new BufferedImage[cantDni];
        int nuevoX = Math.round(registro.getWidth() * (float) 0.02);
        int ancho = Math.round(registro.getWidth() * (float) 0.1);
        BufferedImage numero1 = registro.getSubimage(nuevoX, 0, ancho, registro.getHeight());
        numero1 = limpiarBordeImagen(numero1, 16, 2);
        int anchoNum = numero1.getWidth() / 8;
        for (int i = 0; i < cantDni; i++) {
            if (i * anchoNum + 1 + anchoNum - 2 > numero1.getWidth())
                anchoNum = numero1.getWidth() - (i * anchoNum + 1) + 2;
            BufferedImage num = numero1.getSubimage(i * anchoNum + 1, 5, anchoNum - 2, numero1.getHeight() - 10);
            num = limpiarBordeImagen(num, 2, 4);
            num = removeNoisePoints(num);
            num = cropper(num);
            dni[i] = num;
            /*
            try {
            ImageIO.write(dni[i], "jpg", new File("C:\\Users\\Cecilia\\Desktop\\numero"+i+".jpg"));
            } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            }*/
        }
        return dni;
    }

    public static BufferedImage extraerHuella(BufferedImage registro) {

        int nuevoX = Math.round(registro.getWidth() * (float) 0.86);
        int ancho = registro.getWidth() - nuevoX;
        BufferedImage huella = registro.getSubimage(nuevoX, 2, ancho, registro.getHeight() - 2);
        huella = limpiarBordeImagen(huella, 16, 2);
        huella = cropper(huella);
        /*
        try {
        ImageIO.write(numero1, "jpg", new File("C:\\Users\\Cecilia\\Desktop\\heulla.jpg"));
        } catch (IOException ex) {
        Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
            */
        return huella;
    }

    public static BufferedImage extraerFirma(BufferedImage registro) {

        int nuevoX = Math.round(registro.getWidth() * (float) 0.71);
        int ancho = Math.round(registro.getWidth() * (float) 0.15);
        BufferedImage firma = registro.getSubimage(nuevoX, 2, ancho, registro.getHeight() - 2);
        firma = limpiarBordeImagen(firma, 16, 2);
        firma = cropper(firma);
        /*
        try {
        ImageIO.write(firma, "jpg", new File("C:\\Users\\Cecilia\\Desktop\\firma.jpg"));
        } catch (IOException ex) {
        Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
          */
        return firma;
    }

    private static boolean esLineaNegra(int[] linea) {
        double porcentaje = 0.7 * linea.length;
        int negros = 0;
        for (int i = 0; i < linea.length; i++)
            if (linea[i] == -16777216)
                negros++;
        if (negros >= porcentaje)
            return true;
        return false;
    }

    private static BufferedImage extraerCuadritos(int iniCuadro, int cantCuadros, BufferedImage registro) {
        int iniX = 0;
        int ancho;
        int cuadrosRecorridos = 0;
        int cuadroInicio = 0;
        int ultimaColumnaRecorrida = iniX;
        for (int i = 20; i < registro.getWidth(); i++) {
            int[] linea = new int[registro.getHeight()];
            for (int j = 0; j < registro.getHeight(); j++) {
                linea[j] = registro.getRGB(i, j);
            }
            //  if(registro.getRGB(i, j)!=-16777216) break;
            if (esLineaNegra(linea)) {
                if (cuadroInicio == iniCuadro) {
                    if (ultimaColumnaRecorrida + 1 != i) {
                        cuadrosRecorridos++;
                        if (cuadrosRecorridos == cantCuadros) {
                            ancho = i - iniX;
                            return registro.getSubimage(iniX, 0, ancho, registro.getHeight());
                        }
                    }
                } else {
                    if (iniX + 1 != i)
                        cuadroInicio++;
                    iniX = i;

                }
                ultimaColumnaRecorrida = i;
            }
            //}
        }
        return null;
    }

    public static BufferedImage extraerDniUnaImagen(BufferedImage registro) {
        BufferedImage dni = extraerCuadritos(1, 8, registro);
        BufferedImage result = new BufferedImage(dni.getWidth(), dni.getHeight() + 40, //work these out
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < result.getHeight(); i++)
            for (int j = 0; j < result.getWidth(); j++)
                result.setRGB(j, i, -1);
        Graphics g = result.getGraphics();
        int alto = result.getHeight();
        int cuadroAnt = -1;
        int iniX = 0;
        int finX = 0;
        for (int i = 0; i < 23; i++) {
            BufferedImage letra = extraerCuadritos(1 + i, 1, registro);
            letra = limpiarBordeImagen(letra, 2, 4);
            letra = removeNoisePoints(letra);
            letra = cropper(letra);
            g.drawImage(letra, i * dni.getWidth() / 8, 20, null);
            if (i == 1)
                alto = letra.getHeight() - 1;
        }
        return result.getSubimage(0, 0, dni.getWidth(), alto + 40);
    }

    private static ArrayList<String> extraerNombre(BufferedImage registro) throws TesseractException {
        //        ImagePlus imp=new ImagePlus("let",registro);
        //             imp.show();
        String nom = "";
        Tesseract instance2 = new Tesseract();
        instance2.setLanguage("abc");
        instance2.setConfigs(Arrays.asList("letters"));
        ArrayList<String> arrNomb = new ArrayList<String>();
        BufferedImage nombre = extraerCuadritos(9 + 25, 23, registro);
        BufferedImage result = new BufferedImage(nombre.getWidth(), nombre.getHeight(), //work these out
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < result.getHeight(); i++)
            for (int j = 0; j < result.getWidth(); j++)
                result.setRGB(j, i, -1);
        Graphics g = result.getGraphics();
        int alto = result.getHeight();
        ArrayList<BufferedImage> nombres = new ArrayList<BufferedImage>();
        int cuadroAnt = -1;
        int iniX = 0;
        int finX = 0;
        for (int i = 0; i < 23; i++) {
            BufferedImage letra = extraerCuadritos(9 + 25 + i, 1, registro);
            letra = limpiarBordeImagen(letra, 2, 4);
            letra = removeNoisePoints(letra);

            if (arrNomb.isEmpty() && i == 0) {
                nom = instance2.doOCR(letra);
                nom = nom.trim();
                nom = nom.replaceAll("\n", "");
                if (nom.compareTo("AH") == 0) {
                    nom = "A";
                }
                if (nom.compareTo("ADH") == 0) {
                    nom = "A";
                }
                if (nom.compareTo("AXH") == 0) {
                    nom = "A";
                }
                if (nom.compareTo("AN") == 0) {
                    nom = "A";
                }
                if (nom.compareTo("MU") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("ZN") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("FXL M") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("KNU") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("D") == 0) {
                    String no2 = "E";
                    arrNomb.add(no2);
                }
                if (nom.compareTo("N") == 0) {
                    String no2 = "D";
                    arrNomb.add(no2);
                }
                arrNomb.add(nom);
            }
            if (esCuadroBlanco(letra) == 0) { //si no es cuadro blanco
                if (cuadroAnt + 1 == i) {
                    iniX = i * nombre.getWidth() / 25;
                    finX = 0;
                }
                finX += nombre.getWidth() / 25;
                letra = cropper(letra);
                nom = instance2.doOCR(letra);
                int lon = arrNomb.size();
                if (i != 0) {
                    for (int k = 0; k < lon; k++) {
                        String nom3 = nom;
                        nom3 = nom3.trim();
                        nom3 = nom3.replaceAll("\n", "");
                        nom3 = nom3.trim();
                        String no = arrNomb.get(k);
                        if (nom3.compareTo("AA") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("AN") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("AM") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("ADH") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("AAH") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("AXH") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("DZF") == 0) {
                            nom3 = "E";
                        }
                        if (nom3.compareTo("FI") == 0) {
                            nom3 = "E";
                        }
                        if (nom3.compareTo("II") == 0) {
                            nom3 = "I";
                        }
                        if (nom3.compareTo("JI") == 0) {
                            nom3 = "I";
                        }
                        if (nom3.compareTo("Aid") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("FU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("AU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("HU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("QI") == 0) {
                            nom3 = "I";
                        }
                        if (nom3.compareTo("AId") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("IL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("DW") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("BL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("NN") == 0) {
                            nom3 = "N";
                        }
                        if (nom3.compareTo("DZ") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("U") == 0) {
                            String no2 = no + "I";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("H") == 0) {
                            String no2 = no + "I";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("P") == 0) {
                            String no2 = no + "D";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("") == 0) {
                            String no2 = no + "I";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("L") == 0) {
                            String no2 = no + "E";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("UL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("N") == 0) {
                            String no2 = no + "D";
                            arrNomb.add(no2);
                            String no3 = no + "A";
                            arrNomb.add(no3);
                        }
                        no += nom3;
                        arrNomb.set(k, no);
                    }
                }
            } else {
                int lon2 = arrNomb.size();
                for (int k = 0; k < lon2; k++) {
                    String no2 = arrNomb.get(k);
                    no2 += " ";
                    arrNomb.set(k, no2);
                }
                if (i > 1 && i != cuadroAnt + 1) {
                    BufferedImage app = result.getSubimage(iniX, 0, finX, alto + 40);
                    nombres.add(app);
                }
                cuadroAnt = i;
            }
            if (i == 1)
                alto = letra.getHeight();
        }
        //        for(int k=0;k<arrNomb.size();k++){
        //            System.out.println(""+arrNomb.get(k));
        //        }
        return arrNomb;
    }

    private static ArrayList<String> extraerApellidos(BufferedImage registro) throws TesseractException {
        //        ImagePlus imp=new ImagePlus("let",registro);
        //             imp.show();
        BufferedImage nombre = extraerCuadritos(9, 25, registro);
        String nom = "";
        Tesseract instance2 = new Tesseract();
        instance2.setLanguage("spa+abc");
        instance2.setConfigs(Arrays.asList("letters"));
        ArrayList<String> arrNomb = new ArrayList<String>();
        BufferedImage result = new BufferedImage(nombre.getWidth(), nombre.getHeight(), //work these out
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < result.getHeight(); i++)
            for (int j = 0; j < result.getWidth(); j++)
                result.setRGB(j, i, -1);
        Graphics g = result.getGraphics();
        int alto = result.getHeight();
        ArrayList<BufferedImage> apellidos = new ArrayList<BufferedImage>();
        int cuadroAnt = -1;
        int iniX = 0;
        int finX = 0;
        for (int i = 0; i < 25; i++) {
            BufferedImage letra = extraerCuadritos(9 + i, 1, registro);
            //            ImagePlus imp=new ImagePlus("let",letra);
            //             imp.show();
            letra = limpiarBordeImagen(letra, 2, 4);
            letra = removeNoisePoints(letra);
            if (arrNomb.isEmpty() && i == 0) {
                nom = instance2.doOCR(letra);
                nom = nom.trim();
                nom = nom.replaceAll("\nH", "");
                nom = nom.replaceAll("\n", "");
                if (nom.compareTo("FNLJ") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("rxu") == 0) {
                    nom = "D";
                }
                if (nom.compareTo("AU") == 0) {
                    nom = "O";
                }
                if (nom.compareTo("V") == 0) {
                    String no2 = "D";
                    arrNomb.add(no2);
                }
                arrNomb.add(nom);
            }
            if (esCuadroBlanco(letra) == 0) { //si no es cuadro blanco
                if (cuadroAnt + 1 == i) {
                    iniX = i * nombre.getWidth() / 25;
                    finX = 0;
                }
                finX += nombre.getWidth() / 25;
                //                ImagePlus imp3=new ImagePlus("let",letra);
                //                imp3.show();
                letra = cropper(letra);
                //                g.drawImage(letra, i*nombre.getWidth()/25, 20, null);
                //                ImagePlus imp2=new ImagePlus("let",letra);
                //                imp2.show();
                int lon = arrNomb.size();
                nom = instance2.doOCR(letra);
                if (i != 0) {
                    for (int k = 0; k < lon; k++) {
                        String nom3 = nom;
                        nom3 = nom3.trim();
                        nom3 = nom3.replaceAll("\nH", "");
                        nom3 = nom3.replaceAll("Ii", "");
                        nom3 = nom3.replaceAll("\n", "");
                        nom3 = nom3.trim();
                        String no = arrNomb.get(k);
                        if (nom3.compareTo("hxx") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("HU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("AId") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("ADH") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("Ala") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("Ax") == 0) {
                            nom3 = "A";
                        }
                        if (nom3.compareTo("ll") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("l") == 0) {
                            nom3 = "I";
                        }
                        if (nom3.compareTo("r") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("rw") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("FI") == 0) {
                            nom3 = "E";
                        }
                        if (nom3.compareTo("CI") == 0) {
                            nom3 = "P";
                        }
                        if (nom3.compareTo("IU") == 0) {
                            nom3 = "I";
                        }
                        if (nom3.compareTo("PU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("nU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("AU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("hU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("HU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("lL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("IL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("fx") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("rwU") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("FU") == 0) {
                            nom3 = "O";
                        }
                        if (nom3.compareTo("NN") == 0) {
                            nom3 = "N";
                        }
                        if (nom3.compareTo("xL") == 0) {
                            nom3 = "L";
                        }
                        if (nom3.compareTo("d") == 0) {
                            nom3 = "J";
                        }
                        if (nom3.compareTo("yxLJ") == 0) {
                            nom3 = "D";
                        }
                        if (nom3.compareTo("U") == 0) {
                            String no2 = no + "I";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("L") == 0) {
                            String no2 = no + "E";
                            arrNomb.add(no2);
                        }
                        if (nom3.compareTo("") == 0) {
                            String no2 = no + "I";
                            arrNomb.add(no2);
                            String no3 = no + "L";
                            arrNomb.add(no3);
                        }
                        if (nom3.compareTo("KL") == 0) {
                            nom3 = "L";
                        }
                        no += nom3;
                        arrNomb.set(k, no);
                        //                            }                            

                    }
                }
            } else {
                int lon2 = arrNomb.size();
                for (int k = 0; k < lon2; k++) {
                    String no2 = arrNomb.get(k);
                    no2 += " ";
                    arrNomb.set(k, no2);
                }
                if (i > 1 && i != cuadroAnt + 1) {
                    BufferedImage app = result.getSubimage(iniX, 0, finX, alto + 40);
                    apellidos.add(app);
                }
                cuadroAnt = i;
            }
            if (i == 1)
                alto = letra.getHeight();
        }
        //        for(int k=0;k<arrNomb.size();k++){
        //            System.out.println(""+arrNomb.get(k));
        //        }
        return arrNomb;
    }

    private static ArrayList<String> extraerNombre2(BufferedImage registro) throws TesseractException {
        //        ImagePlus imp=new ImagePlus("let",registro);
        //             imp.show();
        String nom = "";
        Tesseract instance2 = new Tesseract();
        instance2.setLanguage("abc");
        instance2.setConfigs(Arrays.asList("letters"));
        instance2.setPageSegMode(PSM_SINGLE_CHAR);
        ArrayList<String> arrNomb = new ArrayList<String>();
        BufferedImage nombre = extraerCuadritos(9 + 25, 23, registro);
        if (nombre == null)
            return arrNomb;
        BufferedImage result = new BufferedImage(nombre.getWidth(), nombre.getHeight(), //work these out
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < result.getHeight(); i++)
            for (int j = 0; j < result.getWidth(); j++)
                result.setRGB(j, i, -1);
        Graphics g = result.getGraphics();
        int alto = result.getHeight();
        ArrayList<BufferedImage> nombres = new ArrayList<BufferedImage>();
        int cuadroAnt = -1;
        int iniX = 0;
        int finX = 0;
        for (int i = 0; i < 23; i++) {
            BufferedImage letra = extraerCuadritos(9 + 25 + i, 1, registro);
            letra = limpiarBordeImagen(letra, 2, 4);
            letra = removeNoisePoints(letra);
            if (esCuadroBlanco(letra) == 0) { //si no es cuadro blanco
                if (cuadroAnt + 1 == i) {
                    iniX = i * nombre.getWidth() / 25;
                    finX = 0;
                }
                finX += nombre.getWidth() / 25;
                letra = cropper(letra);
                nom = instance2.doOCR(letra);
                nom = nom.trim();
                nom = nom.replaceAll("\n", "");
                nom = nom.replaceAll(" ", "");
                if (nom == "")
                    nom = "*";
                int lon = arrNomb.size();
                if (i != 0) {
                    for (int k = 0; k < lon; k++) {
                        String no = arrNomb.get(k);
                        no += nom;
                        arrNomb.set(k, no);
                    }
                } else {
                    arrNomb.add(nom);
                }

            } else {
                int lon2 = arrNomb.size();
                for (int k = 0; k < lon2; k++) {
                    String no2 = arrNomb.get(k);
                    no2 += " ";
                    arrNomb.set(k, no2);
                }
                if (i > 1 && i != cuadroAnt + 1) {
                    BufferedImage app = result.getSubimage(iniX, 0, finX, alto + 40);
                    nombres.add(app);
                }
                cuadroAnt = i;
            }
            if (i == 1)
                alto = letra.getHeight();
        }
        //        for(int k=0;k<arrNomb.size();k++){
        //            System.out.println(""+arrNomb.get(k));
        //        }
        return arrNomb;
    }

    private static ArrayList<String> extraerApellidos2(BufferedImage registro) throws TesseractException {
        BufferedImage nombre = extraerCuadritos(9, 25, registro);
        String nom = "";
        Tesseract instance2 = new Tesseract();
        instance2.setLanguage("spa+abc");
        instance2.setConfigs(Arrays.asList("letters"));
        instance2.setPageSegMode(PSM_SINGLE_CHAR);
        ArrayList<String> arrNomb = new ArrayList<String>();
        BufferedImage result = new BufferedImage(nombre.getWidth(), nombre.getHeight(), //work these out
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < result.getHeight(); i++)
            for (int j = 0; j < result.getWidth(); j++)
                result.setRGB(j, i, -1);
        Graphics g = result.getGraphics();
        int alto = result.getHeight();
        ArrayList<BufferedImage> apellidos = new ArrayList<BufferedImage>();
        int cuadroAnt = -1;
        int iniX = 0;
        int finX = 0;
        for (int i = 0; i < 25; i++) {
            BufferedImage letra = extraerCuadritos(9 + i, 1, registro);
            //            ImagePlus imp=new ImagePlus("let",letra);
            //             imp.show();
            letra = limpiarBordeImagen(letra, 2, 4);
            letra = removeNoisePoints(letra);
            if (esCuadroBlanco(letra) == 0) { //si no es cuadro blanco
                if (cuadroAnt + 1 == i) {
                    iniX = i * nombre.getWidth() / 25;
                    finX = 0;
                }
                finX += nombre.getWidth() / 25;
                //                ImagePlus imp3=new ImagePlus("let",letra);
                //                imp3.show();
                letra = cropper(letra);
                //                g.drawImage(letra, i*nombre.getWidth()/25, 20, null);
                //                ImagePlus imp2=new ImagePlus("let",letra);
                //                imp2.show();

                nom = instance2.doOCR(letra);
                nom = nom.trim();
                nom = nom.replaceAll("\n", "");
                nom = nom.replaceAll(" ", "");
                if (nom == "")
                    nom = "*";
                int lon = arrNomb.size();
                if (i != 0) {
                    for (int k = 0; k < lon; k++) {
                        String no = arrNomb.get(k);
                        no += nom;
                        arrNomb.set(k, no);
                    }
                } else {
                    arrNomb.add(nom);
                }
            } else {
                int lon2 = arrNomb.size();
                for (int k = 0; k < lon2; k++) {
                    String no2 = arrNomb.get(k);
                    no2 += " ";
                    arrNomb.set(k, no2);
                }
                if (i > 1 && i != cuadroAnt + 1) {
                    BufferedImage app = result.getSubimage(iniX, 0, finX, alto + 40);
                    apellidos.add(app);
                }
                cuadroAnt = i;
            }
            if (i == 1)
                alto = letra.getHeight();
        }
        //        for(int k=0;k<arrNomb.size();k++){
        //            System.out.println(""+arrNomb.get(k));
        //        }
        return arrNomb;
    }

    private static int esCuadroBlanco(BufferedImage cuadro) {
        cuadro = limpiarBordeImagen(cuadro, 2, 4);
        cuadro = removeNoisePoints(cuadro);
        for (int i = 0; i < cuadro.getWidth(); i++)
            for (int j = 0; j < cuadro.getHeight(); j++) {
                if (cuadro.getRGB(i, j) == -16777216)
                    return 0;
            }
        return 1;
    }

    private static int validarAprobacion(double p_firma, double p_huella) {
        // 1 = aprobado, 2= observado, 3=rechazado
        boolean nombre_coincide = true;
        boolean firma_valida = p_firma >= umbral1_firma;
        boolean firma_observada = p_firma < umbral1_firma && p_firma >= umbral2_firma;
        boolean firma_rechazada = p_firma < umbral2_firma;
        boolean huella_valida = p_huella >= umbral1_huella;
        boolean huella_observada = p_huella < umbral1_huella && p_huella >= umbral2_huella;
        boolean huella_rechazada = p_huella < umbral2_huella;
        if (firma_valida && huella_valida)
            return registro_aprobado;

        if (firma_valida && huella_observada)
            return registro_aprobado;
        if (firma_observada && huella_valida)
            return registro_aprobado;
        if (firma_observada && huella_observada)
            return registro_observado;
        if (nombre_coincide && firma_rechazada && huella_valida)
            return registro_observado;
        if (nombre_coincide && firma_valida && huella_rechazada)
            return registro_observado;
        else
            return registro_rechazado;

    }

    public static int ejecutar(File file, ArrayList<Adherente> listaAdherente, PartidoPolitico partido)
            throws TesseractException {
        //validar que exista excel rnv
        if (!Utils.validarRutaGeneral("" + rutaGeneral)) {
            JOptionPane.showMessageDialog(null, "No se encontr archivo excel del RNV. Configurar ruta.");
            return -1;
        }
        int cant = Utils.cumpleFormatoExcelRNV(rutaGeneral);
        if (cant == -1) {
            JOptionPane.showMessageDialog(null, "Error: El archivo Excel no cumple con el formato deseado.");
            return -1;
        }
        //validar que existan huellas jpg
        //validar que existan firmas jpg
        if (!Utils.validarRutaImagenHuella(rutaHuella, cant)) {
            JOptionPane.showMessageDialog(null, "Error en el directorio de huellas. Revisar configuracin.");
            return -1;
        }
        if (!Utils.validarRutaImagenHuella(rutaFirma, cant)) {
            JOptionPane.showMessageDialog(null, "Error en el directorio de firmas. Revisar configuracin.");
            return -1;
        }
        //validar formato del jpg
        BufferedImage test;
        String numero2;
        int inicioX, inicioY, finX, finY;
        try {
            test = ImageIO.read(file);
            //            test = Algoritmo_Huellas.readImage(file);
            //validar formato imagen
            //            test = binarization(test);
            ImagePlus imp = new ImagePlus("Nuevo", test);
            IJ.run(imp, "Make Binary", "");
            test = (BufferedImage) imp.getImage();
            int valido = Utils.validarPlanillon(test);
            if (valido == -1)
                return -2;
            //Configuracion del Algoritmo OCR digitos
            ITesseract instance = new Tesseract();
            ArrayList<String> p = new ArrayList<>();
            p.add("digits");
            instance.setConfigs(p);
            instance.setLanguage("digitosf");
            instance.setPageSegMode(PSM_SINGLE_CHAR);

            test = extraerCuadroData(test);
            BufferedImage[] registros = extraerRegistros(test);
            //lista de prueba

            String numero;
            for (int i = 0; i < registros.length; i++) {
                int ancho = Math.round(registros[i].getWidth() * (float) 0.02);

                BufferedImage[] dni = extraerDni(registros[i]);
                numero = "";
                for (int k = 0; k < dni.length; k++) {

                    try {

                        String dig = instance.doOCR(dni[k]);
                        dig = dig.trim();
                        //                    numero += dig;
                        if (!dig.isEmpty())
                            numero += dig.charAt(0);
                        else
                            numero += "0"; // Los digitos no identificados  le coloca cero por defecto

                    } catch (TesseractException ex) {
                        Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

                if (numero.compareTo("00000000") != 0) {
                    ArrayList<String> lstDni = buscarDni(numero);
                    //                for(int k=0;k<lstDni.size();k++){
                    //                    System.out.println(lstDni.get(k));
                    //                }                    
                    //                System.out.println("");
                    //                System.out.println("");
                    ArrayList<String> nombres2 = new ArrayList<String>();
                    nombres2 = extraerNombre2(registros[i]);
                    String nombre = "";
                    if (!nombres2.isEmpty())
                        nombre = nombres2.get(0);
                    ////                ImagePlus imp=new ImagePlus("let",nombres.get(0));
                    ////                imp.show();        
                    ArrayList<String> apellidos2 = new ArrayList<String>();
                    apellidos2 = extraerApellidos2(registros[i]);
                    String apellido = "";
                    if (!apellidos2.isEmpty())
                        apellido = apellidos2.get(0);

                    //                //Configuracion del OCR de Letras
                    //                Tesseract instance2 = new Tesseract();
                    //                instance2.setLanguage("spa");
                    //                String nombre = "";
                    //                String apell = "";
                    //                String ap;
                    //                
                    ArrayList<String> nombresE = new ArrayList<String>();
                    if (nombre != "")
                        nombresE = RevisaNombre2(nombre);
                    //                for(int k=0;k<nombresE.size();k++){
                    //                    System.out.println("N: "+nombresE.get(k));
                    //                }      
                    System.out.println("");
                    ArrayList<String> apellidosE = new ArrayList<String>();
                    if (apellido != "")
                        apellidosE = RevisaApellido2(apellido);
                    //                for(int k=0;k<apellidosE.size();k++){
                    //                    System.out.println("A: "+apellidosE.get(k));
                    //                }
                    numero2 = SeleccionaDni(lstDni, nombresE, apellidosE);
                } else
                    numero2 = numero;
                System.out.println(numero2);
                //                ArrayList<String> lDniOcrL=new ArrayList<String>();
                //                ArrayList<String> lDniOcrLP=new ArrayList<String>();
                //                lDniOcrL=nombresE;
                //                for(int k=0;k<apellidosE.size();k++){
                //                    if(!lDniOcrL.contains(apellidosE.get(k))){
                //                        lDniOcrL.add(apellidosE.get(k));
                //                    }
                //                    else{
                //                        lDniOcrLP.add(apellidosE.get(k));
                //                    }
                //                }
                //                if(lDniOcrLP.size()==0)lDniOcrLP=lDniOcrL;
                ////                for(int k=0;k<lDniOcrLP.size();k++){
                ////                    System.out.println(lDniOcrLP.get(k));
                ////                }
                //                String numero2="";
                //                if(lDniOcrLP.size()>0){
                //                    numero2=lDniOcrLP.get(0);
                //                    System.out.println(numero2);
                int ubigeo = 0;
                if (partido.getIdTipoProceso() == 1)
                    ubigeo = -1;
                if (partido.getIdTipoProceso() == 2)
                    ubigeo = Manager.queryByIdRegion(partido.getIdRegion()).getUbigeo();
                if (partido.getIdTipoProceso() == 3)
                    ubigeo = Manager.queryByIdDistrito(partido.getIdDistrito()).getUbigeo();
                if (partido.getIdTipoProceso() == 4)
                    ubigeo = Manager.queryLocalById(partido.getIdLocal()).getUbigeo();
                if (partido.getIdTipoProceso() == 5)
                    ubigeo = Manager.queryInstitucionById(partido.getIdInstitucion()).getUbigeo();
                int ubigeoPadron = -1;
                if (ubigeo != -1)
                    ubigeoPadron = buscarUbigeo(numero2);
                if (ubigeo == -1 || ubigeo == ubigeoPadron) {
                    System.out.println("  Ubigeo Correcto");
                    BufferedImage ImagenPadronHuella = extraerHuella(registros[i]);
                    BufferedImage ImagenPadronFirma = extraerFirma(registros[i]);
                    //Imagenes del repositorio
                    ImagenHuella = null;
                    ImagenFirma = null;
                    buscarImagenes(numero2);//modifica la imagen huella y imagen firma
                    //               if(ImagenHuella==null && ImagenFirma==null)buscarImagenes(numero2);
                    double porcentaje_firma, porcentaje_huella;
                    int esta = 0;
                    if (ImagenHuella != null && ImagenFirma != null) {
                        porcentaje_firma = Algoritmo_Firma2.validarFirma(ImagenFirma, ImagenPadronFirma);
                        porcentaje_huella = Algoritmo_Huellas.VerificaHuella(ImagenHuella, ImagenPadronHuella);//No se para que ramon utiliza esta variable
                        int criterio = validarAprobacion(porcentaje_firma, porcentaje_huella);
                        System.out.println("");

                        if (criterio != registro_rechazado) {
                            Adherente adherente = new Adherente();
                            adherente.setDni(numero2);
                            if (criterio == registro_aprobado)
                                adherente.setEstado("Aprobado");
                            if (criterio == registro_observado)
                                adherente.setEstado("Observado");

                            for (int w = 0; w < listaAdherente.size(); w++) {
                                if (listaAdherente.get(w).getDni().equals(numero2)) {
                                    esta = 1;
                                    break;
                                }
                            }
                            if (esta == 0)
                                listaAdherente.add(adherente);
                        }

                    } else
                        System.out.println("No se encontro a las personas con DNI: " + numero2);
                }
                //                }
                //                else{
                //                    System.out.println("No se encontro el DNI: ");
                //                }
            }

        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
        return 1;
    }

    public static void main(String[] args) throws TesseractException {
        // TODO code application logic here
        //File file = new File("C:\\Users\\alulab14.INF\\Downloads\\alternado_ok_rayado_v1.jpg");
        File file = new File("D:\\Users\\Cecilia\\Downloads/fallo.jpg");
        BufferedImage test;
        int inicioX, inicioY, finX, finY;
        String nombre2 = "";
        ITesseract instance = new Tesseract();
        ArrayList<String> p = new ArrayList<>();
        p.add("digits");
        instance.setConfigs(p);
        instance.setLanguage("dit");

        try {
            test = ImageIO.read(file);
            test = binarization(test);
            int valido = Utils.validarPlanillon(test);
            if (valido == -1)
                return;
            System.out.println("llego");
            //ImageIO.write(test, "jpg", new File("C:\\Users\\alulab14\\Downloads\\bin.jpg"));
            test = extraerCuadroData(test);
            ImageIO.write(test, "jpg", new File("D:\\Users\\Cecilia\\Downloads/tod.jpg"));
            BufferedImage[] registros = extraerRegistros(test);
            int ancho = Math.round(registros[0].getWidth() * (float) 0.02);
            BufferedImage numero1 = test.getSubimage(0, 0, ancho, registros[0].getHeight());
            //          BufferedImage[] dni = extraerDni(registros[0]);
            //       extraerFirma(registros[0]);
            String numero;
            for (int k = 0; k < registros.length; k++) {

                BufferedImage dniComp = extraerDniUnaImagen(registros[k]);
                ImageIO.write(dniComp, "jpg", new File("D:\\Users\\Cecilia\\Downloads/tod" + k + ".jpg"));
                //                ArrayList<BufferedImage> nombres = extraerNombre(registros[k]);
                String nombre = "";
                String identidad = "";
                nombre2 = "";
                BufferedImage[] dni = extraerDni(registros[k]);
                // ImageIO.write(dniComp, "png", new File("src\\red\\dni.png"));

                // for(int i = 0 ; i < dni.length ; i++){

                numero = "";
                for (int i = 0; i < dni.length; i++) {

                    try {
                        String dig = instance.doOCR(dni[i]);
                        dig = dig.trim();
                        if (!dig.isEmpty())
                            numero += dig.charAt(0);
                        else
                            numero += "*";

                    } catch (TesseractException ex) {
                        Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
                System.out.println(numero);

                int valo = 0;

                Tesseract instance2 = new Tesseract();
                instance2.setLanguage("spa");

                //                for(int i=0;i<nombres.size();i++){
                //                    try {                        
                //                      
                //                        nombre2 += instance2.doOCR(nombres.get(i));
                //                    } catch (Exception ex) {
                //                        Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
                //                    }
                //                }
            }
            System.out.println(nombre2);

            /*
             BufferedImage[] dnixx = extraerDni(registros[k]);
            //BufferedImage huella = extraerHuella(registros[i]);
            String numS=new String();//DNI en string
                
            for(int j=0;j<cantDni;j++){
                int num = OcrNumeros.obtenerNumero(dnixx[j]);
                     
                numS+=num;
            }
                
                
                
            identidad = executeTesseractNumbers("dni.png");
                
                
            identidad  = identidad.trim();
            identidad  = identidad.substring(0, 7);
                
            char[] mmm = identidad.toCharArray();
            char[] nnn = numS.toCharArray();
            for(int i = 0 ;  i < identidad.length(); i++){
                    
                if (mmm[i] != nnn[i]) mmm[i] = nnn[i];
                
                    
                
            }
                
            identidad = String.valueOf(mmm);
                
            System.out.println("el dni es:" + identidad +" y el nombre es: "+nombre+" con cantidad i: "+nombres.size());
            */ //  }
            /*
              for(int i=0;i<cantDni;i++){
            int num = OcrNumeros.obtenerNumero(dni[i]);
            //System.out.println("numero: "+num);
              }*/
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // }

    private static ArrayList<String> buscarDni(String dni) {
        String dn = null;
        ArrayList<String> lstDni = new ArrayList<String>();
        double d = -1;
        int nd = Integer.parseInt(dni);
        int ubigeo = 0, max = 0;
        try {
            //                InputStream ExcelFileToRead = new FileInputStream("C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/registro.nacional.v.1.xlsx");
            InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
            XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            Iterator rows = sheet.rowIterator();
            row = (XSSFRow) rows.next();
            while (rows.hasNext()) {
                row = (XSSFRow) rows.next();
                Iterator cells = row.cellIterator();
                int i = 0;
                while (cells.hasNext()) {
                    cell = (XSSFCell) cells.next();
                    if (i == 2) {
                        d = cell.getNumericCellValue();
                        int num = (int) d;
                        dn = num + "";
                        int v = comparaString(dn, dni);
                        if (v > max) {
                            lstDni = new ArrayList<String>();
                            lstDni.add(dn);
                            max = v;
                        } else if (v == max) {
                            lstDni.add(dn);
                        }
                        break;
                    }
                    i++;

                }
                i = 0;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lstDni;
    }

    private static int comparaString(String dn, String dni) {
        int mat = 0;
        for (int i = 0; i < dni.length(); i++) {
            char c = dni.charAt(i);
            char d;
            if (dn.length() > i)
                d = dn.charAt(i);
            else
                break;
            if (d == c)
                mat++;
        }
        return mat;
    }

    private static int buscarUbigeo(String dni) {
        String dn = null;
        double d = -1;
        int ubigeo = 0;
        if (tryParseInt(dni)) {
            int nd = Integer.parseInt(dni);
            try {
                //                InputStream ExcelFileToRead = new FileInputStream("C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/registro.nacional.v.1.xlsx");
                InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
                XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
                XSSFSheet sheet = wb.getSheetAt(0);
                XSSFRow row;
                XSSFCell cell;
                Iterator rows = sheet.rowIterator();
                row = (XSSFRow) rows.next();
                while (rows.hasNext()) {
                    row = (XSSFRow) rows.next();
                    Iterator cells = row.cellIterator();
                    int i = 0;
                    while (cells.hasNext()) {
                        cell = (XSSFCell) cells.next();
                        if (i == 2) {
                            d = cell.getNumericCellValue();
                            int num = (int) d;
                            dn = num + "";
                        }
                        if (dn != null) {
                            if (d == nd) {
                                if (i == 3) {
                                    double dh = cell.getNumericCellValue();
                                    ubigeo = (int) dh;
                                    return ubigeo;
                                }
                            }
                        }
                        i++;
                    }
                    i = 0;
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return ubigeo;
    }

    private static ArrayList<String> RevisaNombre2(String nombre) {
        ArrayList<String> nombresE = new ArrayList<String>();
        ArrayList<String> dniE = new ArrayList<String>();
        int gd = 0;
        int max = 0;
        try {
            //InputStream ExcelFileToRead = new FileInputStream("D:/repositorio/GRUPO02/b.rnv.xlsx");
            InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
            XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            Iterator rows = sheet.rowIterator();
            row = (XSSFRow) rows.next();
            while (rows.hasNext()) {
                gd = 0;
                row = (XSSFRow) rows.next();
                Iterator cells = row.cellIterator();
                int i = 0;
                int v = 0;
                while (cells.hasNext()) {
                    cell = (XSSFCell) cells.next();
                    if (i == 0) {
                        String dh = cell.getStringCellValue();
                        v = comparaString(dh, nombre);
                    }
                    if (i == 2) {
                        double d2 = cell.getNumericCellValue();
                        int num = (int) d2;
                        String dn = num + "";
                        if (v > max) {
                            dniE = new ArrayList<String>();
                            dniE.add(dn);
                            max = v;
                        } else if (v == max) {
                            dniE.add(dn);
                        }
                        break;
                    }
                    i++;
                }
                i = 0;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dniE;
    }

    private static ArrayList<String> RevisaApellido2(String apellido) {
        ArrayList<String> nombresE = new ArrayList<String>();
        ArrayList<String> dniE = new ArrayList<String>();
        int gd = 0;
        int max = 0;
        try {
            //InputStream ExcelFileToRead = new FileInputStream("D:/repositorio/GRUPO02/b.rnv.xlsx");
            InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
            XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            Iterator rows = sheet.rowIterator();
            row = (XSSFRow) rows.next();
            while (rows.hasNext()) {
                gd = 0;
                row = (XSSFRow) rows.next();
                Iterator cells = row.cellIterator();
                int i = 0;
                int v = 0;
                while (cells.hasNext()) {
                    cell = (XSSFCell) cells.next();
                    if (i == 1) {
                        String dh = cell.getStringCellValue();
                        v = comparaString(dh, apellido);
                    }
                    if (i == 2) {
                        double d2 = cell.getNumericCellValue();
                        int num = (int) d2;
                        String dn = num + "";
                        if (v > max) {
                            dniE = new ArrayList<String>();
                            dniE.add(dn);
                            max = v;
                        } else if (v == max) {
                            dniE.add(dn);
                        }
                        break;
                    }
                    i++;
                }
                i = 0;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dniE;
    }

    private static String SeleccionaDni(ArrayList<String> l1, ArrayList<String> l2, ArrayList<String> l3) {
        String dni = "";
        if (l1.size() >= l2.size() && l1.size() >= l3.size()) {
            for (int i = 0; i < l1.size(); i++) {
                if (l2.contains(l1.get(i)) && l3.contains(l1.get(i))) {
                    dni = l1.get(i);
                    break;
                }
            }
            if (dni != "")
                return dni;
        }
        if (l2.size() >= l1.size() && l2.size() >= l3.size()) {
            for (int i = 0; i < l2.size(); i++) {
                if (l1.contains(l2.get(i)) && l3.contains(l2.get(i))) {
                    dni = l2.get(i);
                    break;
                }
            }
            if (dni != "")
                return dni;
        }
        if (l3.size() >= l1.size() && l3.size() >= l2.size()) {
            for (int i = 0; i < l3.size(); i++) {
                if (l1.contains(l3.get(i)) && l2.contains(l3.get(i))) {
                    dni = l3.get(i);
                    break;
                }
            }
            if (dni != "")
                return dni;
        }
        if (l1.size() == 1) {
            dni = l1.get(0);
            if (dni != "")
                return dni;
        }
        if (l2.size() == 1) {
            dni = l2.get(0);
            if (dni != "")
                return dni;
        }
        if (l3.size() == 1) {
            dni = l3.get(0);
            if (dni != "")
                return dni;
        }
        return dni;
    }

    private static ArrayList<String> RevisaNombre(ArrayList<String> arrNomb) {
        ArrayList<String> nombresE = new ArrayList<String>();
        ArrayList<String> dniE = new ArrayList<String>();
        int gd = 0;
        try {
            //InputStream ExcelFileToRead = new FileInputStream("D:/repositorio/GRUPO02/b.rnv.xlsx");
            InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
            XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            Iterator rows = sheet.rowIterator();
            row = (XSSFRow) rows.next();
            while (rows.hasNext()) {
                gd = 0;
                row = (XSSFRow) rows.next();
                Iterator cells = row.cellIterator();
                int i = 0;
                while (cells.hasNext()) {
                    cell = (XSSFCell) cells.next();
                    if (i == 0) {
                        String dh = cell.getStringCellValue();
                        dh = dh.toUpperCase();
                        for (int j = 0; j < arrNomb.size(); j++) {
                            String nom = arrNomb.get(j).toUpperCase().trim();
                            if (nom.compareTo(dh) == 0) {
                                nombresE.add(dh);
                                gd = 1;
                            }
                        }
                        if (gd != 1)
                            break;
                    }
                    if (i == 2 && gd == 1) {
                        double d2 = cell.getNumericCellValue();
                        int num = (int) d2;
                        String dn = num + "";
                        dniE.add(dn);
                        break;
                    }
                    i++;
                }
                i = 0;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dniE;
    }

    private static ArrayList<String> RevisaApellido(ArrayList<String> arrNomb) {
        ArrayList<String> nombresE = new ArrayList<String>();
        ArrayList<String> dniE = new ArrayList<String>();
        int gd = 0;
        try {
            //InputStream ExcelFileToRead = new FileInputStream("D:/repositorio/GRUPO02/b.rnv.xlsx");
            InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
            XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            Iterator rows = sheet.rowIterator();
            row = (XSSFRow) rows.next();
            while (rows.hasNext()) {
                gd = 0;
                row = (XSSFRow) rows.next();
                Iterator cells = row.cellIterator();
                int i = 0;
                while (cells.hasNext()) {
                    cell = (XSSFCell) cells.next();
                    if (i == 1) {
                        String dh = cell.getStringCellValue();
                        dh = dh.toUpperCase();
                        for (int j = 0; j < arrNomb.size(); j++) {
                            String nom = arrNomb.get(j).toUpperCase().trim();
                            if (nom.compareTo(dh) == 0) {
                                nombresE.add(dh);
                                gd = 1;
                            }
                        }
                        if (gd != 1)
                            break;
                    }
                    if (i == 2 && gd == 1) {
                        double d2 = cell.getNumericCellValue();
                        int num = (int) d2;
                        String dn = num + "";
                        dniE.add(dn);
                        break;
                    }
                    i++;
                }
                i = 0;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dniE;
    }

    private static void buscarImagenes(String dni) {
        ImagenHuella = null;
        ImagenFirma = null;
        String dn = null;
        double d = -1;
        if (tryParseInt(dni)) {
            int nd = Integer.parseInt(dni);
            try {
                //                InputStream ExcelFileToRead = new FileInputStream("C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/registro.nacional.v.1.xlsx");
                InputStream ExcelFileToRead = new FileInputStream(Recorte.rutaGeneral);
                XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
                XSSFSheet sheet = wb.getSheetAt(0);
                XSSFRow row;
                XSSFCell cell;
                Iterator rows = sheet.rowIterator();
                row = (XSSFRow) rows.next();
                int salir = 0;

                while (rows.hasNext()) {
                    row = (XSSFRow) rows.next();
                    Iterator cells = row.cellIterator();
                    int i = 0;
                    while (cells.hasNext()) {
                        cell = (XSSFCell) cells.next();
                        if (i == 2) {
                            d = cell.getNumericCellValue();
                            int num = (int) d;
                            dn = num + "";
                            //                                    System.out.print("dni: "+num+" ");
                        }
                        if (dn != null) {
                            if (d == nd) {

                                if (i == 4) {
                                    String dh = cell.getStringCellValue();
                                    String dr = null;
                                    dr = Recorte.rutaHuella + "/" + dh + ".jpg";
                                    //                                            dr=Recorte.rutaHuella+"/"+dh;
                                    File file = new File(dr);
                                    if (!file.exists()) {
                                        dr = Recorte.rutaHuella + "/" + dh + ".png";
                                        file = new File(dr);
                                        if (!file.exists()) {
                                            dr = Recorte.rutaHuella + "/" + dh + ".jpg.png";
                                            file = new File(dr);
                                        }
                                        ImagenHuella = ImageIO.read(file);
                                    } else {
                                        ImagenHuella = Algoritmo_Huellas.readImage(file);
                                    }
                                    //                                            ImagenHuella= ImageIO.read(file);

                                    salir = 1;
                                }

                                /*
                                if(i==4){
                                    double dh=cell.getNumericCellValue();
                                    int num=(int) dh;
                                    String dr=null;
                                    if(num<10){
                                //                                                dr="C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/huellas.jpg/00"+num+".jpg";
                                        dr=Recorte.rutaHuella+"/00"+num+".jpg";
                                    } 
                                    else
                                    if(num>9 && num<100){
                                //                                                dr="C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/huellas.jpg/0"+num+".jpg";
                                        dr=Recorte.rutaHuella+"/0"+num+".jpg";
                                    }
                                    else{
                                        System.out.println("c");
                                //                                                dr="C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/huellas.jpg/"+num+".jpg";
                                        dr=Recorte.rutaHuella+"/"+num+".jpg";
                                    }
                                    File file = new File(dr);
                                    ImagenHuella= ImageIO.read(file);
                                        
                                //                                            cell=(XSSFCell) cells.next();
                                //                                            i++;
                                }*/
                                if (i == 5) {
                                    String dh = cell.getStringCellValue();
                                    String dr = null;
                                    //                                            dr="C:/Users/Raul/Desktop/inf226.2016.1._06.proyecto/firmas.jpg/"+dh+".jpg";
                                    dr = Recorte.rutaFirma + "/" + dh + ".jpg";
                                    //                                            dr=Recorte.rutaFirma+"/"+dh;
                                    File file = new File(dr);
                                    if (!file.exists()) {
                                        dr = Recorte.rutaFirma + "/" + dh + ".png";
                                        file = new File(dr);
                                        if (!file.exists()) {
                                            dr = Recorte.rutaFirma + "/" + dh + ".jpg.png";
                                            file = new File(dr);
                                        }
                                        ImagenFirma = ImageIO.read(file);
                                    } else {
                                        ImagenFirma = Algoritmo_Huellas.readImage(file);
                                    }

                                    //                                            ImagenFirma= ImageIO.read(file);
                                    salir = 1;

                                }
                            }
                        }
                        i++;
                    }
                    i = 0;
                    if (salir == 1)
                        break;
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Recorte.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static boolean tryParseInt(String value) {
        try {
            Integer.parseInt(value);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}