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.
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