Gerador Validador CPF CNPJ

Pessoar…

Fiz um gerador/validador de CPF/CNPJ em Java 5. Como é uma ferramenta útil estou disponibilizando aqui para geração de dados de teste e pra quem quiser estudar os algoritmos…

Está em anexo na forma de jar auto-executável e contém o código-fonte.

Colocarei o código-fonte também abaixo pra quem quiser ver.

Já avisando que por se tratar de algo simples coloquei tudo em uma classe, com inner classes, e não fiquei me preocupando com otimização, refatoração e reutilização… é só uma coisa simples e rápida, que funciona direitinho (até onde eu testei)…

[code]import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar.Separator;
import javax.swing.text.JTextComponent;

public class Janela extends JFrame {

private static final long serialVersionUID = 1L;

private final Pattern NAO_NUMEROS = Pattern.compile("[^0-9]*");
private final Dimension TAMANHO_CAMPO = new Dimension(150, 20);
private final Dimension TAMANHO_BOTAO = new Dimension(80, 20);
private final String TEXTO_SORTEAR = "Sortear";
private final String TEXTO_GERAR = "Gerar";
private final String TEXTO_VALIDAR = "Validar";
private final String TEXTO_CPF_INVALIDO = "O CPF fornecido é inválido";
private final String TEXTO_CPF_VALIDO = "O CPF fornecido é válido";
private final String TEXTO_CNPJ_INVALIDO = "O CNPJ fornecido é inválido";
private final String TEXTO_CNPJ_VALIDO = "O CNPJ fornecido é válido";

private JTextField campoCPF; // dígitos iniciais CPF
private JButton botaoGerarCampoCPF; // gera dígitos iniciais CPF
private JTextField campoVerificadorCPF; // dígitos verificadores CPF
private JButton botaoGerarCampoVerificadorCPF; // gera dígitos verificadores CPF
private JTextField campoCpfGerado; // Campo com o CPF completo montado
private JButton botaoValidarCPF; // gera dígitos verificadores CPF

private JTextField campoCNPJ; // dígitos iniciais CNPJ
private JButton botaoGerarCampoCNPJ; // gera dígitos iniciais CNPJ
private JTextField campoVerificadorCNPJ; // dígitos verificadores CNPJ
private JButton botaoGerarCampoVerificadorCNPJ; // gera dígitos verificadores CNPJ
private JTextField campoCnpjGerado; // Campo com o CNPJ completo montado
private JButton botaoValidarCNPJ; // gera dígitos verificadores CNPJ

public Janela() {
	super("Gera CPF CNPJ");
	montaJanela();
}

private void montaJanela() {
	FlowLayout layoutHoriz = new FlowLayout();
	layoutHoriz.setAlignment(FlowLayout.LEFT);
	
	JPanel painelCpf = new JPanel();
	painelCpf.setLayout(new BorderLayout());
	
	JPanel painel01 = new JPanel();
	painel01.setLayout(layoutHoriz);
	campoCPF = new JTextField();
	campoCPF.setPreferredSize(TAMANHO_CAMPO);
	campoCPF.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCPF, 9);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCPF, 9);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCPF, 9);
		}
	});
	botaoGerarCampoCPF = new JButton(TEXTO_SORTEAR);
	botaoGerarCampoCPF.setPreferredSize(TAMANHO_BOTAO);
	botaoGerarCampoCPF.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.geraDigitosCPF();
		}
	});
	painel01.add(botaoGerarCampoCPF);
	painel01.add(campoCPF);
	painel01.add(new JLabel("9 dígitos CPF"));
	painelCpf.add(painel01, BorderLayout.NORTH);
	
	JPanel painel02 = new JPanel();
	painel02.setLayout(layoutHoriz);
	campoVerificadorCPF = new JTextField();
	campoVerificadorCPF.setPreferredSize(TAMANHO_CAMPO);
	campoVerificadorCPF.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCPF, 2);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCPF, 2);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCPF, 2);
		}
	});
	botaoGerarCampoVerificadorCPF = new JButton(TEXTO_GERAR);
	botaoGerarCampoVerificadorCPF.setPreferredSize(TAMANHO_BOTAO);
	botaoGerarCampoVerificadorCPF.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.geraDvCPF();
		}
	});
	painel02.add(botaoGerarCampoVerificadorCPF);
	painel02.add(campoVerificadorCPF);
	painel02.add(new JLabel("2 dígitos DV CPF"));
	painelCpf.add(painel02, BorderLayout.CENTER);
	
	JPanel painel03 = new JPanel();
	painel03.setLayout(layoutHoriz);
	campoCpfGerado = new JTextField();
	campoCpfGerado.setPreferredSize(TAMANHO_CAMPO);
	campoCpfGerado.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCpfGerado, 11);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCpfGerado, 11);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCpfGerado, 11);
		}
	});
	botaoValidarCPF = new JButton(TEXTO_VALIDAR);
	botaoValidarCPF.setPreferredSize(TAMANHO_BOTAO);
	botaoValidarCPF.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.validaCPF();
		}
	});
	painel03.add(botaoValidarCPF);
	painel03.add(campoCpfGerado);
	painel03.add(new JLabel("CPF gerado"));
	painelCpf.add(painel03, BorderLayout.SOUTH);
	
	this.add(painelCpf, BorderLayout.NORTH);
	
	Separator separador = new Separator();
	separador.setBorder(BorderFactory.createRaisedBevelBorder());
	this.add(separador, BorderLayout.CENTER);
	
	JPanel painelCnpj = new JPanel();
	painelCnpj.setLayout(new BorderLayout());
	
	JPanel painel04 = new JPanel();
	painel04.setLayout(layoutHoriz);
	botaoGerarCampoCNPJ = new JButton(TEXTO_SORTEAR);
	botaoGerarCampoCNPJ.setPreferredSize(TAMANHO_BOTAO);
	botaoGerarCampoCNPJ.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.geraDigitosCNPJ();
		}
	});
	painel04.add(botaoGerarCampoCNPJ);
	campoCNPJ = new JTextField();
	campoCNPJ.setPreferredSize(TAMANHO_CAMPO);
	campoCNPJ.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCNPJ, 12);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCNPJ, 12);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCNPJ, 12);
		}
	});
	painel04.add(campoCNPJ);
	painel04.add(new JLabel("12 dígitos CNPJ"));
	painelCnpj.add(painel04, BorderLayout.NORTH);
	
	JPanel painel05 = new JPanel();
	painel05.setLayout(layoutHoriz);
	botaoGerarCampoVerificadorCNPJ = new JButton(TEXTO_GERAR);
	botaoGerarCampoVerificadorCNPJ.setPreferredSize(TAMANHO_BOTAO);
	botaoGerarCampoVerificadorCNPJ.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.geraDvCNPJ();
		}
	});
	painel05.add(botaoGerarCampoVerificadorCNPJ);
	campoVerificadorCNPJ = new JTextField();
	campoVerificadorCNPJ.setPreferredSize(TAMANHO_CAMPO);
	campoVerificadorCNPJ.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
		}
	});
	painel05.add(campoVerificadorCNPJ);
	painel05.add(new JLabel("2 dígitos DV CNPJ"));
	painelCnpj.add(painel05, BorderLayout.CENTER);
	
	JPanel painel06 = new JPanel();
	painel06.setLayout(layoutHoriz);
	botaoValidarCNPJ = new JButton(TEXTO_VALIDAR);
	botaoValidarCNPJ.setPreferredSize(TAMANHO_BOTAO);
	botaoValidarCNPJ.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent evt) {
			Janela.this.validaCNPJ();
		}
	});
	painel06.add(botaoValidarCNPJ);
	campoCnpjGerado = new JTextField();
	campoCnpjGerado.setPreferredSize(TAMANHO_CAMPO);
	campoCnpjGerado.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCnpjGerado, 14);
		}
		public void keyReleased(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCnpjGerado, 14);
		}
		public void keyTyped(KeyEvent evt) {
			Janela.this.filtraNumeros(campoCnpjGerado, 14);
		}
	});
	painel06.add(campoCnpjGerado);
	painel06.add(new JLabel("CNPJ gerado"));
	painelCnpj.add(painel06, BorderLayout.SOUTH);
	
	this.add(painelCnpj, BorderLayout.SOUTH);
	
	this.pack();
	this.setResizable(false);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	this.setLocation((int)((screenSize.getWidth()-this.getWidth())/2), (int)((screenSize.getHeight()-this.getHeight())/2));
	this.setVisible(true);
}

