PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Imprimir direto impressora #587328

30/10/2017

0

Fala Galera beleza?
Estou com o seguinte problema!
Ja olhei o fórum, e nao consegui uma resposta, a situação é a seguinte:

Meu cliente possui várias impressoras na empresa, inclusive impressoras conectadas a maquina (local/usb).
Eu criei uma aplicação onde lista, todas as impressoras registradas na maquina (inclusive as de rede), e mando esta informação para um ftp (crio um arquivo csv). Lá o programador web, registra essas informações num banco de dados, e me retorna um link.

Ate aqui beleza, consigo me comunicar tranquilamente .
Quando pego o nome da impressora, e o arquivo associado a ela que devo imprimir, ai que começa o B.O.

Segue codigo abaixo

Aqui verifico o retorno, onde baixo o arquivo e pego o nome da impressora
procedure TfrmPrincipal.VerificaRetorno(const idCadastro: String);
var
PostDataStream : TStringStream;
SSL : TIdSSLIOHandlerSocketOpenSSL;
Resposta_S, url,
Linha, caminho_impressao : string;
i, qtdelinhas : integer;
printerC, testeX, A, B, C: array of string;
ListaImpressao : TStringList;
begin
IdHTTP := TIdHTTP.Create(nil);
idhttp.iohandler := IdSSLIOHandlerSocketOpenSSL;
PostDataStream := TStringStream.Create('');
try
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
SSL.SSLOptions.Method := sslvSSLv23;
IdHTTP.IOHandler := SSL;
IdHTTP.Request.ContentType := 'text/xml';
IdHTTP.Request.Charset := 'UTF-8';

Url := 'http://xxxx.com';
IdHTTP.Get(Url, PostDataStream);
Resposta_S := PostDataStream.DataString;

if Resposta_S <> '' then
begin
SetLength(A,Length(Resposta_S));
Explode(A,'|',Resposta_S);
qtdelinhas := High(A);

//ConectarAoServidorFTP;
for I := 0 to 10 do
begin
Linha := A[I];
if Linha = '' then
begin
abort;
end;
SetLength(B,Length(Linha));
Explode(B,';', Linha);
nome_impressora_local := B[0];
documentos_imprimir := B[1];
DownloadFTP('23096', documentos_imprimir);
PrintFile(caminho_impressao + documentos_imprimir, nome_impressora_local);
end;
end;

finally
IdHTTP.Disconnect;
//idftp1.Disconnect;
PostDataStream.Free;
end;
except
Abort;
Close;
end;
end;

Aqui é o codigo de impressão!
procedure TfrmPrincipal.PrintFile(aFile: TFileName; name_printer: string);
var
Device: array[0..255] of Char;
Driver: array[0..255] of Char;
Port: array[0..255] of Char;
hDeviceMode: THandle;
S, Resposta_S, url : String;
IdHTTP: TIdHTTP;
PostDataStream : TStringStream;
SL: TStringList;
SSL1 : TIdSSLIOHandlerSocketOpenSSL;
begin
try
begin
// Selecione uma impresora, neste caso é a padrão.
Printer.PrinterIndex := Printer.Printers.IndexOf(name_printer);
// if name_printer = 'MP-4200 TH' then
// ShowMessage('Termica');

Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
S := Format('"%s" "%s" "%s"', [Device, Driver, Port]);
ShellExecute(Handle, 'print', PChar(aFile), PChar(S), nil, SW_HIDE);
Sleep(3000);
PostMessage(FindWindow(nil, 'Adobe Reader'), WM_CLOSE, 0, 0);

end;
finally

end;
end;

Eu consigo baixar o arquivo (pdf) e deixa-lo numa pasta a espera do comando de impressão. Só que quando executo não imprime nada na impressora da rede.
Na impressora local ainda consigo fazer com que ela imprima uma pagina, mas tambem depois não funciona mais. Ai preciso reiniciar o Spooler de impressao

Eu debugo e não gera erro, os parametros estao sendo passados "corretamente".
Ainda dou um sleep de 3 segundos, pra poder matar o adobe reader que abre sem ser requisitado!

Preciso acrescentar algo a mais? Poderiam me ajudar?
Anderson Rosa

Anderson Rosa

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar