Ir para conteúdo
  • Cadastre-se

dev botao

Erro: -10, Access violation ao chamar NFE_ImprimirPDF


Ver Solução Respondido por Daniel InfoCotidiano,

Recommended Posts

  • Membros Pro

Boa tarde! Seguindo dúvida no Discord.

Ao tentar imprimir (criar) o PDF eu estou recebendo -10 access violation.

 

Inicialmente, eu não limpava a lista antes de gerar o PDF, e ele gerava normalmente, porém quando eu ia emitir uma segunda NFCe, não conseguia gerar o PDF, e tinha que reiniciar a API.

Depois da ajuda no Discord, passei a chamar o NFE_LimparLista antes de carregar o XML, porém agora não gera nem o primeiro PDF.

Estou usando o ACBrLibNFe64.dll ST versão 1.4.7.308.

 

Estou chamando o método da seguinte maneira (logo após gerar a NFCe):

try:
acbr_lib.limpar_lista()
except Exception as e:
log.logger.error("Erro ao limpar a lista: ", traceback.format_exc())

try:
acbr_lib.carregar_xml(nome_arquivo_xml)
except Exception as e:
log.logger.error("Erro ao salvar o XML da NFe: ", traceback.format_exc())

nome_arquivo = f"{chave_acesso}_{data_str}"
try:
acbr_lib.imprimir_pdf(nome_arquivo)
except Exception as e:
log.logger.error("Erro ao imprimir PDF: ", traceback.format_exc())

 

Meus métodos estão configurados da forma:

	def limpar_lista(self):
        # Define os tipos de argumentos e retorno da função NFE_LimparLista
        self.acbr_nfe.NFE_LimparLista.argtypes = [POINTER(c_int)]
        self.acbr_nfe.NFE_LimparLista.restype = c_int
        
        # Chama a função NFE_LimparLista
        resposta = self.acbr_nfe.NFE_LimparLista(self.ponteiro)
        
        # Verifica o resultado e retorna a resposta adequada
        if resposta == 0:
            return True  # Sucesso
        elif resposta == -1:
            raise Exception("Erro: A biblioteca não foi inicializada.")
        elif resposta == -10:
            raise Exception("Erro: Houve um erro ao limpar a lista.")
        else:
            raise Exception(f"Erro desconhecido: {resposta}")

 

	def imprimir_pdf(self, nome_pdf):
        # Configure o caminho onde o PDF será salvo
        self.configurar_valor("DANFE", "PathPDF", PATH_PDF)
        self.configurar_valor("DANFE", "NomeDocumento", f"{nome_pdf}.pdf")
        
        # Configura os tipos de argumentos e retorno do método NFE_ImprimirPDF
        self.acbr_nfe.NFE_ImprimirPDF.argtypes = [POINTER(c_int)]
        self.acbr_nfe.NFE_ImprimirPDF.restype = c_int
        tamanho = self.define_bufferResposta(8888888) # tentei com um buffer menor também mas continuou o problema
        if self.ponteiro is None:
            raise Exception("Erro: A biblioteca não foi inicializada corretamente.")

        # Chama o método para gerar o PDF
        resposta = self.acbr_nfe.NFE_ImprimirPDF(self.ponteiro)
        if resposta == 0:
            return True
        return False

 

Segue log:

Quote