private void geraDigitosCPF() {
	new Thread(new Runnable(){
		public void run() {
			JTextComponent campo = Janela.this.campoCPF;
			Janela.this.desabilitaCamposCPF();
			Janela.this.limpaCamposCPF();
			while(true){
				if(campo.getText().length()==9)break;
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {}
				campo.setText(campo.getText()+(int)Math.floor(Math.random()*10));
			}
			Janela.this.geraDvCPF();
			Janela.this.habilitaCamposCPF();
		}
	}).start();
}

private void geraDvCPF() {
	List<Integer> digitosCPF = obtemListaDigitos(campoCPF);
	
	int soma = 0;
	int fator = 10;
	for(int digito : digitosCPF){
		soma += (fator--) * digito;
	}
	int resto = soma%11;
	digitosCPF.add(resto<2?0:11-resto);
	
	soma = 0;
	fator = 11;
	for(int digito : digitosCPF){
		soma += (fator--) * digito;
	}
	resto = soma%11;
	digitosCPF.add(resto<2?0:11-resto);
	
	StringBuilder cpfCompleto = new StringBuilder();
	for(int digito : digitosCPF){
		cpfCompleto.append(digito);
	}
	
	campoVerificadorCPF.setText(cpfCompleto.substring(cpfCompleto.length()-2, cpfCompleto.length()));
	campoCpfGerado.setText(cpfCompleto.toString());
}

