private static int EscreverLinhaTitulo(Graphics g, string texto, int tamanhoFonteTitulo, int larguraLogo, int x, int y, int larguraLinha) { var adicionarTexto = new AdicionarTexto(g, texto, tamanhoFonteTitulo); var larguraMaximaTexto = new ComprimentoMaximo((larguraLinha - larguraLogo)); var laguraDoTexto = adicionarTexto.Medida.Largura; var quebrarLinha = new DefineQuebraDeLinha(adicionarTexto, larguraMaximaTexto, laguraDoTexto); adicionarTexto = quebrarLinha.DesenharComQuebras(g); var posisaoXTexto = x + larguraLogo + (((larguraLinha - larguraLogo) - adicionarTexto.Medida.Largura) / 2); adicionarTexto.Desenhar(posisaoXTexto, y); y += adicionarTexto.Medida.Altura; return y; }
private void GerarNfCe(Graphics graphics) { var g = graphics; var larguraLogo = 64; const int larguraLinha = 284; const int larguraLinhaMargemDireita = 277; var x = 3; _y = 3; if (_logo != null) { new RedimensionaImagemPara(new AdicionarImagem(g, _logo, x, _y), 50, 24).Desenhar(); } if (_logo == null) { larguraLogo = 0; } #region cabeçalho int tamanhoFonteTitulo = 6; string cnpjERazaoSocial = CnpjERazaoSocial(); _y = EscreverLinhaTitulo(g, cnpjERazaoSocial, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha); string enderecoEmitente = EnderecoEmitente(); _y = EscreverLinhaTitulo(g, enderecoEmitente, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha); const string mensagemGoverno = "Documento Auxiliar Da Nota Fiscal de Consumidor Eletrônica"; _y = EscreverLinhaTitulo(g, mensagemGoverno, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha); _y += 5; #endregion #region contingência if (_nfe.infNFe.ide.tpEmis != TipoEmissao.teNormal) { LinhaHorizontal(g, x, _y, larguraLinha); _y += 2; _y = MensagemContingencia(g, larguraLinha, _y); } #endregion LinhaHorizontal(g, x, _y, larguraLinha); #region tabela de itens int iniX = x; CriaHeaderColuna("CÓDIGO", g, iniX, _y); iniX += 75; AdicionarTexto colunaDescricaoHeader = CriaHeaderColuna("DESCRIÇÃO", g, iniX, _y); iniX -= 25; _y += colunaDescricaoHeader.Medida.Altura; CriaHeaderColuna("QTDE", g, iniX, _y); iniX += 25; CriaHeaderColuna("UN", g, iniX, _y); iniX += 25; CriaHeaderColuna("x", g, iniX, _y); iniX += 20; AdicionarTexto colunaValorUnitarioHeader = CriaHeaderColuna("VALOR UNITÁRIO", g, iniX, _y); iniX += 85; CriaHeaderColuna("=", g, iniX, _y); iniX += 41; AdicionarTexto colunaTotalHeader = CriaHeaderColuna("TOTAL", g, iniX, _y); _y += colunaTotalHeader.Medida.Altura + 10; List <det> det = _nfe.infNFe.det; #region preencher itens foreach (det detalhe in det) { AdicionarTexto codigo = new AdicionarTexto(g, detalhe.prod.cProd, 7); codigo.Desenhar(x, _y); AdicionarTexto nome = new AdicionarTexto(g, detalhe.prod.xProd, 7); DefineQuebraDeLinha quebraNome = new DefineQuebraDeLinha(nome, new ComprimentoMaximo(202), nome.Medida.Largura); nome = quebraNome.DesenharComQuebras(g); nome.Desenhar(x + 75, _y); _y += nome.Medida.Altura; AdicionarTexto quantidade = new AdicionarTexto(g, detalhe.prod.qCom.ToString("N3"), 7); AdicionarTexto valorUnitario = new AdicionarTexto(g, detalhe.prod.vUnCom.ToString("N4"), 7); AdicionarTexto vezesX = new AdicionarTexto(g, "x", 7); AdicionarTexto unidadeSigla = new AdicionarTexto(g, detalhe.prod.uCom.Length <= 2 ? detalhe.prod.uCom : detalhe.prod.uCom.Substring(0, 2), 7); decimal detalheTotal = detalhe.prod.vProd; AdicionarTexto valorTotalProduto = new AdicionarTexto(g, detalheTotal.ToString("N2"), 7); iniX = x + 50; quantidade.Desenhar(iniX, _y); iniX += 25; unidadeSigla.Desenhar(iniX, _y); iniX += 25; vezesX.Desenhar(iniX, _y); iniX += 20; int tituloColunaUnidadeLargura = colunaValorUnitarioHeader.Medida.Largura; valorUnitario.Desenhar((iniX + tituloColunaUnidadeLargura) - valorUnitario.Medida.Largura, _y); iniX += 85; AdicionarTexto igualColuna = new AdicionarTexto(g, "=", 7); igualColuna.Desenhar(iniX, _y); iniX += 41; int tituloColunaTotal = colunaTotalHeader.Medida.Largura; valorTotalProduto.Desenhar((iniX + tituloColunaTotal) - valorTotalProduto.Medida.Largura, _y); _y += quantidade.Medida.Altura; decimal valorDescontoItem = detalhe.prod.vDesc ?? 0.0m; if (valorDescontoItem > 0.0m) { AdicionarTexto descontoColuna = new AdicionarTexto(g, "Desconto", 7); descontoColuna.Desenhar(x + 50, _y); StringBuilder descontoItemTexto = new StringBuilder("-"); descontoItemTexto.Append(valorDescontoItem.ToString("N2")); AdicionarTexto valorDescontoItemColuna = new AdicionarTexto(g, descontoItemTexto.ToString(), 7); int valorDescontoItemColunaX = ((x + 246) + tituloColunaTotal) - valorDescontoItemColuna.Medida.Largura; valorDescontoItemColuna.Desenhar(valorDescontoItemColunaX, _y); _y += descontoColuna.Medida.Altura; } decimal valorAcrescimoItem = detalhe.prod.vOutro ?? 0.0m; if (valorAcrescimoItem > 0.0m) { AdicionarTexto acrescimoColuna = new AdicionarTexto(g, "Acréscimo", 7); acrescimoColuna.Desenhar(x + 50, _y); StringBuilder acrescimoItemTexto = new StringBuilder("+"); acrescimoItemTexto.Append(valorAcrescimoItem.ToString("N2")); AdicionarTexto valorAcrescimoItemColuna = new AdicionarTexto(g, acrescimoItemTexto.ToString(), 7); int valorAcrescimoItemColunaX = ((x + 246) + tituloColunaTotal) - valorAcrescimoItemColuna.Medida.Largura; valorAcrescimoItemColuna.Desenhar(valorAcrescimoItemColunaX, _y); _y += acrescimoColuna.Medida.Altura; } if (valorDescontoItem > 0.0m || valorAcrescimoItem > 0.0m) { AdicionarTexto valorLiquidoTexto = new AdicionarTexto(g, "Valor Líquido", 7); valorLiquidoTexto.Desenhar(x + 50, _y); AdicionarTexto valorLiquidoTotalTexto = new AdicionarTexto(g, ((detalheTotal + valorAcrescimoItem) - valorDescontoItem).ToString("N2"), 7); int valorLiquidoTotalTextoX = ((x + 246) + tituloColunaTotal) - valorLiquidoTotalTexto.Medida.Largura; valorLiquidoTotalTexto.Desenhar(valorLiquidoTotalTextoX, _y); _y += valorLiquidoTexto.Medida.Altura; } } #endregion #endregion _y += 3; LinhaHorizontal(g, x, _y, larguraLinha); #region totais AdicionarTexto textoQuantidadeTotalItens = new AdicionarTexto(g, "Qtde. total de itens", 7); textoQuantidadeTotalItens.Desenhar(x, _y); AdicionarTexto qtdTotalItens = new AdicionarTexto(g, det.Count.ToString(), 7); int qtdTotalItensX = (larguraLinhaMargemDireita - qtdTotalItens.Medida.Largura); qtdTotalItens.Desenhar(qtdTotalItensX, _y); _y += textoQuantidadeTotalItens.Medida.Altura; AdicionarTexto textoValorTotal = new AdicionarTexto(g, "Valor total R$", 7); textoValorTotal.Desenhar(x, _y); decimal valorTotal = det.Sum(prod => prod.prod.vProd); AdicionarTexto valorTotalTexto = new AdicionarTexto(g, valorTotal.ToString("N2"), 7); int qtdValorTotalX = (larguraLinhaMargemDireita - valorTotalTexto.Medida.Largura); valorTotalTexto.Desenhar(qtdValorTotalX, _y); _y += textoValorTotal.Medida.Altura; decimal totalDesconto = _nfe.infNFe.total.ICMSTot.vDesc; decimal totalOutras = _nfe.infNFe.total.ICMSTot.vOutro; decimal valorTotalAPagar = valorTotal + totalOutras - totalDesconto; if (totalDesconto > 0) { AdicionarTexto textoDesconto = new AdicionarTexto(g, "Desconto R$", 7); textoDesconto.Desenhar(x, _y); AdicionarTexto valorDesconto = new AdicionarTexto(g, totalDesconto.ToString("N2"), 7); int valorDescontoX = (larguraLinhaMargemDireita - valorDesconto.Medida.Largura); valorDesconto.Desenhar(valorDescontoX, _y); _y += textoDesconto.Medida.Altura; } if (totalOutras > 0) { AdicionarTexto textoOutras = new AdicionarTexto(g, "Acréscimo R$", 7); textoOutras.Desenhar(x, _y); AdicionarTexto valorAcrescimo = new AdicionarTexto(g, totalOutras.ToString("N2"), 7); int valorAcrescimoX = (larguraLinhaMargemDireita - valorAcrescimo.Medida.Largura); valorAcrescimo.Desenhar(valorAcrescimoX, _y); _y += textoOutras.Medida.Altura; } if (totalDesconto > 0 || totalOutras > 0) { AdicionarTexto textoValorAPagar = new AdicionarTexto(g, "Valor a Pagar R$", 7); textoValorAPagar.Desenhar(x, _y); AdicionarTexto valorAPagar = new AdicionarTexto(g, valorTotalAPagar.ToString("N2"), 7); int valorAPagarX = (larguraLinhaMargemDireita - valorAPagar.Medida.Largura); valorAPagar.Desenhar(valorAPagarX, _y); _y += textoValorAPagar.Medida.Altura + 2; } AdicionarTexto tituloFormaPagamento = new AdicionarTexto(g, "FORMA PAGAMENTO", 7); tituloFormaPagamento.Desenhar(x, _y); AdicionarTexto tituloValorPago = new AdicionarTexto(g, "VALOR PAGO R$", 7); int tituloValorPagoX = (larguraLinhaMargemDireita - tituloValorPago.Medida.Largura); tituloValorPago.Desenhar(tituloValorPagoX, _y); _y += tituloFormaPagamento.Medida.Altura; foreach (pag pag in _nfe.infNFe.pag) { // v3.1 if (pag.tPag != null) { AdicionaFormaPagamento(x, larguraLinhaMargemDireita, g, pag.tPag, pag.vPag); } // v4.0 if (pag.detPag != null) { foreach (var detPag in pag.detPag) { AdicionaFormaPagamento(x, larguraLinhaMargemDireita, g, detPag.tPag, detPag.vPag); } } } _y += 2; if (_troco > 0) { AdicionarTexto textoTroco = new AdicionarTexto(g, "Troco R$ (TOTAL PAGO R$" + _totalPago.ToString("N2") + ")", 7); textoTroco.Desenhar(x, _y); AdicionarTexto textoTrocoValor = new AdicionarTexto(g, _troco.ToString("N2"), 7); int textoTrocoValorX = (larguraLinhaMargemDireita - textoTrocoValor.Medida.Largura); textoTrocoValor.Desenhar(textoTrocoValorX, _y); _y += textoTroco.Medida.Altura; } #endregion _y += 5; LinhaHorizontal(g, x, _y, larguraLinha); #region consulta QrCode AdicionarTexto textoConsulteChave = new AdicionarTexto(g, "Consulte pela Chave de Acesso em", 7); int textoConsulteChaveX = ((larguraLinha - textoConsulteChave.Medida.Largura) / 2); textoConsulteChave.Desenhar(textoConsulteChaveX, _y); _y += textoConsulteChave.Medida.Altura; AdicionarTexto urlConsulta = new AdicionarTexto(g, string.IsNullOrEmpty(_nfe.infNFeSupl.urlChave) ? _nfe.infNFeSupl.ObterUrlConsulta(_nfe, _configuracaoDanfeNfce.VersaoQrCode) : _nfe.infNFeSupl.urlChave, 7); int urlConsultaX = ((larguraLinha - urlConsulta.Medida.Largura) / 2); urlConsulta.Desenhar(urlConsultaX, _y); _y += urlConsulta.Medida.Altura; string novaChave = GeraChaveAcesso(_nfe); AdicionarTexto chave = new AdicionarTexto(g, novaChave, 7); int urlChaveX = ((larguraLinha - chave.Medida.Largura) / 2); chave.Desenhar(urlChaveX, _y); _y += chave.Medida.Altura; _y += 10; #endregion var mensagemConsumidor = MontaMensagemConsumidor(_nfe.infNFe.dest); var consumidor = new AdicionarTexto(g, mensagemConsumidor, 9); var quebraLinhaConsumidor = new DefineQuebraDeLinha( consumidor, new ComprimentoMaximo(larguraLinhaMargemDireita), consumidor.Medida.Largura); consumidor = quebraLinhaConsumidor.DesenharComQuebras(g); var consumidorX = (larguraLinha - consumidor.Medida.Largura) / 2; consumidor.Desenhar(consumidorX, _y); _y += consumidor.Medida.Altura + 10; var mensagemDadosNfCe = MontaMensagemDadosNfce(_nfe); var dadosNfce = new AdicionarTexto(g, mensagemDadosNfCe, 7); var dadosNfceX = (larguraLinha - dadosNfce.Medida.Largura) / 2; dadosNfce.Desenhar(dadosNfceX, _y); _y += dadosNfce.Medida.Altura; if (_nfe.infNFe.ide.tpEmis == TipoEmissao.teNormal) { var textoProtocoloAutorizacao = new StringBuilder("Protocolo de autorização: "); textoProtocoloAutorizacao.Append(_proc.protNFe.infProt.nProt); var protocoloAutorizacao = new AdicionarTexto(g, textoProtocoloAutorizacao.ToString(), 7); int protocoloAutorizacaoX = (larguraLinha - protocoloAutorizacao.Medida.Largura) / 2; protocoloAutorizacao.Desenhar(protocoloAutorizacaoX, _y); _y += protocoloAutorizacao.Medida.Altura; var textoDataAutorizacao = new StringBuilder("Data de autorização "); textoDataAutorizacao.Append(_proc.protNFe.infProt.dhRecbto.ToString("G")); var dataAutorizacao = new AdicionarTexto(g, textoDataAutorizacao.ToString(), 7); int dataAutorizacaoX = (larguraLinha - dataAutorizacao.Medida.Largura) / 2; dataAutorizacao.Desenhar(dataAutorizacaoX, _y); _y += dataAutorizacao.Medida.Altura; } if (_nfe.infNFe.ide.tpEmis != TipoEmissao.teNormal) { _y += 10; _y = MensagemContingencia(g, larguraLinha, _y); } _y += 8; var urlQrCode = ObtemUrlQrCode(_nfe, _cIdToken, _csc); var qrCodeImagem = QrCode.Gerar(urlQrCode); var qrCodeImagemX = (larguraLinha - qrCodeImagem.Size.Width) / 2; var desenharQrCode = new AdicionarImagem(g, qrCodeImagem, qrCodeImagemX, _y); desenharQrCode.Desenhar(); _y += qrCodeImagem.Size.Height + 10; LinhaHorizontal(g, x, _y, larguraLinha); _y += 5; var tributosIncidentes = _nfe.infNFe.total.ICMSTot.vTotTrib; if (tributosIncidentes != 0) { StringBuilder mensagemTributosTotais = new StringBuilder("Tributos Totais Incidentes (Lei Federal 12.741/2012): R$"); mensagemTributosTotais.Append(tributosIncidentes.ToString("N2")); AdicionarTexto tributosTotais = new AdicionarTexto(g, mensagemTributosTotais.ToString(), 7); int tributosTotaisX = (larguraLinha - tributosTotais.Medida.Largura) / 2; tributosTotais.Desenhar(tributosTotaisX, _y); _y += tributosTotais.Medida.Altura; _y += 5; LinhaHorizontal(g, x, _y, larguraLinha); } string observacoes = string.Empty; if (_nfe != null) { if (_nfe.infNFe != null) { if (_nfe.infNFe.infAdic != null) { observacoes = _nfe.infNFe.infAdic.infCpl; } } } if (!string.IsNullOrEmpty(observacoes)) { _y += 5; var observacao = new AdicionarTexto(g, observacoes, 7); var quebraObservacao = new DefineQuebraDeLinha(observacao, new ComprimentoMaximo(larguraLinhaMargemDireita), observacao.Medida.Largura); observacao = quebraObservacao.DesenharComQuebras(g); observacao.Desenhar(x, _y); _y += observacao.Medida.Altura; } }