示例#1
0
        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");
        }
示例#2
0
        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());
        }
示例#3
0
        /// <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;
        }
示例#5
0
        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
        }
示例#6
0
        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());
        }
示例#7
0
        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);
        }
示例#8
0
        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");
        }