private void validaCPF() {
	List<Integer> digitosCPF = obtemListaDigitos(campoCpfGerado);
	if(digitosCPF.size()<11){
		JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	int[] dvCPF = new int[]{digitosCPF.remove(digitosCPF.size()-2), digitosCPF.remove(digitosCPF.size()-1)};
	
	int soma = 0;
	int fator = 10;
	for(int digito : digitosCPF){
		soma += (fator--) * digito;
	}
	int resto = soma%11;
	int dv = resto<2?0:11-resto;
	if(dv!=dvCPF[0]){
		JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	digitosCPF.add(dv);
	
	soma = 0;
	fator = 11;
	for(int digito : digitosCPF){
		soma += (fator--) * digito;
	}
	resto = soma%11;
	dv = resto<2?0:11-resto;
	if(dv!=dvCPF[1]){
		JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	digitosCPF.add(dv);
	JOptionPane.showMessageDialog(this, TEXTO_CPF_VALIDO, "Sucesso", JOptionPane.INFORMATION_MESSAGE);
}

private void geraDigitosCNPJ() {
	new Thread(new Runnable(){
		public void run() {
			JTextComponent campo = Janela.this.campoCNPJ;
			Janela.this.desabilitaCamposCNPJ();
			Janela.this.limpaCamposCNPJ();
			while(true){
				if(campo.getText().length()==12)break;
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {}
				campo.setText(campo.getText()+(int)Math.floor(Math.random()*10));
			}
			Janela.this.geraDvCNPJ();
			Janela.this.habilitaCamposCNPJ();
		}
	}).start();
}

private void geraDvCNPJ() {
	List<Integer> digitosCNPJ = obtemListaDigitos(campoCNPJ);
	
	int soma = 0;
	int fator = 5;
	for(int digito : digitosCNPJ){
		soma += (fator--) * digito;
		if(fator<2)fator=9;
	}
	int resto = soma%11;
	digitosCNPJ.add(resto<2?0:11-resto);
	
	soma = 0;
	fator = 6;
	for(int digito : digitosCNPJ){
		soma += (fator--) * digito;
		if(fator<2)fator=9;
	}
	resto = soma%11;
	digitosCNPJ.add(resto<2?0:11-resto);
	
	StringBuilder cnpjCompleto = new StringBuilder();
	for(int digito : digitosCNPJ){
		cnpjCompleto.append(digito);
	}
	
	campoVerificadorCNPJ.setText(cnpjCompleto.substring(cnpjCompleto.length()-2, cnpjCompleto.length()));
	campoCnpjGerado.setText(cnpjCompleto.toString());
}

private void validaCNPJ() {
	List<Integer> digitosCNPJ = obtemListaDigitos(campoCnpjGerado);
	if(digitosCNPJ.size()<14){
		JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	int[] dvCNPJ = new int[]{digitosCNPJ.remove(digitosCNPJ.size()-2), digitosCNPJ.remove(digitosCNPJ.size()-1)};
	
	int soma = 0;
	int fator = 5;
	for(int digito : digitosCNPJ){
		soma += (fator--) * digito;
		if(fator<2)fator=9;
	}
	int resto = soma%11;
	int dv = resto<2?0:11-resto;
	if(dv!=dvCNPJ[0]){
		JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	digitosCNPJ.add(dv);
	
	soma = 0;
	fator = 6;
	for(int digito : digitosCNPJ){
		soma += (fator--) * digito;
		if(fator<2)fator=9;
	}
	resto = soma%11;
	dv = resto<2?0:11-resto;
	if(dv!=dvCNPJ[1]){
		JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
		return;
	}
	digitosCNPJ.add(dv);
	JOptionPane.showMessageDialog(this, TEXTO_CNPJ_VALIDO, "Sucesso", JOptionPane.INFORMATION_MESSAGE);
}

private List<Integer> obtemListaDigitos(JTextComponent campo) {
	String texto = campo.getText();
	texto = NAO_NUMEROS.matcher(texto).replaceAll("");
	List<Integer> listaDigitos = new ArrayList<Integer>();
	for(char c : texto.toCharArray()){
		listaDigitos.add(Integer.parseInt(String.valueOf(c)));
	}
	return listaDigitos;
}

private void filtraNumeros(JTextComponent campo, int tamanho) {
	String texto = campo.getText();
	texto = NAO_NUMEROS.matcher(campo.getText()).replaceAll("");
	if(texto.length()>tamanho){
		texto = texto.substring(0, tamanho);
	}
	if(!campo.getText().equals(texto)){
		campo.setText(texto);
	}
}

private void habilitaCamposCPF() {
	campoCPF.setEnabled(true);
	botaoGerarCampoCPF.setEnabled(true);
	campoVerificadorCPF.setEnabled(true);
	botaoGerarCampoVerificadorCPF.setEnabled(true);
	campoCpfGerado.setEnabled(true);
	botaoValidarCPF.setEnabled(true);
}

private void desabilitaCamposCPF() {
	campoCPF.setEnabled(false);
	botaoGerarCampoCPF.setEnabled(false);
	campoVerificadorCPF.setEnabled(false);
	botaoGerarCampoVerificadorCPF.setEnabled(false);
	campoCpfGerado.setEnabled(false);
	botaoValidarCPF.setEnabled(false);
}

private void limpaCamposCPF() {
	campoCPF.setText(null);
	campoVerificadorCPF.setText(null);
	campoCpfGerado.setText(null);
}

protected void habilitaCamposCNPJ() {
	campoCNPJ.setEnabled(true);
	botaoGerarCampoCNPJ.setEnabled(true);
	campoVerificadorCNPJ.setEnabled(true);
	botaoGerarCampoVerificadorCNPJ.setEnabled(true);
	campoCnpjGerado.setEnabled(true);
	botaoValidarCNPJ.setEnabled(true);
}

protected void desabilitaCamposCNPJ() {
	campoCNPJ.setEnabled(false);
	botaoGerarCampoCNPJ.setEnabled(false);
	campoVerificadorCNPJ.setEnabled(false);
	botaoGerarCampoVerificadorCNPJ.setEnabled(false);
	campoCnpjGerado.setEnabled(false);
	botaoValidarCNPJ.setEnabled(false);
}

private void limpaCamposCNPJ() {
	campoCNPJ.setText(null);
	campoVerificadorCNPJ.setText(null);
	campoCnpjGerado.setText(null);
}

public static void main(String[] args) {
	new Janela();
}

}[/code]