public void Boleto_Caixa() { // Exemplo 100% de acordo com a documentação usando os parametros mínimos // https://github.com/impactro/Boleto-ASP.NET/files/44866/ESPCODBARR_SICOB.pdf // Página 8, item 5.1.1 /* Dados usados para cálculo: * 104 Banco ...............................Posição: 01 - 03 * 9 Moeda ...............................Posição: 04 - 04 * 1099(10/10/2000) Fator de Vencimento .................Posição: 06 - 09 * 160,00 Valor ...............................Posição: 10 - 19 * 9001200200 Nosso Número (sem DV) ...............Posição: 20 - 29 * 001287000000012 Código do Cedente no SICOB(sem DV) ..Posição: 30 - 44 */ // Dados do Recebedor CedenteInfo c = new CedenteInfo() { Banco = "104-0", CodCedente = "001287000000012" }; // Dados do Pagador SacadoInfo s = new SacadoInfo(); // Informações do Boleto BoletoInfo b = new BoletoInfo() { DataVencimento = DateTime.Parse("10/10/2000"), ValorDocumento = 160, NossoNumero = "9001200200" // Exemplo do caso especial onde o Dv dá Zero (caso critico) }; // Cria uma instancia do objeto que calcula e monta um boleto Boleto bol = new Boleto(); // Seta as variáveis (parametros) com os dados do recebedor (c), pagador (s), e as informações do boleto (b) bol.MakeBoleto(c, s, b); // Calcula efetivamente o boleto bol.CalculaBoleto(); // Imprime a linha digitável no console e alguns outros dados para conferencia Console.WriteLine("Linha Digitável: " + bol.LinhaDigitavel); Console.WriteLine("Agência/Conta: " + bol.AgenciaConta); Console.WriteLine("Nosso Número: " + bol.NossoNumeroExibicao); Console.WriteLine("Fator Vencimento: " + CobUtil.CalcFatVenc(bol.DataVencimento)); // De acordo com a página 13 deve gerar exatamente a linha abaixo Assert.IsTrue(bol.LinhaDigitavel == "10499.00127 00200.001287 70000.000128 1 10990000016000"); // Outro exemplo qualquer: b.NossoNumero = "9000003225"; bol.MakeBoleto(c, s, b); // atualizo os dados (não é recomendado, mas para simplificar funciona) bol.CalculaBoleto(); // se não chamar esta rotina, virá comos resultados calculados anteriormente Console.WriteLine("Exemplo Livre: Nosso Número: " + bol.NossoNumeroExibicao); Assert.IsTrue(bol.NossoNumeroExibicao == "9000003225-0"); // no caso o sistema sempre preenche com os digitos zeros a esquerda // Salva a imagem do boleto para conferencia visual bol.Save("boleto.png"); }
public IActionResult Boleto() { // Definição dos dados do cedente var Cedente = new CedenteInfo() { Cedente = "Teste de Cedente", CNPJ = "12.345.678/0000-12", Endereco = "endereço do recebedor", Banco = "237", Agencia = "0646", Conta = "9105-8", Carteira = "6" }; // Definição dos dados do sacado var Sacado = new SacadoInfo() { Sacado = "Fabio Ferreira (Teste)", Documento = "123.456.789-99", Endereco = "Av. Paulista, 1234", Cidade = "São Paulo", Bairro = "Centro", Cep = "12345-123", UF = "SP" }; // Definição das Variáveis do boleto var Boleto = new BoletoInfo() { NumeroDocumento = "00046356", NossoNumero = "00046356", ParcelaNumero = 1, ParcelaTotal = 3, Quantidade = 4, ValorUnitario = 34.55, ValorDocumento = 3070.14, DataDocumento = DateTime.Now, DataVencimento = DateTime.Parse("30/07/2017"), Demonstrativo = "Demostrativo para o cliente", Instrucoes = "Todas as informações deste bloqueto são de exclusiva responsabilidade do cedente" }; // monta o boleto com os dados específicos nas classes var blt = new Boleto(); blt.MakeBoleto(Cedente, Sacado, Boleto); // Armazena e inicializa variáveis internas blt.CalculaBoleto(); // Calcula a linha digitável e código de barras ViewBag.Boleto = blt; // Coloca na viewBag a instancia do boleto calculado para ser meschado no HTML return(View()); }
/// <summary> /// Configura o boleto e calcula o código de barras e linha digitavel com base nas informações passadas /// </summary> /// <param name="Cedente">São as dados de que Emite o Boleto (Quem irá receber)</param> /// <param name="Sacado">São os dados do pagador do Boleto (Quem irá pagar)</param> /// <param name="Boleto">São os dados da caobrança em si: Valores, Datas, Descrições e Informações</param> public void MakeBoleto(CedenteInfo Cedente, SacadoInfo Sacado, BoletoInfo Boleto) { if (MontaCampoLivre != null) { blt.onMontaCampoLivre += MontaCampoLivre; } if (blt != null) { blt.MakeBoleto(Cedente, Sacado, Boleto); } blt.CalculaBoleto(); }
private void frmCustromizado_Load(object sender, EventArgs e) { // Definição dos dados do cedente CedenteInfo Cedente = new CedenteInfo(); Cedente.Cedente = "Impactro Informática (teste)"; Cedente.Banco = "001"; Cedente.Agencia = "999-7"; Cedente.Conta = "999999-7"; Cedente.Carteira = "18"; Cedente.Modalidade = "19"; Cedente.Convenio = "123456"; // ATENÇÃO: Alguns Bancos usam um código de convenio para remapear a conta do clientes Cedente.CodCedente = "123456"; // outros bancos chama isto de Codigo do Cedente ou Código do Cliente // outros usam os 2 campos para controles distintos! // Veja com atenção qual é o seu caso e qual destas variáveis deve ser usadas! // Olhe sempre os exemplos em ASP.Net se tiver dúvidas, pois lá há um exemplo para cada banco // Definição dos dados do sacado SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = "Fabio Ferreira (Teste)"; Sacado.Documento = "123.456.789-99"; Sacado.Endereco = "Av. Paulista, 1234"; Sacado.Cidade = "São Paulo"; Sacado.Bairro = "Centro"; Sacado.Cep = "12345-123"; Sacado.UF = "SP"; Sacado.Avalista = "Nome Avalista / Documento"; // Definição das Variáveis do boleto BoletoInfo Boleto = new BoletoInfo(); Boleto.NossoNumero = "12345"; Boleto.NumeroDocumento = "12345"; Boleto.ValorDocumento = 160.0; Boleto.DataDocumento = DateTime.Now; Boleto.DataVencimento = DateTime.Now; Boleto.Instrucoes = "Todas as informações deste bloqueto são de exclusiva responsabilidade do cedente"; // Cria um objeto que calcula as informações do boleto Boleto blt = new Boleto(); blt.MakeBoleto(Cedente, Sacado, Boleto); // antes de começar a pedir as informações para o objeto, // é nescessário pedir que sejam calculado os dados (como se fosse um DataBind) blt.CalculaBoleto(); // Coloca no TextBox o valor da linha digitável lblIPTE.Text = blt.LinhaDigitavel; // O nosso numero exibição é o numero EFETIVAMENTE que deve ser exibido // em vários casos os bancos exeigem formatação especial para a exibição // deste campo e também o calculo de digitos verificadores, assim nesta // variável já existe todas estas exigencias prontas lblNossoNumero.Text = blt.NossoNumeroExibicao; // Não é nescessário formatar com {0:C} pois a 'Especie' (moeda) geralmente // é indicada em um campo a parte lblValor.Text = string.Format("{0:#,###,##0.00}", blt.ValorDocumento); // Formata a data sempre exibindo 2 digitos para dia e mes, e 4 para ano lblVencimento.Text = string.Format("{0:dd/MM/yyyy}", blt.DataVencimento); // Obtem a imagem do código de barras picCodBaras.Image = CobUtil.BarCodeImage(blt.CodigoBarras); // A classe UTIL, contem as rotinas de geração de codigo de barras, // pois o codigo de barras, não é usado somente em boletos, mas em diversas aplicações // desta forma é possivel gerar etiquetas de produtos, identificações de usuário, etc... // apenas coloca o nome do avalista na tela - opcional lblAvalista.Text = "Avalista: " + Sacado.Avalista; }
public void Boleto_Banestes() { // Ainda de acordo com o exemplo em: https://github.com/impactro/Boleto-Test/wiki/Criando-Layouts/_edit // Dados do Pagador SacadoInfo s = new SacadoInfo() { Sacado = "Fabio Ferreira" }; // Informações do Boleto BoletoInfo b = new BoletoInfo() { DataVencimento = DateTime.Parse("30/07/2000"), ValorDocumento = 75, NossoNumero = "178" }; // Cria uma instancia do objeto que calcula e monta um boleto Boleto bol = new Boleto(); // Seta as variáveis (parametros) com os dados do recebedor (c), pagador (s), e as informações do boleto (b) bol.MakeBoleto(Cedente, s, b); // Calcula efetivamente o boleto bol.CalculaBoleto(); // Imprime a linha digitável no console e alguns outros dados para conferencia Console.WriteLine("Linha Digitável: " + bol.LinhaDigitavel); Console.WriteLine("Agência/Conta: " + bol.AgenciaConta); Console.WriteLine("Nosso Número: " + bol.NossoNumeroExibicao); Console.WriteLine("Fator Vencimento: " + CobUtil.CalcFatVenc(bol.DataVencimento)); // De acordo com a página 13 deve gerar exatamente a linha abaixo Assert.IsTrue(bol.LinhaDigitavel == "02190.00007 17800.006573 33154.021415 7 10270000007500"); // Página 38 da documentação // 02190.00007 17800.006573 33154.021415 3 10270000007500 // O exemplo está com o digito errado! // Salva a imagem do boleto para conferencia visual //bol.Save("boleto.png"); // Baseado no segundo exemplo da página 34 (só vou especificar o que é realmente necessário) Console.WriteLine(); bol = new Boleto(); // reseta tudo! CedenteInfo c = new CedenteInfo() { Banco = "021-3", CodCedente = "7730070", Modalidade = "4" }; // E reaproveiro a instancia (Alterando) b.DataVencimento = DateTime.Parse("09/12/2000"); b.ValorDocumento = 131.50; b.NossoNumero = "10297"; bol.MakeBoleto(c, s, b); // Calcula efetivamente o boleto bol.CalculaBoleto(); // Imprime a linha digitável no console e alguns outros dados para conferencia Console.WriteLine("Linha Digitável: " + bol.LinhaDigitavel); Console.WriteLine("Agência/Conta: " + bol.AgenciaConta); Console.WriteLine("Nosso Número: " + bol.NossoNumeroExibicao); Console.WriteLine("Fator Vencimento: " + CobUtil.CalcFatVenc(bol.DataVencimento)); // De acordo com a página 13 deve gerar exatamente a linha abaixo Assert.IsTrue(bol.LinhaDigitavel == "02190.00106 29700.007734 00704.021823 3 11590000013150"); // Note que o digito verificador é 3... acho que houve confusão na digitação da documentação // E este número retorna exatamente o informado na página 32: 021.9.3.1159.0000013150-0001029700007730070402182 }
public IActionResult CaixaHomologa() { // Exemplo original em https://github.com/impactro/Boleto-ASP.NET/blob/master/BoletoNet/HomologaCaixaCS.aspx.cs adaptado minimamente para .net core // Aqui também aproveito para mostrar como colocar varios boletos na mesma página // Definição dos dados do cedente CedenteInfo Cedente = new CedenteInfo(); Cedente.Cedente = "Exemplo de empresa cedente"; Cedente.Endereco = "rua Qualquer no Bairro da Cidade"; Cedente.CNPJ = "12.345.678/00001-12"; Cedente.Banco = "104"; Cedente.Agencia = "4353"; Cedente.Conta = "00000939-9"; Cedente.Carteira = "1"; // 1-Registrada ou 2-Sem registro Cedente.CodCedente = "658857"; Cedente.Convenio = "1234"; // CNPJ do PV da conta do cliente = 00.360.305/4353-48 (usado em alguns casos) Cedente.Informacoes = "SAC CAIXA: 0800 726 0101 (informações, reclamações, sugestões e elogios)<br/>" + "Para pessoas com deficiência auditiva ou de fala: 0800 726 2492<br/>" + "Ouvidoria: 0800 725 7474 (reclamações não solucionadas e denúncias)<br/>" + "<a href='http://caixa.gov.br' target='_blank'>caixa.gov.br</a>"; BoletoTextos.LocalPagamento = "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE"; // Definição dos dados do sacado SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = "Fabio Ferreira (Teste para homologação)"; Sacado.Documento = "123.456.789-99"; Sacado.Endereco = "Av. Paulista, 1234"; Sacado.Cidade = "São Paulo"; Sacado.Bairro = "Centro"; Sacado.Cep = "12345-123"; Sacado.UF = "SP"; Sacado.Avalista = "CNPJ: 123.456.789/00001-23"; // Para aprovar a homologação junto a caixa é necessário apresentar 10 boletos com os 10 digitos de controle da linha digitável diferentes // E mais outros 10 com o digito de controle do código de barras // Assim a ideia é criar 2 listas para ir memorizando os boletos já validos e deixa-los entrar em tela List <int> DAC1 = new List <int>(); List <int> DAC2 = new List <int>(); List <Boleto> boletoList = new List <Impactro.Cobranca.Boleto>(); for (int nBoleto = 1001; nBoleto < 1100; nBoleto++) { // Definição dos dados do boleto de forma sequencial BoletoInfo Boleto = new BoletoInfo() { NumeroDocumento = nBoleto.ToString(), NossoNumero = nBoleto.ToString(), ValorDocumento = 123.45, DataVencimento = DateTime.Now, DataDocumento = DateTime.Now, }; // Componente HTML do boleto que poderá ser ou não colocado em tela var blt = new Boleto(); blt.CalculaBoleto(); // Calcula a linha digitável e código de barras // Junta as informações para fazer o calculo blt.MakeBoleto(Cedente, Sacado, Boleto); // A instancia 'blt' é apenas un Webcontrol que renderiza o boleto HTML, tudo fica dentro da propriedade 'Boleto' blt.CalculaBoleto(); // 10491.23456 60000.200042 00000.000844 4 67410000012345 // 012345678901234567890123456789012345678901234567890123 // 000000000111111111122222222223333333333444444444455555 int D1 = int.Parse(blt.LinhaDigitavel.Substring(38, 1)); int D2 = int.Parse(blt.LinhaDigitavel.Substring(35, 1)); // De acordo com o banco: // Todos os Dígitos Verificadores Geral do Código de Barras possíveis(de 1 a 9) ou seja, campo 4 da Representação Numérica // Todas os Dígitos Verificadores do Campo Livre possíveis(de 0 a 9), 10ª posição do campo 3 da Representação Numérica bool lUsar = false; if (!DAC1.Contains(D1)) { lUsar = true; DAC1.Add(D1); } if (!DAC2.Contains(D2)) { lUsar = true; DAC2.Add(D2); } if (lUsar) { boletoList.Add(blt); } // Quando todas as possibilidades concluidas em até 100 boletos, já pode terminar... if (DAC1.Count == 9 && DAC2.Count == 10) { break; // o Modulo 11 padrão não tem o digito Zero, mas o especial para calculo do nosso numero tem } } ViewBag.BoletoList = boletoList; return(View()); }
private void SetValores() { // Exemplo abaixo baseado no boleto customizado... // Definição dos dados do cedente CedenteInfo Cedente = new CedenteInfo(); Cedente.Cedente = "Impactro Informática (teste)"; Cedente.Banco = "001"; Cedente.Agencia = "999-7"; Cedente.Conta = "999999-7"; Cedente.Carteira = "18"; Cedente.Modalidade = "19"; Cedente.Convenio = "123456"; // ATENÇÃO: Alguns Bancos usam um código de convenio para remapear a conta do clientes Cedente.CodCedente = "123456"; // outros bancos chama isto de Codigo do Cedente ou Código do Cliente // outros usam os 2 campos para controles distintos! // Veja com atenção qual é o seu caso e qual destas variáveis deve ser usadas! // Olhe sempre os exemplos em ASP.Net se tiver dúvidas, pois lá há um exemplo para cada banco // Definição dos dados do sacado SacadoInfo Sacado = new SacadoInfo(); Sacado.Sacado = "Fabio Ferreira (Teste)"; Sacado.Documento = "123.456.789-99"; Sacado.Endereco = "Av. Paulista, 1234"; Sacado.Cidade = "São Paulo"; Sacado.Bairro = "Centro"; Sacado.Cep = "12345-123"; Sacado.UF = "SP"; Sacado.Avalista = "Impactro Informática - CNPJ: 123.456.789/00001-23"; // Definição das Variáveis do boleto BoletoInfo Boleto = new BoletoInfo(); Boleto.NossoNumero = NossoNumero.ToString(); Boleto.NumeroDocumento = NossoNumero.ToString(); Boleto.ValorDocumento = 160.0; Boleto.DataDocumento = DateTime.Now; Boleto.DataVencimento = DateTime.Now; Boleto.Instrucoes = "Todas as informações deste bloqueto são de exclusiva responsabilidade do cedente"; // incrementa o nosso numero para outro boleto NossoNumero++; // Cria um objeto que calcula as informações do boleto Boleto blt = new Boleto(); blt.MakeBoleto(Cedente, Sacado, Boleto); // antes de começar a pedir as informações para o objeto, // é nescessário pedir que sejam calculado os dados (como se fosse um DataBind) blt.CalculaBoleto(); Valores = new SortedList<ValoresCampos, strTextos>(); // parte 1,2,3 Valores.Add(ValoresCampos.ParcelaPlano, new strTextos(10, 15, 0, 0, 243, 15, " ", false, StringAlignment.Center)); Valores.Add(ValoresCampos.Vencimento, new strTextos(45, 15, 223, 15, 275, 15, string.Format("{0:dd/MM/yyyy}", blt.DataVencimento), true, StringAlignment.Far)); Valores.Add(ValoresCampos.AgenciaCedente, new strTextos(45, 21, 223, 21, 275, 21, blt.AgenciaConta, false, StringAlignment.Far)); Valores.Add(ValoresCampos.Especie, new strTextos(5, 28, 108, 34, 238, 28, "R$", false, StringAlignment.Center)); Valores.Add(ValoresCampos.Quantidade, new strTextos(45, 28, 138, 34, 275, 28, (blt.Quantidade == 0) ? "" : blt.Quantidade.ToString(), false, StringAlignment.Far)); Valores.Add(ValoresCampos.ValorDocumento, new strTextos(45, 34, 223, 34, 275, 34, string.Format("{0:#,###,##0.00}", blt.ValorDocumento), true, StringAlignment.Far)); Valores.Add(ValoresCampos.DescontoAbatimento, new strTextos(45, 41, 223, 41, 275, 41, " ", false, StringAlignment.Far)); Valores.Add(ValoresCampos.MoraMulta, new strTextos(45, 53, 223, 53, 275, 53, " ", false, StringAlignment.Far)); Valores.Add(ValoresCampos.ValorCobrado, new strTextos(45, 65, 223, 65, 275, 65, " ", false, StringAlignment.Far)); Valores.Add(ValoresCampos.NossoNumero, new strTextos(45, 71, 223, 28, 275, 71, blt.NossoNumeroExibicao, false, StringAlignment.Far)); Valores.Add(ValoresCampos.NumeroDocumento, new strTextos(20, 79, 100, 28, 255, 79, blt.NumeroDocumento, false, StringAlignment.Center)); Valores.Add(ValoresCampos.SacadoResumido, new strTextos(2, 85, 0, 0, 235, 85, blt.Sacado + "\n" + blt.SacadoDocumento, false, StringAlignment.Near)); Valores.Add(ValoresCampos.Sacado, new strTextos(0, 0, 70, 69, 0, 0, blt.Sacado + " - " + blt.SacadoDocumento + "\n" + blt.SacadoEndereco + "\n" + blt.Cidade + " - " + blt.Bairro + " " + blt.UF + " CEP: " + blt.Cep, false, StringAlignment.Near)); Valores.Add(ValoresCampos.Avalista, new strTextos(0, 0, 70, 79, 0, 0, blt.Avalista, false, StringAlignment.Near)); Valores.Add(ValoresCampos.LocalPagamento, new strTextos(0, 0, 59, 15, 0, 0, "ATÉ O VENCIMENTO PAGUAVEL EM QUALQUER BANCO", false, StringAlignment.Near)); Valores.Add(ValoresCampos.Cedente, new strTextos(0, 0, 59, 21, 0, 0, blt.Cedente, false, StringAlignment.Near)); Valores.Add(ValoresCampos.DataDocumento, new strTextos(0, 0, 72, 28, 0, 0, string.Format("{0:dd/MM/yyyy}", blt.DataDocumento), false, StringAlignment.Center)); Valores.Add(ValoresCampos.EspecieDoc, new strTextos(0, 0, 126, 28, 0, 0, "RC", false, StringAlignment.Center)); Valores.Add(ValoresCampos.Aceite, new strTextos(0, 0, 146, 28, 0, 0, "N", false, StringAlignment.Center)); Valores.Add(ValoresCampos.DataProcessamento, new strTextos(0, 0, 170, 28, 0, 0, string.Format("{0:dd/MM/yyyy}", blt.DataProcessamento), false, StringAlignment.Center)); Valores.Add(ValoresCampos.UsodoBanco, new strTextos(0, 0, 70, 34, 0, 0, " ", false, StringAlignment.Center)); Valores.Add(ValoresCampos.Carteira, new strTextos(0, 0, 94, 34, 0, 0, blt.Carteira, false, StringAlignment.Center)); Valores.Add(ValoresCampos.Valor, new strTextos(0, 0, 168, 34, 0, 0, (blt.ValorDocumento == 0) ? "" : string.Format("{0:0.00}", blt.ValorDocumento), false, StringAlignment.Center)); Valores.Add(ValoresCampos.Instrucoes, new strTextos(0, 0, 62, 45, 0, 0, blt.Instrucoes, false, StringAlignment.Near)); // Campos Especiais (Banco e IPTE) Valores.Add(ValoresCampos.Banco, new strTextos(0, 0, 98, 7, 0, 0, blt.BancoCodigo, true, StringAlignment.Center)); Valores.Add(ValoresCampos.IPTE, new strTextos(0, 0, 223, 6, 0, 0, blt.LinhaDigitavel, true, StringAlignment.Far)); imgBanco = (Image)CobUtil.ResLoadImage(String.Format("{0:000}.gif", blt.BancoNumero)); imgCodBar = CobUtil.BarCodeImage(blt.CodigoBarras); }
void PrintRecibo(BoletoForm oBoletoForm) { Boleto blt = oBoletoForm.Boleto; // Aqui não pode conter o clear por causa da impressão que chama o PreRender() antes if (chkExtra.Checked) { int nTop = !blt.Carne && blt.ExibeReciboSacado ? (chkLogo.Checked ? 120 : 110) + 60 : 105; //int nWidth = blt.Carne ? 169 + 50 : 169; blt.CalculaBoleto(); int nWidth = blt.RenderBoleto.Width; //if (chkMaisEspaco.Checked && blt.ExibeReciboSacado) // nTop += 100; //else if (chkMaisEspaco.Checked) // nTop += 50; // As 2 linhas abaixão, dentro desta logica nção é necessário pois quando se define se será carne ou não é criado o layout devido //if (blt.RenderBoleto == null) // blt.RenderBoleto = new BoletoNormal(); // Verifica se os campos já foram criados // Por padrão são criados por ultimo, dentro do render, mas para customizar precisam ser criados antes // Usando as funções internas direta do boleto não é necessário usar //if (blt.RenderBoleto.Count == -1) // blt.RenderBoleto.MakeFields(blt); // Este metodo já checa se existe um objeto de renderização, chamando CalculaBoleto(), e renderizando os campos baiscos // Isso retorna uma instancia de FieldDraw, onde no maximo é possivel definir apenas uma propriedade na mesma linha FieldDraw f; // Linha 1 f = blt.AddFieldDraw(0, 0 + nTop, null, "COMPROVANTE DE ENTREGA DE BOLETO", nWidth - 40, 7); f.Align = StringAlignment.Center; f.Destaque = true; blt.AddFieldDraw(nWidth - 40, 0 + nTop, "Nota Fiscal", "1234").Destaque = true; // Outra forma mais simples de adicionar elementos // Linha 2 // é possivel adicionar linhas diretamente dentro do render Boleto, desde que se tenha feita as checagens anteriores blt.RenderBoleto.Add(new FieldDraw(0, 7 + nTop, "Cliente (Razão social)", blt.Sacado, nWidth, 7, StringAlignment.Near)); // Na pratica a primeira informação adicionar é sempre bom fazer usando o AddFieldDraw, e depois vocês faz como quiser // Linha 3 blt.RenderBoleto.Add(new FieldDraw(0, 14 + nTop, "Nosso Número", blt.NossoNumeroExibicao, nWidth - 80, 7, StringAlignment.Near)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 80, 14 + nTop, "Data de Vencimento", blt.DataVencimento.ToString("dd/MM/yyyy"), 40, 7, StringAlignment.Center)); blt.RenderBoleto.Add(new FieldDraw(nWidth - 40, 14 + nTop, "Valor do Documento", blt.ValorDocumento.ToString("C"))); // Linha 4 - Usando a inclusão direta, só para definir as principais propriedades blt.AddFieldDraw(0, 22 + nTop, "Identificação e assinatura do recebedor", "", nWidth - 80, 10); blt.AddFieldDraw(nWidth - 80, 22 + nTop, "Documento de Identidade", "", 40, 10); blt.AddFieldDraw(nWidth - 40, 22 + nTop, "Data Recebimento", "", 40, 10); } // Depois de tudo 'desenhado' pode-se alterar algo que foi feito // pois na verdade não foi ainda desenhado, e sim montado um array com o que será desenhado if (chkMaisEspaco.Checked) { // Desde que esteja de fato tudo definido blt.CalculaBoleto(); int nSize = blt.RenderBoleto.Count; bool lAchou = false; for (int n = 0; n < nSize; n++) { // Acha o campo Demostrativo que ocupa 100% do layout if (blt.RenderBoleto.Get(n).Campo == "Demonstrativo") { lAchou = true; blt.RenderBoleto.Get(n).Campo = "Demonstrativo da Cobrança"; // Personaliza o texto blt.RenderBoleto.Get(n).Height += 50; } else if (lAchou) { // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; } } // A logica para aumentar o campo de isntrução é quase a mesma lAchou = false; bool lAchouFim = false; for (int n = 0; n < nSize; n++) { // O que muda é que o campo não tem todo o tamnho do layout então os campos laterais não podem ser empurrados para baixo if (blt.RenderBoleto.Get(n).Campo == BoletoTextos.Instrucoes) { lAchou = true; blt.RenderBoleto.Get(n).Campo = "Instruções para Pagamento"; // Personaliza o texto blt.RenderBoleto.Get(n).Height += 50; } else if (lAchouFim) { // Desloca tudo adiante em 50 pixel para baixo blt.RenderBoleto.Get(n).Y += 50; } else if (lAchou) { // os campos são inserido em ordem sequencial // então depois de adicionar os elementos laterais, o restante tem que ser deslocado lAchouFim = blt.RenderBoleto.Get(n).X == 0; if (lAchouFim) { blt.RenderBoleto.Get(n).Y += 50; blt.RenderBoleto.Get(n - 1).Height += 50; // Aumenta o taamnho do campo anterior } } } } // salva o boleto em uma imagem blt.Save("teste.png"); }