public FontFamily CarregarFontePadraoNfceNativa(string font = null) { if (font != null) { FontPadraoNfceNativa = font; return(new FontFamily(font)); } PrivateFontCollection colecaoDeFontes; //todo dispose na coleção var openSans = Fonte.CarregarDeByteArray(Resources.OpenSans_CondBold, out colecaoDeFontes); return(openSans); }
private FontFamily CarregarFontePadraoNfceNativa(string font = null) { PrivateFontCollection colecaoDeFontes = null; try { if (!string.IsNullOrWhiteSpace(font)) { return(new FontFamily(font)); } var openSans = Fonte.CarregarDeByteArray(Resources.OpenSans_CondBold, out colecaoDeFontes); return(openSans); } finally { if (colecaoDeFontes != null) { colecaoDeFontes.Dispose(); } } }
public Graphics GerarNfCe(Graphics graphics) { #region Define fonte e parâmetros iniciais PrivateFontCollection colecaoDeFontes; //todo dispose na coleção var openSans = Fonte.CarregarDeByteArray(Resources.OpenSans_CondBold, out colecaoDeFontes); var fonte = new Font(openSans, 12); const int largImagem = 100; const int larguraLinha = 284; const int espacamentoVertical = 10; const int x = 3; var y = 3; #endregion #region Adiciona Logotipo. Se disponível nas configurações var logo = _configuracaoDanfeNfce.ObterLogo(); if (logo != null) { var centroX = (larguraLinha - (logo.Width / 2)) / 2; graphics.DrawImage(logo, centroX, y + espacamentoVertical, logo.Width, logo.Height); y += logo.Height + espacamentoVertical; } #endregion #region Adiciona Dados Do Cabeçalho var razaoSocial = _proc.NFe.infNFe.emit.xNome; var tpMedidaLinha = MedidasLinha(razaoSocial, fonte); var larguraEscrita = tpMedidaLinha.Item1; var alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(razaoSocial, fonte, Brushes.Black, new PointF(x + largImagem + (larguraLinha - largImagem - larguraEscrita) / 2, y)); y += alturaEscrita; y += 8; fonte = new Font(openSans, 7); var cnpj = "CNPJ: " + _proc.NFe.infNFe.emit.CNPJ; tpMedidaLinha = MedidasLinha(cnpj, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(cnpj, fonte, Brushes.Black, new PointF(x + largImagem + (((larguraLinha - largImagem) - larguraEscrita) / 2), y)); y += alturaEscrita; fonte = new Font(openSans, 7); var logradouro = _proc.NFe.infNFe.emit.enderEmit.xLgr + " " + _proc.NFe.infNFe.emit.enderEmit.nro + ", " + _proc.NFe.infNFe.emit.enderEmit.xCpl + ", Bairro: " + _proc.NFe.infNFe.emit.enderEmit.xBairro + ", " + _proc.NFe.infNFe.emit.enderEmit.xMun + ", " + _proc.NFe.infNFe.emit.enderEmit.UF + " - Fone: " + _proc.NFe.infNFe.emit.enderEmit.fone; logradouro = logradouro.Replace(", ,", ", "); tpMedidaLinha = MedidasLinha(logradouro, fonte); larguraEscrita = tpMedidaLinha.Item1; if (larguraEscrita > (larguraLinha - largImagem)) { var tpQuebraLinha = QuebraDeLinha(logradouro, (larguraLinha - largImagem), fonte); logradouro = tpQuebraLinha.Item1; } var linhas = logradouro.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF(x + largImagem + (((larguraLinha - largImagem) - larguraEscrita) / 2), y)); y += alturaEscrita; } y += 5; graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 2; #endregion var msgDocAuxiliar = "DOCUMENTO AUXILIAR DA NOTA FISCAL DE CONSUMIDOR ELETRÔNICA."; tpMedidaLinha = MedidasLinha(msgDocAuxiliar, fonte); larguraEscrita = tpMedidaLinha.Item1; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(msgDocAuxiliar, larguraLinha, fonte); msgDocAuxiliar = tpQuebraLinha.Item1; } linhas = msgDocAuxiliar.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); fonte = new Font(openSans, 7); #region Cria Colunas Para Descrever Produtos var largColuna = new Dictionary <string, int> { { "COD", 23 }, { "DESCRIÇÃO", 143 }, { "QTD", 20 }, { "UN", 17 }, { "VL.UNIT.", 37 }, { "TOTAL", 37 } }; var iniX = x; var cod = "COD"; MedidasLinha(cod, fonte); graphics.DrawString(cod, fonte, Brushes.Black, new PointF(iniX, y)); iniX += largColuna["COD"]; var descricao = "DESCRIÇÃO"; MedidasLinha(descricao, fonte); graphics.DrawString(descricao, fonte, Brushes.Black, new PointF(iniX, y)); iniX += largColuna["DESCRIÇÃO"]; var qut = "QUT"; tpMedidaLinha = MedidasLinha(qut, fonte); larguraEscrita = tpMedidaLinha.Item1; graphics.DrawString(qut, fonte, Brushes.Black, new PointF((iniX + largColuna["QTD"]) - larguraEscrita, y)); iniX += largColuna["QTD"]; var un = "UN"; tpMedidaLinha = MedidasLinha(un, fonte); larguraEscrita = tpMedidaLinha.Item1; graphics.DrawString(un, fonte, Brushes.Black, new PointF((iniX + largColuna["UN"]) - larguraEscrita, y)); iniX += largColuna["UN"]; var vlUnit = "VL.UNIT."; tpMedidaLinha = MedidasLinha(vlUnit, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(vlUnit, fonte, Brushes.Black, new PointF((iniX + largColuna["VL.UNIT."]) - larguraEscrita, y)); iniX += largColuna["VL.UNIT."]; var total = "TOTAL"; tpMedidaLinha = MedidasLinha("TOTAL", fonte); larguraEscrita = tpMedidaLinha.Item1; graphics.DrawString(total, fonte, Brushes.Black, new PointF((iniX + largColuna["TOTAL"]) - larguraEscrita, y)); y += alturaEscrita; decimal qutTotalItens = 0; decimal valorTotal = 0; decimal desconto = 0; #endregion #region Adiciona Produtos foreach (var det in _proc.NFe.infNFe.det) { iniX = x; cod = det.prod.cProd; MedidasLinha(cod, fonte); graphics.DrawString(cod, fonte, Brushes.Black, new PointF(iniX, y)); iniX += largColuna["COD"]; descricao = det.prod.xProd; tpMedidaLinha = MedidasLinha(descricao, fonte); larguraEscrita = tpMedidaLinha.Item1; if (larguraEscrita > largColuna["DESCRIÇÃO"]) { var tpQuebraLinha = QuebraDeLinha(descricao, largColuna["DESCRIÇÃO"], fonte); descricao = tpQuebraLinha.Item1; } linhas = descricao.Split('\n'); var n = 0; foreach (var lin in linhas) { n++; tpMedidaLinha = MedidasLinha(lin, fonte); alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF(iniX, y)); if (n < linhas.Length) { y += alturaEscrita; } } iniX += largColuna["DESCRIÇÃO"]; n--; qut = det.prod.qCom.ToString("0"); tpMedidaLinha = MedidasLinha(qut, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(qut, fonte, Brushes.Black, new PointF((iniX + largColuna["QTD"]) - larguraEscrita, y - (alturaEscrita * n))); iniX += largColuna["QTD"]; un = det.prod.uCom; tpMedidaLinha = MedidasLinha(un, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(un, fonte, Brushes.Black, new PointF((iniX + largColuna["UN"]) - larguraEscrita, y - (alturaEscrita * n))); iniX += largColuna["UN"]; vlUnit = det.prod.vUnCom.ToString("0.00"); tpMedidaLinha = MedidasLinha(vlUnit, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(vlUnit, fonte, Brushes.Black, new PointF((iniX + largColuna["VL.UNIT."]) - larguraEscrita, y - (alturaEscrita * n))); iniX += largColuna["VL.UNIT."]; total = det.prod.vProd.ToString("0.00"); tpMedidaLinha = MedidasLinha(total, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(total, fonte, Brushes.Black, new PointF((iniX + largColuna["TOTAL"]) - larguraEscrita, y - (alturaEscrita * n))); y += alturaEscrita; qutTotalItens = qutTotalItens + det.prod.qCom; valorTotal = valorTotal + det.prod.vProd; desconto = desconto + Convert.ToDecimal(det.prod.vDesc); } var valorPagar = valorTotal - desconto; graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 3; #endregion //Adiciona Detalhes Da Venda fonte = new Font(openSans, 8); graphics.DrawString("QTD TOTAL DE ITENS", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha(qutTotalItens.ToString("0"), fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(qutTotalItens.ToString("0"), fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita; graphics.DrawString("VALOR TOTAL R$", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha(valorTotal.ToString("0.00"), fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(valorTotal.ToString("0.00"), fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita; if (desconto > 0) //Imprime somente quando houver desconto { graphics.DrawString("DESCONTO R$", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha(desconto.ToString("0.00"), fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(desconto.ToString("0.00"), fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita; graphics.DrawString("VALOR A PAGAR R$", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha(valorPagar.ToString("0.00"), fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(valorPagar.ToString("0.00"), fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita + 10; } graphics.DrawString("FORMA DE PAGAMENTO", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha("VALOR PAGO", fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString("VALOR PAGO", fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita; var troco = "0,00"; var infTributos = ""; //Prepara Informação Adicional, Para Adicionar No Final Do Cupom if (_proc.NFe.infNFe.infAdic != null) { linhas = _proc.NFe.infNFe.infAdic.infCpl.Split('|'); foreach (var lin in linhas) { if (lin.Contains("TROCO")) { troco = lin.Substring(lin.IndexOf(":", StringComparison.Ordinal) + 2); } else if (lin.Contains("Tributos Totais Incidentes")) { infTributos = lin; } } } //Adiciona Descrição Do Pagamento foreach (var pag in _proc.NFe.infNFe.pag) { var formaPagamento = EnumHelper <Classes.Informacoes.Pagamento.FormaPagamento> .GetEnumDescription(pag.tPag.ToString()); graphics.DrawString(formaPagamento, fonte, Brushes.Black, new PointF(x, y)); var valorPagamento = pag.vPag.ToString("0.00"); if (formaPagamento == "Dinheiro" && troco != "0,00") { valorPagamento = (Convert.ToDecimal(valorPagamento) + Convert.ToDecimal(troco)).ToString("0.00"); } tpMedidaLinha = MedidasLinha(valorPagamento, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(valorPagamento, fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita; } if (troco != "0,00") //Imprime somente quando houver Troco { graphics.DrawString("Troco R$", fonte, Brushes.Black, new PointF(x, y)); tpMedidaLinha = MedidasLinha(troco, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(troco, fonte, Brushes.Black, new PointF(larguraLinha - larguraEscrita, y)); y += alturaEscrita + 5; } graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 2; //Adiciona Detalhes Do Cupom var msgConsulta = "Consulte Pela Chave De Acesso Em www.sefaz.rs.gov.br/NFCE"; tpMedidaLinha = MedidasLinha(msgConsulta, fonte); larguraEscrita = tpMedidaLinha.Item1; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(msgConsulta, larguraLinha, fonte); msgConsulta = tpQuebraLinha.Item1; } linhas = msgConsulta.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } var nProc = _proc.NFe.infNFe.Id.Substring(3); tpMedidaLinha = MedidasLinha(nProc, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(nProc, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; y += 5; //Adiciona Identificação Do Consumidor var infconsumidor = ""; try { infconsumidor = _proc.NFe.infNFe.dest.CPF; if (_proc.NFe.infNFe.dest.CPF == "") { infconsumidor = "CONSUMIDOR NÃO IDENTIFICADO"; } else { infconsumidor = "CONSUMIDOR CPF: " + infconsumidor; } } catch { infconsumidor = "CONSUMIDOR NÃO IDENTIFICADO"; } fonte = new Font(openSans, 10); tpMedidaLinha = MedidasLinha(infconsumidor, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(infconsumidor, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; y += 8; //Adiciona Dados Do Protocolo fonte = new Font(openSans, 8); var nCupom = "NFC-e Nº C" + _proc.NFe.infNFe.ide.nNF + " Série " + _proc.NFe.infNFe.ide.serie + " Emissão " + Convert.ToDateTime(_proc.NFe.infNFe.ide.dhEmi).ToShortDateString() + " " + Convert.ToDateTime(_proc.NFe.infNFe.ide.dhEmi).ToShortTimeString(); tpMedidaLinha = MedidasLinha(nCupom, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(nCupom, larguraLinha, fonte); nCupom = tpQuebraLinha.Item1; } linhas = nCupom.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } var nProtocolo = "Protocolo De Autorização: " + _proc.protNFe.infProt.nProt; tpMedidaLinha = MedidasLinha(nProtocolo, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(nProtocolo, larguraLinha, fonte); nProtocolo = tpQuebraLinha.Item1; } linhas = nProtocolo.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } var dataAutorizacao = "Data De Autorização: " + Convert.ToDateTime(_proc.protNFe.infProt.dhRecbto).ToShortDateString() + " " + Convert.ToDateTime(_proc.protNFe.infProt.dhRecbto).ToShortTimeString(); tpMedidaLinha = MedidasLinha(dataAutorizacao, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(dataAutorizacao, larguraLinha, fonte); dataAutorizacao = tpQuebraLinha.Item1; } linhas = dataAutorizacao.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 10; //Adiciona QrCode var qrCode = GerarQrCode(130, 130, _proc.NFe.infNFeSupl == null ? Utils.InformacoesSuplementares.ExtinfNFeSupl.ObterUrlQrCode(_proc.NFe.infNFeSupl, _proc.NFe, _cIdToken, _csc) : _proc.NFe.infNFeSupl.qrCode); graphics.DrawImage(qrCode, new Point(x + (larguraLinha - qrCode.Size.Width) / 2, y)); y += qrCode.Size.Height; y += 10; graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 5; var impIncidentes = infTributos; tpMedidaLinha = MedidasLinha(impIncidentes, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(impIncidentes, larguraLinha, fonte); impIncidentes = tpQuebraLinha.Item1; } linhas = impIncidentes.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y)); y += alturaEscrita; } y += 5; if (_proc.NFe.infNFe.infAdic != null) { graphics.DrawLine(Pens.Black, x, y, larguraLinha, y); y += 5; fonte = new Font(openSans, 7); var infCpl = _proc.NFe.infNFe.infAdic.infCpl.Split('|'); foreach (var inf in infCpl) { if (inf.Contains("TROCO") == false && inf.Contains("Tributos Totais") == false) { var observacao = inf; tpMedidaLinha = MedidasLinha(observacao, fonte); larguraEscrita = tpMedidaLinha.Item1; if (larguraEscrita > larguraLinha) { var tpQuebraLinha = QuebraDeLinha(observacao, larguraLinha, fonte); observacao = tpQuebraLinha.Item1; } linhas = observacao.Split('\n'); foreach (var lin in linhas) { tpMedidaLinha = MedidasLinha(lin, fonte); larguraEscrita = tpMedidaLinha.Item1; alturaEscrita = tpMedidaLinha.Item2; graphics.DrawString(lin, fonte, Brushes.Black, new PointF((larguraLinha - larguraEscrita) / 2, y));//Deixa Centralizado y += alturaEscrita; } } } } return(graphics); }