Alguém saberia me dizer como fazer uma impressão direta em uma impressora ZEBRA usando ADVPL?
Estou desenvolvendo uma integração com uma API que retorna um arquivo .txt já com os códigos em ZPL. O que preciso é enviar esse arquivo diretamente para a impressora.
Dei uma olhada na função MSCBPRINTER, mas não consegui encontrar uma solução. A ideia é fazer tudo via Protheus, sem precisar chamar nenhum programa externo do Windows.
Olá @emerson.bn.info, o que pode ser feito é usar a função httpget() ou httppost() para consumir a api no protheus e com o retorno passar diretamente para a função mscbwrite (já imprime na linguagem da impressora “ZPL por exemplo”) ou mscbsay (imprime o que estiver escrito nela).
Caso necessite abrir o arquivo em si, pode utilizar a função fread() para abrir o txt e passar o conteúdo do texto para as funções de impressão que citei anteriormente.
Segue exemplo de impressão:
#Include 'Protheus.ch'
#INCLUDE "TBICONN.CH" // BIBLIOTECA
User Function Impzpl11()
Local cPorta := "LPT1"
Local cModelo := "ZEBRA"
WaitRun("NET USE LPT1: /DELETE")
WaitRun("NET USE "+cPorta+" \\LOCALHOST\ZPL")
//prepare environment empresa "99" filial "01"
MSCBPRINTER(cModelo, cPorta,,10,.F.,,,,,,.F.)
MSCBCHKSTATUS(.F.)
// INICIA A IMPRESSÃO
//MSCBLoadGRF("c:\teste\envio.grf") //imprimir imagem
MSCBBEGIN(1,6)
MSCBSAY(10,10," TESTE 20x40", "N","0","020,040",,,,,.F.) //imprimir texto
//MSCBSAY(10,30," TESTE 20x40", "N","0","020,040",,,,,.t.)
/*
MSCBSAY(10,10,"TESTE 20x40", "N","0","020,040")
MSCBSAY(10,30,"TESTE 40x20", "N","0","040,020")
MSCBSAY(10,50,"TESTE 50x50", "N","0","050,050")
MSCBSAY(10,70,"TESTE 100x100", "N","0","100,100")
*/
/*
MSCBSAY(10,20,"TESTE B,"+ time() +"V. P12.1.33", "N","B","020,040")
MSCBSAY(10,30,"TESTE C,"+ time() +"V. P12.1.33", "N","C","020,040")
MSCBSAY(10,40,"TESTE D,"+ time() +"V. P12.1.33", "N","D","020,040")
MSCBSAY(10,50,"TESTE E,"+ time() +"V. P12.1.33", "N","E","020,040")
MSCBSAY(10,60,"TESTE F,"+ time() +"V. P12.1.33", "N","F","020,040")
MSCBSAY(10,70,"TESTE G,"+ time() +"V. P12.1.33", "N","G","020,040")
MSCBSAY(10,80,"TESTE H,"+ time() +"V. P12.1.33", "N","H","020,040")
MSCBSAY(10,90,"TESTE 0,"+ time() +"V. P12.1.33", "N","0","020,040")
*/
MSCBSayBar(10, 60, 'MP27067', 'N', 'MB07',3,.T.,.T.,,'B',)
//imprime QRcode comando passado na linguagem nativa da impressora (ZPL)
//https://www.zebra.com/content/dam/zebra/manuals/printe
//MSCBWRITE("^FO170,110^BY4,2.0,65^BQN,2,10^FD0933860^FS") //imprimir na linguagem da impressora
// FINALIZA IMPRESSÃO
MSCBEND()
MSCBCLOSEPRINTER()
Return
Espero ter te ajudado!
Obrigado! Acabei seguindo essa lógica. Utilizei as funções FT_FUse e FT_FReadLn, e não conhecia o método MSCBWrite. Passei diretamente o valor da linha lida do arquivo para o método MSCBWrite e funcionou.
Olá Emerson,
Eu faço a leitura direta do arquivo txt para a LPT1, conforme abaixo
/--------------------------------/
Static Function CargaArq(cUrl2,cPed)
/--------------------------------/
Local aArea := GetArea()
Local cFileName := “”
Local nHandle := 00
Local cCaminho := ‘C:\siga’
Local nRet := 0
Local aReturn := {}
Local cPasta := ‘C:\siga'
Private cArqZip := ‘C:\siga'+cPed+’.zip’
MakeDir(cPasta)
cFileName := Httpget(cUrl2)
nHandle := FCreate(cArqZip)
FWrite(nHandle, cFileName)
FClose(nHandle)
nRet := FUnZip( cArqZip, cCaminho )
aReturn := FListZip( cArqZip )
frename(‘C:\SIGA'+Alltrim(aReturn[1][1]), ‘C:\SIGA'+StrTran(aReturn[1][1],’ ‘,’_’) )
cExec := ‘cmd /c "PRINT C:\SIGA'+StrTran(aReturn[1][1],’ ‘,’_‘)+’ TO LPT1"’
WaitRun(cExec,0)
RestArea(aArea)
Return