Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Imprimir contenido Base64 como Binario (https://www.clubdelphi.com/foros/showthread.php?t=95067)

viverosjosem 12-02-2021 20:53:00

Imprimir contenido Base64 como Binario
 
Hola amigos del foro.

Tengo la siguiente situacion:
Recibo un string en Base64 desde un servidor WebService. Este contenido Base64 se procesa y se graba en disco como un Archivo PDF.

Código Delphi [-]
...
...
...

   sB64 := jValue.ToString;

   a := copy(sB64, pos('PDF":"', sB64)+6, length(sB64)-2);

   if (pos('error', sB64) > 0) then begin
      MemoContent.Text := jValue.ToString;
      PageControl1.ActivePage := TsErrores;

      lFlag := True;  // Detenemos el timer
      lError := True;

      lResult := False;
   end
   else begin
      sFF := Folder_ArchiDTE + '\PDF\';
      DecodeFile(a, sFF + sNumBFDte + '.PDF');

...
...
...

procedure TArchiDTE.DecodeFile(const base64: String; const FileName: string);
var
  stream: TBytesStream;
begin
  stream := TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(base64));
  try
    stream.SaveToFile(Filename);
  finally
    stream.Free;
  end;
end;

Una vez que el archivo PDF, esta grabado en disco, lo tomo con una aplicacion externa y lo envio a la impresora de Tikets (80x80).
La forma que uso para imprimirlo es esta:

Código Delphi [-]
ShellExecute(Handle, 'open', PChar(Folder_ArchiDTE + '\PdfToPrinter.exe'), PChar(sFF + sNumBFDte + '.PDF' + ' ' + EdPrinter.Text), nil, SW_HIDE).

Esto Funciona bien!, La boleta en PDF se imprime correctamente. Pero el proceso es muy lento. Mas de 20 segundos, entre grabar el archivo, rescatarlo, y luego imprimirlo.


La pregunta es:

¿Existe la manera de poder tomar el contenido en Base64, llevarlo a binario, y luego imprimirlo en la impresora de tikets directamente? (sin tener que grabar para luego rescatar y luego imprimir).

De antemano gracias.

Saludos
Jose Miguel.

Casimiro Notevi 13-02-2021 10:51:22

Cita:

Empezado por viverosjosem (Mensaje 540020)
Pero el proceso es muy lento. Mas de 20 segundos, entre grabar el archivo, rescatarlo, y luego imprimirlo.

Yo revisaría dónde está perdiendo realmente tanto tiempo, porque guardar un archivo y leerlo no debería tardar ni un segundo.

viverosjosem 14-02-2021 02:03:39

Hola Casimiro.
La verdad es que el internet, en la localidad de mi cliente, es malo. Entonces desde que la boleta va al Servicio de Impuestos internos, vuelve, y se imprime. Pasan cerca de 20 segundos. Por eso quiero ver la posibilidad, de prescindir de la aplicacion externa, para enviar directamente el archivo a la impresora.

De todas maneras. Gracia por responder.

Saludos.
Jose Miguel.

Casimiro Notevi 14-02-2021 13:35:54

Si dices que lo lento es la conexión a internet, entonces ese es el problema, ¿no?
Porque una vez que tienes el fichero a imprimir, da igual que lo guardes en disco o no, eso no lleva ni un segundo.
Seguramente no te he entendido.

viverosjosem 14-02-2021 21:51:31

Hola Casimiro.
Como te comente. El internet es lento. Pero tambien estoy usando una aplicacion externa para abrir el archivo PDF, e imprimirlo. La aplicacion: "PdfToPrinter". Entonces el internet Lento, sumado a que cada vez que llega el archivo PDF, hay que abrir la aplicacion "PDFToPrinter", para que imprima, lo hace mas lento aun. Por eso pense, que imprimiendo el PDF, en forma directa podria ahorrar unos valiosos segundos, como 6 u 8 segundos. nose.. cualquier segundo menos, me suma rapidez.

De todas maneras, como me comentas, revisare el codigo, para ver donde puedo agilizar algo el proceso. Pero si, de todas maneras, conoces una forma de impresion directa, lo agradeceria.

Saludos.

Jose Miguel.

Casimiro Notevi 14-02-2021 22:01:00

Hola, pero has hecho cálculos en cuánto tarda cada apartado.
Dudo mucho que abrir un pdf con un soft externo tarde 8 segundos. Y si es así, cámbialo por otro.
Pon un temporizador en tu código y calcula cuánto tarda cada parte, algo así como:
Código Delphi [-]
timer1.enabled:=true;
descargar fichero de internet;
tiempo = now-timer1.datetime;
guardar en disco;
tiempo = now-timer1.datetime;
abrir pdftoprint;
tiempo = now-timer1.datetime;

viverosjosem 26-02-2021 23:39:43

Hola Casimiro.
Logre reducir los tiempos de impresion a 10segundos. Pero aun queda la duda, de como imprimir directamente un PDF en BASE64, directo a la impresora. Sin utilizar un lector de PDF?

Saludos.
JoseMiguel.

Casimiro Notevi 27-02-2021 09:41:39

Es simple, ¿la impresora entiende base64?
Si la respuesta es 'SÍ' entonces envíalo a la impresora directamente.
Si la respuesta es 'NO' entonces tendrás que decodificarlo para obtener el PDF y luego imprimirlo.
El que lo mantengas en memoria, o lo guardes en disco antes de enviarlo a la impresora, es algo que apenas afectará al tiempo, serán décimas de segundo.


La franja horaria es GMT +2. Ahora son las 01:43:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi