PDF direto para a impressora

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Wesllen
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 19 Nov 2008 16:02
Localização: Varginha

PDF direto para a impressora

Mensagem por Wesllen »

Estou usando o ACBRNFE Monitor para emissão de NF-e e aqui na empresa vários terminais emitem a NF-e.

Ocorre que devido a alguns problemas passei a usar o ACBRNFE via socket que por sinal deixou a emissão muito mais rápida do que via arquivo.
Agora estou com um outro problema e acredito que alguém possa me dar uma luz.

Como deixo o ACBRNFE Monitor no servidor todo DANFE só é emitido nas impressoras instaladas no servidor. Dessa forma tive que compartilhar as impressoras dos terminais que emitem NF-e e efetuar a instalação das mesmas no servidor.

O problema é que a grande maioria dos DANFEs não são emitidos logo que a sua NFé é autorizada. Eles ficam armazenados em PDF e depois um operador efetua a impressão. Para economizar tempo optamos por usar o PDFCREATOR e assim o instalamos em todos os terminais e no servidor. No entanto, toda vez que é solicitada uma impressão de um DANFE para a impressora PDFCREATOR em um terminal o PDFCREATOR que entra em ação é o PDFCREATOR instalado no servidor e o operador fica aguardando a tela do PDFCREATOR no terminal o que não ocorrerá. Isso ocorre devido ao comando do ACBR NFe.ImprimirDANFE(cArqXML,[NomeImpressora],[nCopias]) possuir a claúsula [NomeImpressora] onde informamos em qual impressora imprimir, porém o ACBR direciona para o PDFCREATOR do servidor e não para o PDFCreator do terminal. Isso mesmo informando o caminho como "\\terminal\PDFCREATOR".

No momento, como solução provisória, estou abrindo o DANFE em PDF (criado pelo comando NFe.ImprimirDANFEPDF) no terminal assim que a NF-e é autorizada, bastanto o operador salvá-lo novamente onde quiser. Porém, como todo usuário nunca está satisfeito, preciso de uma função que mande esse PDF já pronto para qualquer impressora instalada no terminal.

Agradeço pela ajuda.

[]'s

PS. Tem que ser em XHB 1.0.0
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Re: PDF direto para a impressora

Mensagem por jamazevedo »

Via Linux isso é fácil de resolver.
Através do comando lpr -P <nome_da_impressora> <nome_do_arquivo>
A impressora pode está em qualquer terminal o até mesmo remotamente instalada que o servidor de impressão do Linux irá redirecioná-la corretamente e imprimir em qualquer lugar que você necessite.
Então com a função ADIR() você localiza os PDF's que deseja imprimir e enviar para impressora através do comando RUN.
Ex.: RUN lpr -P hp-p1005 nfe-00105.pdf
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
Wesllen
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 19 Nov 2008 16:02
Localização: Varginha

Re: PDF direto para a impressora

Mensagem por Wesllen »

Obrigado pela resposta.

Esse comando também existe no Windows só que para usá-lo preciso criar uma porta TCP/IP para receber os dados para a impressão, um Printer Server mesmo.
Aí fica meio complicado pois terei que configurar uns 50 terminais pois em todos preciso deixar a impressão de NF-e funcionando.

Encontrei na NET o comando " ShellExecute( NULL, "print", cFILE, NULL, NULL, 1) " em C mas ainda não encontrei maiores informações sobre como utilizá-lo e se funcionará para arquivos PDF.

Assim que consegui posto a solução.

Agradeço mais uma vez.

Wesllen
Wesllen
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 19 Nov 2008 16:02
Localização: Varginha

Re: PDF direto para a impressora

Mensagem por Wesllen »

Consegui resolver 90% da questão.
Pesquisando aqui no forum e em outros locais montei o seguinte código:

Aqui trago o arquivo PDF com o seu PATH

Código: Selecionar todos

FUNCTION PRN_File( cFILE )
LOCAL nRET,cPATH
    nRet := _OPENHelpFile( cPATH, cFILE, "print" )
RETURN nRET
Aqui imprime:

Código: Selecionar todos

#pragma BEGINDUMP
   #pragma comment( lib, "shell32.lib" )
   #include "hbapi.h"
   #include <windows.h>
   HB_FUNC( _OPENHELPFILE )
      {
        HINSTANCE hInst;
        LPCTSTR lpPath = (LPTSTR) hb_parc( 1 );
        LPCTSTR lpHelpFile = (LPTSTR) hb_parc( 2 );
        LPCTSTR lpComand = (LPTSTR) hb_parc( 3 );
        hInst = ShellExecute( 0, lpComand, lpHelpFile, 0, lpPath, SW_SHOW );
        hb_retnl( (LONG) hInst );
        return;
      }     
#pragma ENDDUMP
Agora para ficar perfeito para mim só preciso fazer imprimir na impressora escolhida pelo usuário porque na forma acima sempre manda na impressora padrão.

Se alguém quiser compartilhar de seus conhecimentos eu agradeço :D

[]'s

Wesllen
Responder