PDF de NFe, CTe, MDFe, e Evento

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

Alterei aqui:

Código: Selecionar todos

   IF ! Empty( ::aInfAdic[ "infAdFisco" ] )
      ::aInfAdic[ "infCpl" ]     := ::aInfAdic[ "infAdFisco" ] + Chr(13) + Chr(10) + ::aInfAdic[ "infCpl" ]
      ::aInfAdic[ "infAdFisco" ] := ""
   ENDIF
Com isto, a informação ao fisco sai em primeiro lugar, pelo menos é o que aparenta mostrar na descrição do Danfe da NFE 3.10.
A partir daí, entra na formatação automática, e nenhuma outra alteração é necessária.
Inclusive já entra na contagem de páginas, se precisar de páginas adicionais.
novainfcompl.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

JoséQuintas...

Baixei de novo o Geradanfe.exe do início da postagem mas continua dando o mesmo erro que reportei...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

A cada atualização estou atualizando lá.
Será que não pode ser algum cache local?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

:{ :-Y

Consegui... agora funcionou beleza... Parabéns...
Posso deixar de usar o ACBRDAnfe...

Valeu JoséQuintas ...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por gilbertosilverio »

Ola Rubens,

Um detalhe, o DANFE do Quintas, me parece que so ta gerando a primeira pagina, se você tiver NF-e com mais de uma pagina, não vai conseguir usa-lo...

Testa ai com algum XML com mais de uma pagina...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

Bom dia Gilberto...

Aqui gerou com 4 páginas...

E é lógico que isso era só um detalhe pro Quintas... kkkkkkkk enquanto não estivesse redondinho ele não ia ficar satisfeito...

Mas até agora tá jóia... usando o geradanfe.exe que baixei ontem... 10-01.

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por gilbertosilverio »

Bom dia Rubens,

Aqui pra mim, não consigo gerar com mais de uma pagina, testei com duas, sai so a primeira, peguei um xml com 4 paginas, ele nem gera, da erro...

Ja tentei ler e entender o código fonte, mais esta alem da minha capacidade, devido as meus vícios em programação...

Mais esta ficando muito bom o trabalho do Quintas, ele esta de parabens, em compartilhar com todos, logo logo ponho em produção...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

JoséQuintas,

desculpe a minha ignorância... mas consegui compilar belezinha... não estou sabendo executar...

Estou usando:

Código: Selecionar todos

	oDanfe := hbNFeDaNFe():New()
	oDanfe:Execute('Teste.xml', 'Teste.Pdf' )	
O que está faltando, aí?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

Funcionou assim:

Código: Selecionar todos

FUNCTION ImprimirDanfe( cXML, cTempFile )
	
   LOCAL oDanfe
   Hb_Default( @cTempFile, cDirPdf )
   oDanfe 		:= hbNFeDaGeral():New()
   oDanfe:cDesenvolvedor := "Desenvolvido por: MDV Informatica (66)3438-1933"
   oDanfe:ToPDF(  Memoread( cXml ) , cTempFile )
   PDFOpen( cTempFile )
	
   RETURN nil

********************************************************************************  
/*  
 * Abrir o Pdf do xml recebido
 * 11-01-2017 - 15:31:29  
 */  

   FUNCTION PDFOpen( cFile )
		HB_RUN( 'START /MAX '+cPATH+"sumatra\sumatrapdf.exe -lang pt -presentation "+cFILE )   //-print-to-default $file.pdf	-exit-on-print
   RETURN NIL
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

Tá mais simplificado agora.

Código: Selecionar todos

oDanfe := hbNFeDaGeral():New()
oDanfe:cDesenvolvedor := "ODesenvolvedor"
oDanfe:cLogoFile := "jpegfileouconteúdo"
oDanfe:ToPDF( "texto.xml", "filepdf" )
Tanto faz se é NFe, CTe, MDFe ou evento.

No caso do XML, é o conteúdo do arquivo, não o nome
No caso do logotipo, aceita nome de arquivo ou conteúdo
O terceiro parâmetro é o conteúdo do arquivo auxiliar, conforme o resultado do primeiro.
no caso de emissão, o terceiro será o cancelamento
no caso de evento, o terceiro será a emissão

Nota:
O Execute() não estava padronizado, podia ter ordem diferente.
O ToPDF() já está padronizado, parâmetros iguais em todos os documentos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

Deixei passar isto:
Aqui pra mim, não consigo gerar com mais de uma pagina, testei com duas, sai so a primeira, peguei um xml com 4 paginas, ele nem gera, da erro...
Desde o começo já gerava com várias páginas.
Antes de mexer, acontecia de mostrar quantidade de páginas erradas.
Hoje todo cálculo é feito em... ::CalculaLayout()

Avise se ainda tiver problemas, porque estranhei dizer que não gera.
Aqui já gerei com 12 páginas ou mais, durante os ajustes.
Cheguei até a colocar um fonte inteiro (PRG) como informação adicional pra testar.

Lembrando:

Se o PDF já estiver aberto, a rotina não consegue gerar um novo PDF com mesmo nome, isso é normal em qualquer rotina.

CTE continua limitado a uma página, mas NFE não tem limite.

NFE, até se alterar o fonte padrão é pra sair certo, apesar que faz um tempinho que não testo fora do padrão.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

E um adicional:
Como muitos usam em disco e MemoRead(), agora alterei pra aceitar das duas formas.
Tanto faz nome de arquivo ou conteúdo.

Pode passar cFileName ou MemoRead( cFileName )

Abaixo de 100 caracteres é considerado nome de arquivo, e acima disso é considerado texto.
Acho que esse limite atende.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

Bom dia...

José Quintas...

Não dá para colocar a impressão do Ean opcional ?
Ficaria mais espaço para a descrição...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PDF de NFe, CTe, MDFe, e Evento

Mensagem por JoséQuintas »

Está relativamente fácil alterar, o difícil é decidir como.
Por parâmetro.... pode atrapalhar quando tem parâmetro opcional
Por arquivo de configuração... pode atrapalhar pra usar direto do MySQL sem acesso a disco
Por linha de comando.... idem

Talvez seja mais fácil alterar na sua cópia.

No método DefineColunasProdutos()

Código: Selecionar todos

   ::aLayout[ LAYOUT_DESCONTO, LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_SUBBAS,   LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_SUBVAL,   LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_IPIVAL,   LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_IPIALI,   LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_IPIALI,   LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   ::aLayout[ LAYOUT_EAN,      LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
   // Define decimais default, mas será ajustado conforme conteúdo do XML
   ::aLayout[ LAYOUT_QTD, LAYOUT_DECIMAIS ]      := 0
   ::aLayout[ LAYOUT_UNITARIO, LAYOUT_DECIMAIS ] := 2
   FOR EACH oElement IN ::aLayout
      oElement[ LAYOUT_LARGURA ] := Max( Len( oElement[ LAYOUT_TITULO1 ] ), Len( oElement[ LAYOUT_TITULO2 ] ) )
   NEXT
   nItem := 1
   DO WHILE .T.
      IF ! ::ProcessaItens( ::cXml, nItem )
         EXIT
      ENDIF
      nItem += 1
      ::aLayout[ LAYOUT_QTD,      LAYOUT_DECIMAIS ] := ::DefineDecimais( ::aItem[ "qCom" ],   ::aLayout[ LAYOUT_QTD,    LAYOUT_DECIMAIS ] )
      ::aLayout[ LAYOUT_UNITARIO, LAYOUT_DECIMAIS ] := ::DefineDecimais( ::aItem[ "vUnCom" ], ::aLayout[ LAYOUT_UNITARIO, LAYOUT_DECIMAIS ] )
      FOR EACH oElement IN ::aLayout
         oElement[ LAYOUT_LARGURA ] := Max( oElement[ LAYOUT_LARGURA ], Len( Eval( oElement[ LAYOUT_CONTEUDO ] ) ) )
         oElement[ LAYOUT_LARGURAPDF ] := Max( oElement[ LAYOUT_LARGURAPDF ], ::LarguraTexto( Eval( oElement[ LAYOUT_CONTEUDO ] ) ) )
      NEXT
      IF Val( ::aItemIPI[ "pIPI" ]  ) > 0 .OR. Val( ::aItemIPI[ "vIPI" ] ) > 0 // Se houver IPI no XML, habilita coluna
         ::aLayout[ LAYOUT_IPIVAL, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
         ::aLayout[ LAYOUT_IPIALI, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
      ENDIF
      IF Val( ::aItemICMS[ "vBCST" ] ) > 0 .OR. Val( ::aItemICMS[ "vICMSST" ] ) > 0
         ::aLayout[ LAYOUT_SUBBAS, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
         ::aLayout[ LAYOUT_SUBVAL, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
      ENDIF
      IF Val( ::aItem[ "vDesc" ] ) > 0
         ::aLayout[ LAYOUT_DESCONTO, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
      ENDIF
      IF ! Empty( ::aItem[ "cEAN" ] )
         ::aLayout[ LAYOUT_EAN, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
      ENDIF
   ENDDO
   // Define tamanho de colunas
Pode decidir o melhor jeito, mas poderia ser antes dessa última linha, acrescentando esta:

Código: Selecionar todos

   ::aLayout[ LAYOUT_EAN,      LAYOUT_IMPRIME ] := LAYOUT_NAOIMPRIME
Ou omitindo esta linha/bloco:

Código: Selecionar todos

      IF ! Empty( ::aItem[ "cEAN" ] )
         ::aLayout[ LAYOUT_EAN, LAYOUT_IMPRIME ] := LAYOUT_IMPRIMENORMAL
      ENDIF
Se eu tiver uma idéia de como facilitar isso, vou tentar uma terceira opção e permitir default:

LAYOUT_IMPRIMENAO
LAYOUT_IMPRIMENORMAL
LAYOUT_IMPRIMEAUTOMATICO

Como eu disse no início, o problema não é ajustar layout, o problema é como passar os parâmetros para a classe, sem criar novos problemas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

PDF de NFe, CTe, MDFe, e Evento

Mensagem por rubens »

Ok.. José Quintas...

Vou deixar do jeito que tá e ver o no que dá... quando a gente tem muita coisa no sistema e daqui um pouco precisa atualizar vira um Deus nos acuda... É sempre melhor deixar o original...
Se não houver um número expressivo de reclamações fica assim mesmo...

Obrigado...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Responder