Página 2 de 3

PDF de NFe, CTe, MDFe, e Evento

Enviado: 08 Jan 2017 15:55
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 08 Jan 2017 16:07
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 08 Jan 2017 16:31
por JoséQuintas
A cada atualização estou atualizando lá.
Será que não pode ser algum cache local?

PDF de NFe, CTe, MDFe, e Evento

Enviado: 10 Jan 2017 19:17
por rubens
:{ :-Y

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

Valeu JoséQuintas ...

Rubens

PDF de NFe, CTe, MDFe, e Evento

Enviado: 11 Jan 2017 06:52
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...

PDF de NFe, CTe, MDFe, e Evento

Enviado: 11 Jan 2017 08:35
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 11 Jan 2017 08:56
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...

PDF de NFe, CTe, MDFe, e Evento

Enviado: 11 Jan 2017 09:07
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 12 Jan 2017 01:08
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 12 Jan 2017 02:16
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.

PDF de NFe, CTe, MDFe, e Evento

Enviado: 15 Jan 2017 21:29
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 15 Jan 2017 21:36
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.

PDF de NFe, CTe, MDFe, e Evento

Enviado: 24 Abr 2017 11:30
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

PDF de NFe, CTe, MDFe, e Evento

Enviado: 24 Abr 2017 11:47
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.

PDF de NFe, CTe, MDFe, e Evento

Enviado: 24 Abr 2017 13:56
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