14/10/24 12:58:32:069 - NFE_LimparLista
14/10/24 12:58:32:072 - Travar
14/10/24 12:58:32:076 -    SetRetorno(0, 0 NFe(s) Carregada(s))
14/10/24 12:58:32:080 - Destravar
14/10/24 12:58:32:084 - NFE_CarregarXML(d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\docs_fiscais\xmls_nfe\35241006083500000463650310000000981626420580_20241014125829.xml )
14/10/24 12:58:32:088 - Travar
14/10/24 12:58:32:092 -    SetRetorno(0, 1 NFe(s) Carregada(s))
14/10/24 12:58:32:097 - Destravar
14/10/24 12:58:32:101 - TACBrLibNFe.PrecisaCriptografar(DANFE,PathPDF)
14/10/24 12:58:32:105 - TACBrLibNFe.PrecisaCriptografar - Feito Result: False
14/10/24 12:58:32:108 - LIB_ConfigGravarValor(DANFE, PathPDF, d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\docs_fiscais\pdfs_nfe)
14/10/24 12:58:32:113 - Travar
14/10/24 12:58:32:117 - TLibNFeConfig.Ler: d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\dist\ACBrLib.ini
14/10/24 12:58:32:127 - TLibNFeConfig.AplicarConfiguracoes: d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\dist\ACBrLib.ini
14/10/24 12:58:32:132 - Travar
14/10/24 12:58:32:136 - TLibNFeConfig.AplicarConfiguracoes - Feito
14/10/24 12:58:32:140 - Destravar
14/10/24 12:58:32:144 - TLibNFeConfig.Ler - Feito
14/10/24 12:58:32:149 - Destravar
14/10/24 12:58:32:152 - TACBrLibNFe.PrecisaCriptografar(DANFE,PathPDF)
14/10/24 12:58:32:156 - TACBrLibNFe.PrecisaCriptografar - Feito Result: False
14/10/24 12:58:32:159 - TLibNFeConfig.AjustarValor(tfGravar,DANFE,PathPDF,d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\docs_fiscais\pdfs_nfe)
14/10/24 12:58:32:164 - TLibNFeConfig.AjustarValor - Feito
14/10/24 12:58:32:168 - TLibNFeConfig.AplicarConfiguracoes: d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\dist\ACBrLib.ini
14/10/24 12:58:32:172 - Travar
14/10/24 12:58:32:176 - TLibNFeConfig.AplicarConfiguracoes - Feito
14/10/24 12:58:32:180 - Destravar
14/10/24 12:58:32:183 -    SetRetorno(0, )
14/10/24 12:58:32:187 - TACBrLibNFe.PrecisaCriptografar(DANFE,NomeDocumento)
14/10/24 12:58:32:190 - TACBrLibNFe.PrecisaCriptografar - Feito Result: False
14/10/24 12:58:32:194 - LIB_ConfigGravarValor(DANFE, NomeDocumento, 35241006083500000463650310000000981626420580_20241014125829.pdf)
14/10/24 12:58:32:198 - TACBrLibNFe.PrecisaCriptografar(DANFE,NomeDocumento)
14/10/24 12:58:32:201 - TACBrLibNFe.PrecisaCriptografar - Feito Result: False
14/10/24 12:58:32:207 - TLibNFeConfig.AjustarValor(tfGravar,DANFE,NomeDocumento,35241006083500000463650310000000981626420580_20241014125829.pdf)
14/10/24 12:58:32:211 - TLibNFeConfig.AjustarValor - Feito
14/10/24 12:58:32:215 - TLibNFeConfig.AplicarConfiguracoes: d:\Users\Documents\Projetos\Progen\fl_backend\frente_loja_backend\dist\ACBrLib.ini
14/10/24 12:58:32:220 - Travar
14/10/24 12:58:32:225 - TLibNFeConfig.AplicarConfiguracoes - Feito
14/10/24 12:58:32:230 - Destravar
14/10/24 12:58:32:234 -    SetRetorno(0, )
14/10/24 12:58:32:239 - NFe_ImprimirPDF
14/10/24 12:58:32:242 - Travar
14/10/24 12:58:32:246 - ConfigurarImpressao
14/10/24 12:58:32:250 -   DANFE = TACBrNFeDANFCeFortes
14/10/24 12:58:32:254 - ConfigurarImpressao - Feito
14/10/24 12:58:32:258 - FinalizarImpressao
14/10/24 12:58:32:262 - Destravar
14/10/24 12:58:32:266 -    SetRetorno(-10, Access violation)

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
2 minutos atrás, ProgenBR disse:

Boa tarde! Seguindo dúvida no Discord.

Ao tentar imprimir (criar) o PDF eu estou recebendo -10 access violation.

 

Inicialmente, eu não limpava a lista antes de gerar o PDF, e ele gerava normalmente, porém quando eu ia emitir uma segunda NFCe, não conseguia gerar o PDF, e tinha que reiniciar a API.

Depois da ajuda no Discord, passei a chamar o NFE_LimparLista antes de carregar o XML, porém agora não gera nem o primeiro PDF.

Estou usando o ACBrLibNFe64.dll ST versão 1.4.7.308.

 

Estou chamando o método da seguinte maneira (logo após gerar a NFCe):

try:
acbr_lib.limpar_lista()
except Exception as e:
log.logger.error("Erro ao limpar a lista: ", traceback.format_exc())

try:
acbr_lib.carregar_xml(nome_arquivo_xml)
except Exception as e:
log.logger.error("Erro ao salvar o XML da NFe: ", traceback.format_exc())

nome_arquivo = f"{chave_acesso}_{data_str}"
try:
acbr_lib.imprimir_pdf(nome_arquivo)
except Exception as e:
log.logger.error("Erro ao imprimir PDF: ", traceback.format_exc())

 

Meus métodos estão configurados da forma:

	def limpar_lista(self):
        # Define os tipos de argumentos e retorno da função NFE_LimparLista
        self.acbr_nfe.NFE_LimparLista.argtypes = [POINTER(c_int)]
        self.acbr_nfe.NFE_LimparLista.restype = c_int
        
        # Chama a função NFE_LimparLista
        resposta = self.acbr_nfe.NFE_LimparLista(self.ponteiro)
        
        # Verifica o resultado e retorna a resposta adequada
        if resposta == 0:
            return True  # Sucesso
        elif resposta == -1:
            raise Exception("Erro: A biblioteca não foi inicializada.")
        elif resposta == -10:
            raise Exception("Erro: Houve um erro ao limpar a lista.")
        else:
            raise Exception(f"Erro desconhecido: {resposta}")

 

	def imprimir_pdf(self, nome_pdf):
        # Configure o caminho onde o PDF será salvo
        self.configurar_valor("DANFE", "PathPDF", PATH_PDF)
        self.configurar_valor("DANFE", "NomeDocumento", f"{nome_pdf}.pdf")
        
        # Configura os tipos de argumentos e retorno do método NFE_ImprimirPDF
        self.acbr_nfe.NFE_ImprimirPDF.argtypes = [POINTER(c_int)]
        self.acbr_nfe.NFE_ImprimirPDF.restype = c_int
        tamanho = self.define_bufferResposta(8888888) # tentei com um buffer menor também mas continuou o problema
        if self.ponteiro is None:
            raise Exception("Erro: A biblioteca não foi inicializada corretamente.")

        # Chama o método para gerar o PDF
        resposta = self.acbr_nfe.NFE_ImprimirPDF(self.ponteiro)
        if resposta == 0:
            return True
        return False

 

