PDA

Ver la Versión Completa : Imprimir contenido Base64 como Binario


viverosjosem
12-02-2021, 20:53:00
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.


...
...
...

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:


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