Olá Gilmar,
Graças a você não desisti.
Com suas orientações finais consegui fazer tudo certinho, a linha
digitável bateu que foi uma maravilha!
Uma coisa interessante que não achei foi o dígito do nosso numero, mas
ai peguei a função em php que tinha e transportei para o java, chamei-
a de getMod11.
Gostaria de saber se tem como publicar ai como exemplo para caixa,
pois parece mais difícil.
Segue meu código:
Separei em uma função para chamar o pdf:
private static void mostreBoletoNaTela(File arquivoBoleto) {
java.awt.Desktop desktop =
java.awt.Desktop.getDesktop();
try {
desktop.open(arquivoBoleto);
} catch (IOException e) {
e.printStackTrace();
}
}
Calcular o dígito do nosso numero da caixa, é o módulo 11 com base
9,1, nos comentarios existe exemplo de uso:
public static int getMod11(String num, int base, int r){
/**
* Autor:
* Douglas Tybel <
dty...@yahoo.com.br>
*
* Função:
* Calculo do Modulo 11 para geracao do digito verificador
* de boletos bancarios conforme documentos obtidos
* da Febraban -
www.febraban.org.br
*
* Entrada:
* $num: string numérica para a qual se deseja calcularo
digito verificador;
* $base: valor maximo de multiplicacao [2-$base]
* $r: quando especificado um devolve somente o resto
*
* Saída:
* Retorna o Digito verificador.
*
* Observações:
* - Script desenvolvido sem nenhum reaproveitamento de código
existente.
* - Script original de Pablo Costa
<
pa...@users.sourceforge.net>
* - Transportado de php para java
* - Exemplo de uso: getMod11(nossoNumero, 9,1)
* - 9 e 1 são fixos de acordo com a base
* - Assume-se que a verificação do formato das variáveis de
entrada é feita antes da execução deste script.
*/
base = 9;
r = 0;
int soma = 0;
int fator = 2;
String[] numeros,parcial;
numeros = new String[num.length()+1];
parcial = new String[num.length()+1];
/* Separacao dos numeros */
for (int i = num.length(); i > 0; i--) {
// pega cada numero isoladamente
numeros[i] = num.substring(i-1,i);
// Efetua multiplicacao do numero pelo falor
parcial[i] = String.valueOf(Integer.parseInt(numeros[i]) *
fator);
// Soma dos digitos
soma += Integer.parseInt(parcial[i]);
if (fator == base) {
// restaura fator de multiplicacao para 2
fator = 1;
}
fator++;
}
/* Calculo do modulo 11 */
if (r == 0) {
soma *= 10;
int digito = soma % 11;
if (digito == 10) {
digito = 0;
}
return digito;
} else {
int resto = soma % 11;
return resto;
}
}
Função para formatar a data:
public static Date getDataFormatBR(String data) throws
ParseException, java.text.ParseException{
if (!data.equals(" / / ")){
//Formatar data
SimpleDateFormat formato = new SimpleDateFormat("dd/MM/
yyyy");
return formato.parse(data);
}else{
return null;
}
}
Código que gera o boleto funcional e testado para CEF:
try {
// TODO add your handling code here:
/*
* INFORMANDO DADOS SOBRE O CEDENTE.
*/
Cedente cedente = new Cedente("PROJETO
JRimum","00.000.208/0001-00");
// Informando dados sobre a conta bancária do cendente.
Banco banco =
BancoSuportado.CAIXA_ECONOMICA_FEDERAL.create();
ContaBancaria contaBancariaCed = new ContaBancaria(banco);
contaBancariaCed.setBanco(banco);
//Alterar o numero da conta para codigo do cedente em caso
da CEF
contaBancariaCed.setNumeroDaConta(new
NumeroDaConta(123456,"0"));
contaBancariaCed.setCarteira(new
Carteira(24,TipoDeCobranca.SEM_REGISTRO));
contaBancariaCed.setModalidade(new Modalidade(4));
contaBancariaCed.setAgencia(new Agencia(717, "0")); //não
usar zero antes do numero da agencia erro 463
cedente.addContaBancaria(contaBancariaCed);
/*
* INFORMANDO DADOS SOBRE O SACADO.
*/
Sacado sacado = new Sacado("JavaDeveloper Pronto
ParaFérias", "222.222.222-22");
// Informando o endereço do sacado.
Endereco enderecoSac = new Endereco();
enderecoSac.setUF(UnidadeFederativa.ES);
enderecoSac.setLocalidade("Natal");
enderecoSac.setCep(new CEP("59064-120"));
enderecoSac.setBairro("Grande Centro");
enderecoSac.setLogradouro("Rua poeta dos programas");
enderecoSac.setNumero("1");
sacado.addEndereco(enderecoSac);
/*
* INFORMANDO DADOS SOBRE O SACADOR AVALISTA.
*/
Pessoa sacadorAvalista = new Pessoa("Nordeste
FomentoMercantil", "00.000.000/0001-91");
// Informando o endereço do sacador avalista.
Endereco enderecoSacAval = new Endereco();
enderecoSacAval.setUF(UnidadeFederativa.ES);
enderecoSacAval.setLocalidade("Brasília");
enderecoSacAval.setCep(new CEP("00000-000"));
enderecoSacAval.setBairro("Grande Centro");
enderecoSacAval.setLogradouro("Rua EternamentePrincipal");
enderecoSacAval.setNumero("001");
sacadorAvalista.addEndereco(enderecoSacAval);
/*
* INFORMANDO OS DADOS SOBRE O TÍTULO.
*/
Titulo titulo = new Titulo(contaBancariaCed,
sacado,cedente);
titulo.setNumeroDoDocumento("781");
//SIGCB 15 digitos
titulo.setNossoNumero("270005000000781");//O digito
correto é o numero 2 calculado em cima de 24270005000000781
titulo.setDigitoDoNossoNumero( String.valueOf( getMod11( contaBancariaCed.getCarteira().getCodigo().toString()
+ titulo.getNossoNumero().toString() , 9, 1) ) );
titulo.setValor(BigDecimal.valueOf(100.00));
titulo.setDataDoDocumento(new Date());
titulo.setDataDoVencimento(funcoes.getDataFormatBR("20/11/2010"));
titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);
titulo.setAceite(EnumAceite.A);
titulo.setDesconto(new BigDecimal(0.00));
/*
* INFORMANDO MAIS DADOS BANCÁRIOS, QUANDO NECESSÁRIO.
* Dependendo do banco, talvez seja necessário
informarmais dados além de:
*
* > Valor do título;
* > Vencimento;
* > Nosso número;
* > Código do banco
* > Data de vencimento;
* > Agência/Código do cedente;
* > Código da carteira;
* > Código da moeda;
*
* Definidos como padrão pela FEBRABAN.
* Verifique na documentação.
*/
//titulo.setDadosBancarios(new DadoBancario(){});
dougcomentou
/*
* INFORMANDO OS DADOS SOBRE O BOLETO.
*/
Boleto boleto = new Boleto(titulo);
boleto.addTextosExtras("txtRsNossoNumero",
contaBancariaCed.getCarteira().getCodigo().toString()
+titulo.getNossoNumero()+titulo.getDigitoDoNossoNumero());
boleto.addTextosExtras("txtFcNossoNumero",
contaBancariaCed.getCarteira().getCodigo().toString()
+titulo.getNossoNumero()+titulo.getDigitoDoNossoNumero());
boleto.setLocalPagamento("Pagável preferencialmente naRede
X ou em " + "qualquer Banco até o Vencimento.");
boleto.setInstrucaoAoSacado("Senhor sacado, sabemos simque
o valor " + "cobrado não é o esperado, aproveite o DESCONTÃO!");
boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não
cobrarnada!");
boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã
Nãocobre!");
boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois
deamanhã, OK, não cobre.");
boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de
4dias atrás " + "COBRAR O VALOR DE: R$ 01,00");
boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/
xxxxCOBRAR O VALOR " + "DE: R$ 02,00");
boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/
xxxxCOBRAR O VALOR " + "DE: R$ 03,00");
boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/
xxxxCOBRAR O VALOR " + "QUE VOCÊ QUISER!");
boleto.setInstrucao8("APÓS o Vencimento, Pagável Somentena
Rede X.");
/*
* GERANDO O BOLETO BANCÁRIO.
*/
// Instanciando um objeto "BoletoViewer",
classeresponsável pela geração
// do boleto bancário.
BoletoViewer boletoViewer = new BoletoViewer(boleto);
// Gerando o arquivo. No caso o arquivo mencionado
serásalvo na mesma
// pasta do projeto. Outros exemplos:
// WINDOWS: boletoViewer.getAsPDF("C:/Temp/
MeuBoleto.pdf");
// LINUX: boletoViewer.getAsPDF("/home/temp/
MeuBoleto.pdf");
File arquivoPdf
=boletoViewer.getPdfAsFile("MeuPrimeiroBoleto.pdf");
// Mostrando o boleto gerado na tela.
mostreBoletoNaTela(arquivoPdf);
} catch (ParseException ex) {
Logger.getLogger(AppLabView.class.getName()).log(Level.SEVERE,
null,ex);
}
Douglas Tybel
Analista de Sistemas
Engenharia de Softwares
MCP + MCDST
dty...@facilassim.com.br
27 9937-9892
On 22 set, 01:22, "Gilmar P.S.L." <
gilmat...@gmail.com> wrote:
> Olá Douglas,
>
> É isso aí cara, estamos quase lá..
>
> Pela linha digitável do boleto (em php) que vc mandou, o serviço que vc
> utiliza é o SIGCB, que tem o nosso número com 15 dígitos do cedente.
> Então para gerar o boleto pelo bopepo vc tem que tirar os dois primeiro
> dígitos do seu exemplo ( número 24 do início). então fica assim:
>
> titulo.setNossoNumero(*"004003000001777"*);
> titulo.setDigitoDoNossoNumero(*"2"*);
>
> Se vc setar o número real da conta vc deve chegar a uma linha digitável
> igual a gerada pelo seu boleto em php.
>
> Dessa forma tudo será calculado direitinho, mas vc pode estar se
> perguntando, por que tirar o número 24 do nosso número? Bom, isso acontece
> porque para o banco o que vale é o nosso número do cedente: *"004003000001777".
>
> *Mas para a impressão do boleto vc deve mostrar o número completo como manda
> o banco:
>
> *XYNNNNNNNNNNNNNNN-D*, onde:
>
> *X *-Modalidade Cobrança
> (1-Registrada/2-Sem Registro)
>
> *Y *-Emissão do bloqueto
> (4-cedente)
>
> *NNNNNNNNNNNNNNN* -Nosso Número (15 posições livres do Cedente)
>
> *D *-Dígito verificador
>
> Então, para sair legal no PDF vc deve sobrescrever o campo nosso número
> também:
>
> boleto.addTextosExtras("txtRsNossoNumero", "*24*"
> +titulo.getNossoNumero()+titulo.getDigitoDoNossoNumero());
> boleto.addTextosExtras("txtFcNossoNumero", "*24*"
> +titulo.getNossoNumero()+titulo.getDigitoDoNossoNumero());
>
> T+.
> Qualquer coisa estamos aí.
> --
> Gilmar P.S.L.