Segue log:

 

Criada uma TK para analise do caso
#TK-6100
Logo daremos um retorno..

Link para o comentário
Compartilhar em outros sites

  • Consultores

@ProgenBR
Estou testando aqui... no meu por enq nao deu erro, ja ja printo tudo meus testes.
O que estamos achando estranho é pq em alguns metodos vc utiliza ponteiro ?
Exemplo:

# Chama a função NFE_LimparLista
        resposta = self.acbr_nfe.NFE_LimparLista(self.ponteiro)
        
        

 

 resposta = self.acbr_nfe.NFE_ImprimirPDF(self.ponteiro)

 

Ou ele esta sendo ignorado  dentro da sua funcao ?

Fiz assim, testei em MT, mas ja vou testar em ST, tbm, preciso ajustar o Exemplo:

mas se observar a funcao deste exemplo abaixo

  1. LimpaLista
  2. CarregaXML
  3. Alterei a pasta do PDF
  4. Alterei o nome do PDF
  5. Gravei as Alteracoes INI
  6. ImprimirPDF
def imprimirPDFNFe(PathXMLCompleto):
    define_bufferResposta(0)
    #limpar lista de NFe carregadas
    resposta = acbr_lib.NFE_LimparLista(ponteiro);
    exibeReposta('NFE_LimparLista',resposta)
    #Carregar XML
    resposta = acbr_lib.NFE_CarregarXML(ponteiro, PathXMLCompleto.encode('utf-8') )    
    exibeReposta('NFE_CarregarXML',resposta)
    #Alterar para teste o nome do PDF conforme reportado pelo usuario
    resposta = acbr_lib.NFE_ConfigGravarValor(ponteiro, 'DANFE'.encode('utf-8'), 'PathPDF'.encode('utf-8'), os.path.join(PATH_APP.encode('utf-8'),'Daniel2'.encode('utf-8')))
    resposta = acbr_lib.NFE_ConfigGravarValor(ponteiro, 'DANFE'.encode('utf-8'), 'NomeDocumento'.encode('utf-8'), 'Dani2'.encode('utf-8'))
    exibeReposta('NFE_ConfigGravarValor',resposta)
    #persistindo no INI
    resposta = acbr_lib.NFE_ConfigGravar(ponteiro, PATH_ACBRLIB_INI.encode("utf-8"));
    exibeReposta('NFE_ConfigGravar',resposta)
    #imprimir
    resposta = acbr_lib.NFE_ImprimirPDF(ponteiro );
    exibeReposta('NFE_ImprimirPDF',resposta) 


image.png

 

Vou alterar o Exemplo para ST e vou realizar os testes. Te aviso assim que concluido!

 

 

Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

bom dia pessoal, infelizmente o meu problema de access violation depois da primeira vez que imprime o pdf da nfe continua

eu deixei a ordem dos métodos exatamente como no exemplo, e tenho algumas dúvidas em relação a lib para me ajudar no debug

- o que exatamente access violation quer dizer? é um problema no ponteiro, no buffer, ou em outra coisa?

se possível, teria como vcs darem uma olhada ou testarem minha implementação? agora tô ficando meio sem saída

 

EmitirNotaFiscal.py ACBrLibNFe.py

ACBrLibNFE-20241021.log

Editado por ProgenBR
Link para o comentário
Compartilhar em outros sites

  • Moderadores
1 hora atrás, Daniel InfoCotidiano disse:

Bom dia !
Vamos realizar os testes em nosso ambiente

 

@Daniel InfoCotidiano

 

Eu não uso a lib, mas acho que sei de onde vem esse AV.

 

function TACBrDFeDANFeReport.CaractereQuebraDeLinha: String;
begin
  Result := '';
 if Assigned(ACBrNFe) then
  Result := TACBrNFe(ACBrNFe).Configuracoes.WebServices.QuebradeLinha;
end;

Nessa função acima eu incluí esse tratamento 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Consultores
1 hour ago, Waldir Paim said:

@Daniel InfoCotidiano

 

Eu não uso a lib, mas acho que sei de onde vem esse AV.

 

function TACBrDFeDANFeReport.CaractereQuebraDeLinha: String;
begin
  Result := '';
 if Assigned(ACBrNFe) then
  Result := TACBrNFe(ACBrNFe).Configuracoes.WebServices.QuebradeLinha;
end;

Nessa função acima eu incluí esse tratamento 

Bom dia.

Enviado ao SVN ajuste adicionando a referida validação.

  • Curtir 1
Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...