/// <summary> /// Obtém a URL para uso no QR-Code, versão 2.0 - leiaute 4.00 /// </summary> private static string ObterUrlQrCode2(infNFeSupl infNFeSupl, Classes.NFe nfe, string cIdToken, string csc, VersaoServico versaoServico) { #region 1ª parte var url = ObterUrlQrCode2ComParametro(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, versaoServico); #endregion #region 2ª parte const string pipe = "|"; //Chave de Acesso da NFC-e var chave = nfe.infNFe.Id.Substring(3); //Identificação do Ambiente (1 – Produção, 2 – Homologação) var ambiente = (int)nfe.infNFe.ide.tpAmb; //Identificador do CSC (Código de Segurança do Contribuinte no Banco de Dados da SEFAZ). Informar sem os zeros não significativos var idCsc = Convert.ToInt16(cIdToken); string dadosBase; if (nfe.infNFe.ide.tpEmis == TipoEmissao.teOffLine) { var diaEmi = nfe.infNFe.ide.dhEmi.Day.ToString("D2"); var valorNfce = nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.'); var digVal = Conversao.ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue); dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, diaEmi, pipe, valorNfce, pipe, digVal, pipe, idCsc); } else { dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, idCsc); } var dadosSha1 = string.Concat(dadosBase, csc); var sh1 = Conversao.ObterHexSha1DeString(dadosSha1); return(string.Concat(url, dadosBase, pipe, sh1)); #endregion }
private void GeranNfe(VersaoServico versaoServico, ModeloDocumento modelo) { try { #region Gerar NFe var numero = Funcoes.InpuBox(this, "Criar e Enviar NFe", "Número da Nota:"); if (String.IsNullOrEmpty(numero)) { throw new Exception("O Número deve ser informado!"); } _nfe = GetNf(Convert.ToInt32(numero), modelo, versaoServico); _nfe.Assina().Valida(); #endregion ExibeNfe(); var dlg = new SaveFileDialog { FileName = _nfe.infNFe.Id.Substring(3), DefaultExt = ".xml", Filter = "Arquivo XML (.xml)|*.xml" }; var result = dlg.ShowDialog(); if (result != true) { return; } var arquivoXml = dlg.FileName; _nfe.SalvarArquivoXml(arquivoXml); } catch (Exception ex) { if (!String.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
public void Prot(string caminho) { try { var arquivoXml = caminho; var nfe = new Classes.NFe().CarregarDeArquivoXml(arquivoXml); var chave = nfe.infNFe.Id.Substring(3); if (string.IsNullOrEmpty(chave)) { throw new Exception("A Chave da NFe não foi encontrada no arquivo!"); } if (chave.Length != 44) { throw new Exception("Chave deve conter 44 caracteres!"); } var servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoConsulta = servicoNFe.NfeConsultaProtocolo(chave); TrataRetorno(retornoConsulta); var nfeproc = new nfeProc { NFe = nfe, protNFe = retornoConsulta.Retorno.protNFe, versao = retornoConsulta.Retorno.versao }; var novoArquivo = _path + "\\Autorizados\\" + @"\" + nfeproc.protNFe.infProt.chNFe + "-procNfe.xml"; FuncoesXml.ClasseParaArquivoXml(nfeproc, novoArquivo); //Funcoes.Mensagem("Arquivo salvo em " + novoArquivo, "Atenção", MessageBoxButton.OK); Impressora.ImprimirDanferE(novoArquivo); } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
/// <summary> /// Assina um objeto NFe /// </summary> /// <param name="nfe"></param> /// <returns>Retorna um objeto do tipo NFe assinado</returns> public static Classes.NFe Assina(this Classes.NFe nfe) { var nfeLocal = nfe; if (nfeLocal == null) { throw new ArgumentNullException("nfe"); } #region Define cNF var tamanhocNf = 9; var versao = (decimal.Parse(nfeLocal.infNFe.versao, CultureInfo.InvariantCulture)); if (versao >= 2) { tamanhocNf = 8; } nfeLocal.infNFe.ide.cNF = Convert.ToInt32(nfeLocal.infNFe.ide.cNF).ToString().PadLeft(tamanhocNf, '0'); #endregion var modeloDocumentoFiscal = nfeLocal.infNFe.ide.mod; var tipoEmissao = (int)nfeLocal.infNFe.ide.tpEmis; var codigoNumerico = int.Parse(nfeLocal.infNFe.ide.cNF); var estado = nfeLocal.infNFe.ide.cUF; var dataEHoraEmissao = nfeLocal.infNFe.ide.dhEmi; var cnpj = nfeLocal.infNFe.emit.CNPJ; var numeroDocumento = nfeLocal.infNFe.ide.nNF; var serie = nfeLocal.infNFe.ide.serie; var dadosChave = ChaveFiscal.ObterChave(estado, dataEHoraEmissao, cnpj, modeloDocumentoFiscal, serie, numeroDocumento, tipoEmissao, codigoNumerico); nfeLocal.infNFe.Id = "NFe" + dadosChave.Chave; nfeLocal.infNFe.ide.cDV = Convert.ToInt16(dadosChave.DigitoVerificador); var assinatura = Assinador.ObterAssinatura(nfeLocal, nfeLocal.infNFe.Id); nfeLocal.Signature = assinatura; return(nfeLocal); }
/// <summary> /// Gera id, cdv, assina e faz alguns ajustes nos dados da classe NFe antes de utilizá-la /// </summary> /// <param name="nfe"></param> /// <returns>Retorna um objeto NFe devidamente tradado</returns> public static Classes.NFe Valida(this Classes.NFe nfe) { if (nfe == null) { throw new ArgumentNullException("nfe"); } var versao = (Decimal.Parse(nfe.infNFe.versao, CultureInfo.InvariantCulture)); var xmlNfe = nfe.ObterXmlString(); var cfgServico = ConfiguracaoServico.Instancia; if (versao < 3) { Validador.Valida(ServicoNFe.NfeRecepcao, cfgServico.VersaoNfeRecepcao, xmlNfe, false); } if (versao >= 3) { Validador.Valida(ServicoNFe.NFeAutorizacao, cfgServico.VersaoNFeAutorizacao, xmlNfe, false); } return(nfe); //Para uso no formato fluent }
private void BtnCriareEnviarNfce_Click(object sender, RoutedEventArgs e) { try { #region Cria e Envia NFe var numero = Funcoes.InpuBox(this, "Criar e Enviar NFCe", "Número da NFCe:"); if (String.IsNullOrEmpty(numero)) { throw new Exception("O Número deve ser informado!"); } var lote = Funcoes.InpuBox(this, "Criar e Enviar NFCe", "Id do Lote:"); if (String.IsNullOrEmpty(lote)) { throw new Exception("A Id do lote deve ser informada!"); } _nfe = GetNf(Convert.ToInt32(numero), ModeloDocumento.NFCe, _configuracoes.CfgServico.VersaoNFeAutorizacao); _nfe.Assina(); //não precisa validar aqui, pois o lote será validado em ServicosNFe.NFeAutorizacao var servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, new List <Classes.NFe> { _nfe }); TrataRetorno(retornoEnvio); #endregion } catch (Exception ex) { if (!String.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
private void BtnNfceDanfeOff_Click(object sender, RoutedEventArgs e) { try { #region Carrega um XML com nfeProc para a variável var arquivoXml = Funcoes.BuscarArquivoXml(); if (string.IsNullOrEmpty(arquivoXml)) { return; } var nfe = new Classes.NFe().CarregarDeArquivoXml(arquivoXml); if (nfe.infNFe.ide.mod != ModeloDocumento.NFCe) { throw new Exception("O XML informado não é um NFCe!"); } #endregion #region Abre a visualização do relatório para impressão var danfe = new DanfeFrNfce(nfe, _configuracoes.ConfiguracaoDanfeNfce, _configuracoes.CIdToken, _configuracoes.Csc); danfe.Visualizar(); //danfe.Imprimir(); //danfe.ExibirDesign(); //danfe.ExportarPdf(@"d:\teste.pdf"); #endregion } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
/// <summary> /// Obtém a URL para uso no QR-Code /// </summary> /// <param name="nfe"></param> /// <param name="configuracaoDanfeNfce"></param> /// <returns></returns> public static string ObterUrlQrCode(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce) { //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA; var dhEmi = ObterHexDeString(nfe.infNFe.ide.dhEmi); //Passo 2: Converter o valor do Digest Value da NFC-e (digVal) para HEXA; //Ao se efetuar a assinatura digital da NFCe emitida em contingência off-line, o campo digest value constante da XMl Signature deve obrigatoriamente ser idêntico ao encontrado quando da geração do digest value para a montagem QR Code. //Ver página 18 do Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2 if (nfe.Signature == null) { throw new Exception("Não é possível obter a URL do QR-Code de uma NFCe não assinada!"); } var digVal = ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue); //Na hipótese do consumidor não se identificar, não existirá o parâmetro cDest no QR Code; var cDest = ""; if (nfe.infNFe.dest != null) { cDest = "&cDest=" + nfe.infNFe.dest.CPF + nfe.infNFe.dest.CNPJ + nfe.infNFe.dest.idEstrangeiro; } //Passo 3: Substituir os valores (“dhEmi” e “digVal”) nos parâmetros; var dadosBase = "chNFe=" + nfe.infNFe.Id.Substring(3) + "&nVersao=100&tpAmb=" + ((int)nfe.infNFe.ide.tpAmb) + cDest + "&dhEmi=" + dhEmi + "&vNF=" + nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.') + "&vICMS=" + nfe.infNFe.total.ICMSTot.vICMS.ToString("0.00").Replace(',', '.') + "&digVal=" + digVal + "&cIdToken=" + configuracaoDanfeNfce.cIdToken; //Passo 4: Adicionar, ao final dos parâmetros, o CSC (CSC do contribuinte disponibilizado pela SEFAZ do Estado onde a empresa esta localizada): var dadosParaSh1 = dadosBase + configuracaoDanfeNfce.CSC; //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. Asaída do algoritmo SHA-1 deve ser em HEXADECIMAL. var sha1ComCsc = ObterHexSha1DeString(dadosParaSh1); //Passo 6: Adicione o resultado sem o CSC e gere a imagem do QR Code: 1º parte (endereço da consulta) +2º parte (tabela 3 com indicação SIM na última coluna). return(ObterUrl(nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlDanfeNfce.UrlQrCode) + "?" + dadosBase + "&cHashQRCode=" + sha1ComCsc); }
private void BtnAdicionaNfeproc_Click(object sender, RoutedEventArgs e) { try { var arquivoXml = Funcoes.BuscarArquivoXml(); var nfe = new Classes.NFe().CarregarDeArquivoXml(arquivoXml); var chave = nfe.infNFe.Id.Substring(3); if (String.IsNullOrEmpty(chave)) { throw new Exception("A Chave da NFe não foi encontrada no arquivo!"); } if (chave.Length != 44) { throw new Exception("Chave deve conter 44 caracteres!"); } var servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoConsulta = servicoNFe.NfeConsultaProtocolo(chave); TrataRetorno(retornoConsulta); var nfeproc = new nfeProc { NFe = nfe, protNFe = retornoConsulta.Retorno.protNFe, versao = retornoConsulta.Retorno.versao }; var novoArquivo = Path.GetDirectoryName(arquivoXml) + @"\" + nfeproc.protNFe.infProt.chNFe + "-procNfe.xml"; FuncoesXml.ClasseParaArquivoXml(nfeproc, novoArquivo); Funcoes.Mensagem("Arquivo salvo em " + novoArquivo, "Atenção", MessageBoxButton.OK); } catch (Exception ex) { if (!String.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
private void CarregaArquivoNfe() { var arquivoXml = Funcoes.BuscarArquivoXml(); _nfe = new Classes.NFe().CarregarDeArquivoXml(arquivoXml); }
/// <summary> /// Envia um evento do tipo "EPEC" /// </summary> /// <param name="idlote"></param> /// <param name="sequenciaEvento"></param> /// <param name="nfe"></param> /// <param name="veraplic"></param> /// <returns>Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento</returns> public RetornoRecepcaoEvento RecepcaoEventoEpec(int idlote, int sequenciaEvento, Classes.NFe nfe, string veraplic) { var versaoServico = Auxiliar.VersaoServicoParaString(ServicoNFe.RecepcaoEvento, _cFgServico.VersaoRecepcaoEvento); if (String.IsNullOrEmpty(nfe.infNFe.Id)) { nfe.Assina().Valida(); } var detevento = new detEvento { versao = versaoServico, cOrgaoAutor = nfe.infNFe.ide.cUF, tpAutor = TipoAutor.taEmpresaEmitente, verAplic = veraplic, dhEmi = !String.IsNullOrEmpty(nfe.infNFe.ide.dhEmi) ? nfe.infNFe.ide.dhEmi : Convert.ToDateTime(nfe.infNFe.ide.dEmi).ToString("yyyy-MM-ddTHH:mm:sszzz"), tpNF = nfe.infNFe.ide.tpNF, IE = nfe.infNFe.emit.IE, dest = new dest { UF = nfe.infNFe.dest.enderDest.UF, CNPJ = nfe.infNFe.dest.CNPJ, CPF = nfe.infNFe.dest.CPF, IE = nfe.infNFe.dest.IE, vNF = nfe.infNFe.total.ICMSTot.vNF, vICMS = nfe.infNFe.total.ICMSTot.vICMS, vST = nfe.infNFe.total.ICMSTot.vST } }; var infEvento = new infEventoEnv { cOrgao = Estado.AN, tpAmb = nfe.infNFe.ide.tpAmb, CNPJ = nfe.infNFe.emit.CNPJ, CPF = nfe.infNFe.emit.CPF, chNFe = nfe.infNFe.Id.Substring(3), dhEvento = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz"), tpEvento = 110140, nSeqEvento = sequenciaEvento, verEvento = versaoServico, detEvento = detevento }; var evento = new evento { versao = versaoServico, infEvento = infEvento }; var retorno = RecepcaoEvento(idlote, new List <evento> { evento }, TipoRecepcaoEvento.Epec); return(retorno); }
/// <summary> /// Construtor da classe responsável pela impressão do DANFE da NFCe em Fast Reports. /// Use esse construtor apenas para impressão em contingência, já que neste modo ainda não é possível obter o grupo protNFe /// </summary> /// <param name="nfe">Objeto do tipo NFe</param> /// <param name="configuracaoDanfeNfce">Objeto do tipo ConfiguracaoDanfeNfce contendo as definições de impressão</param> /// <param name="cIdToken">Identificador do CSC – Código de Segurança do Contribuinte no Banco de Dados da SEFAZ</param> /// <param name="csc">Código de Segurança do Contribuinte(antigo Token)</param> public DanfeFrNfce(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc) : this(new nfeProc() { NFe = nfe }, configuracaoDanfeNfce, cIdToken, csc) { }
/// <summary> /// Carrega um arquivo XML para um objeto da classe NFe /// </summary> /// <param name="nfe"></param> /// <param name="arquivoXml">arquivo XML</param> /// <returns>Retorna uma NFe carregada com os dados do XML</returns> public static Classes.NFe CarregarDeArquivoXml(this Classes.NFe nfe, string arquivoXml) { var s = FuncoesXml.ObterNodeDeArquivoXml(typeof(Classes.NFe).Name, arquivoXml); return(FuncoesXml.XmlStringParaClasse <Classes.NFe>(s)); }
/// <summary> /// Construtor da classe reponsável pela impressão do DANFE da NFe em Fast Reports. /// Use esse construtor apenas para impressão em contigência, já que neste modo ainda não é possível obter o grupo protNFe /// </summary> /// <param name="nfe">Objeto do tipo NFe</param> /// <param name="configuracaoDanfeNfe">Objeto do tipo ConfiguracaoDanfeNfe contendo as definições de impressão</param> public DanfeFrNfe(Classes.NFe nfe, ConfiguracaoDanfeNfe configuracaoDanfeNfe) : this(new nfeProc() { NFe = nfe }, configuracaoDanfeNfe) { }
/// <summary> /// Construtor da classe responsável pela impressão do DANFE da NFCe em Fast Reports. /// Use esse construtor apenas para impressão em contingência, já que neste modo ainda não é possível obter o grupo protNFe /// </summary> /// <param name="nfe">Objeto do tipo NFe</param> /// <param name="configuracaoDanfeNfce">Objeto do tipo ConfiguracaoDanfeNfce contendo as definições de impressão</param> /// <param name="cIdToken">Identificador do CSC – Código de Segurança do Contribuinte no Banco de Dados da SEFAZ</param> /// <param name="csc">Código de Segurança do Contribuinte(antigo Token)</param> /// <param name="textoRodape">Texto para ser impresso no final do documento</param> public DanfeFrNfce(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc, string textoRodape = "") : this(new nfeProc() { NFe = nfe }, configuracaoDanfeNfce, cIdToken, csc, arquivoRelatorio : string.Empty, textoRodape : textoRodape) { }
private void BtnCriareEnviar3_Click(object sender, RoutedEventArgs e) { try { #region Cria e Envia NFe var numero = Funcoes.InpuBox("Criar e Enviar NFe", "Número da Nota:"); if (string.IsNullOrEmpty(numero)) { throw new Exception("O Número deve ser informado!"); } var lote = Funcoes.InpuBox("Criar e Enviar NFe", "Id do Lote:"); if (string.IsNullOrEmpty(lote)) { throw new Exception("A Id do lote deve ser informada!"); } _nfe = GetNf(Convert.ToInt32(numero), _configuracoes.CfgServico.ModeloDocumento, _configuracoes.CfgServico.VersaoNFeAutorizacao); _nfe.Assina(); //não precisa validar aqui, pois o lote será validado em ServicosNFe.NFeAutorizacao //A URL do QR-Code deve ser gerada em um objeto nfe já assinado, pois na URL vai o DigestValue que é gerado por ocasião da assinatura //Descomente a linha abaixo se a SEFAZ de sua UF já habilitou a NT2015.002 _nfe.infNFeSupl = new infNFeSupl() { qrCode = EnderecadorDanfeNfce.ObterUrlQrCode(_nfe, _configuracoes.ConfiguracaoDanfeNfce) }; //Define a URL do QR-Code. var servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, new List <Classes.NFe> { _nfe }, true /*Envia a mensagem compactada para a SEFAZ*/); TrataRetorno(retornoEnvio); if (retornoEnvio.Retorno.infRec.nRec != string.Empty) { try { #region Consulta Recibo de lote servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoRecibo = servicoNFe.NFeRetAutorizacao(retornoEnvio.Retorno.infRec.nRec); TrataRetorno(retornoRecibo); //var dlg = new SaveFileDialog //{ // FileName = _nfe.infNFe.Id.Substring(3), // DefaultExt = ".xml", // Filter = "Arquivo XML (.xml)|*.xml" //}; //var result = dlg.ShowDialog(); //if (result != true) return; //var arquivoXml = dlg.FileName; string ch = _nfe.infNFe.Id.Substring(3); _nfe.SalvarArquivoXml(_path + "\\NFCe\\" + ch + ".xml"); Prot(_path + "\\NFCe\\" + ch + ".xml"); #endregion } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } } #endregion } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) { Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } } }
/// <summary> /// Construtor da classe responsável pela impressão do DANFE da NFe em Fast Reports. /// Use esse construtor apenas para impressão em contingência, já que neste modo ainda não é possível obter o grupo protNFe /// </summary> /// <param name="nfe">Objeto do tipo <see cref="Classes.NFe"/></param> /// <param name="configuracaoDanfeNfe">Objeto do tipo <see cref="ConfiguracaoDanfeNfe"/> contendo as definições de impressão</param> /// <param name="desenvolvedor">Texto do desenvolvedor a ser informado no DANFE</param> public DanfeFrNfe(Classes.NFe nfe, ConfiguracaoDanfeNfe configuracaoDanfeNfe, string desenvolvedor) : this(new nfeProc() { NFe = nfe }, configuracaoDanfeNfe, desenvolvedor) { }
/// <summary> /// Converte o objeto NFe para uma string no formato XML /// </summary> /// <param name="nfe"></param> /// <returns>Retorna uma string no formato XML com os dados da NFe</returns> public static string ObterXmlString(this Classes.NFe nfe) { return(FuncoesXml.ClasseParaXmlString(nfe)); }
/// <summary> /// Obtém a URL de consulta pela chave /// </summary> public static string ObterUrlConsulta(this infNFeSupl infNFeSupl, Classes.NFe nfe, VersaoQrCode versaoQrCode) { var versaoServico = Conversao.StringParaVersaoServico(nfe.infNFe.versao); return(ObterUrl(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlConsultaPublica.UrlConsulta, versaoServico, versaoQrCode)); }
/// <summary> /// Coverte uma string XML no formato NFe para um objeto NFe /// </summary> /// <param name="nfe"></param> /// <param name="xmlString"></param> /// <returns>Retorna um objeto do tipo NFe</returns> public static Classes.NFe CarregarDeXmlString(this Classes.NFe nfe, string xmlString) { var s = FuncoesXml.ObterNodeDeStringXml(typeof(Classes.NFe).Name, xmlString); return(FuncoesXml.XmlStringParaClasse <Classes.NFe>(s)); }
/// <summary> /// Grava os dados do objeto NFe em um arquivo XML /// </summary> /// <param name="nfe">Objeto NFe</param> /// <param name="arquivoXml">Diretório com nome do arquivo a ser gravado</param> public static void SalvarArquivoXml(this Classes.NFe nfe, string arquivoXml) { FuncoesXml.ClasseParaArquivoXml(nfe, arquivoXml); }
private void BtnNfceDanfeOff_Click(object sender, RoutedEventArgs e) { try { #region Carrega um XML com nfeProc para a variável var arquivoXml = Funcoes.BuscarArquivoXml(); if (string.IsNullOrEmpty(arquivoXml)) return; var nfe = new Classes.NFe().CarregarDeArquivoXml(arquivoXml); if (nfe.infNFe.ide.mod != ModeloDocumento.NFCe) throw new Exception("O XML informado não é um NFCe!"); #endregion #region Abre a visualização do relatório para impressão var danfe = new DanfeFrNfce(nfe, _configuracoes.ConfiguracaoDanfeNfce, _configuracoes.CIdToken, _configuracoes.Csc); danfe.Visualizar(); //danfe.Imprimir(); //danfe.ExibirDesign(); //danfe.ExportarPdf(@"d:\teste.pdf"); #endregion } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } }