miércoles, 29 de abril de 2015

impresión raw lenta en windows 7 usando spooler de windows

Este tema me ha dado verdaderos quebraderos de cabeza y no he podido solucionarlo con información de ningún otro lugar. Me gustaría compartirlo por si alguien se encuentra con el mismo problema:

Hemos detectado que en windows 7 la impresión se vuelve muy lenta cuando llamamos reiteradamente a la función para escribir cada linea de impresión es decir algo como:

WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 1');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 2');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 3');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 4');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 5');
...

mientras que si nuestro codigo fuese algo como ...

WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 1 LINEA 2 LINEA 3 LINEA 4 LINEA 5' );

nuestra impresión no sería lenta. Se debe al hecho de 'generar un documento' para linea y su correspondiente gasto de acceso.

Esta misma forma de proceder en windows 8 no produce lentitud alguna. (Supongo que lo gestiona el spooler de windows 8)


codigo fuente de ejemplo: delphi

uses
 Winspool

------------------------------

function Tform1.WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  i: Integer;
  B: Byte;
  Escritos: DWORD;
begin
  Result:= FALSE;
  if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  try
    FillChar(DocInfo,Sizeof(DocInfo),#0);
    with DocInfo do
    begin
      pDocName:= PChar('Printer Test');
      pOutputFile:= nil;
      pDataType:= 'RAW';
    end;
    if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
    try
      if StartPagePrinter(PrinterHandle) then
      try      

        WritePrinter(PrinterHandle, PChar(Str), Length(Str), Escritos);      
        Result:= TRUE;
      finally
        EndPagePrinter(PrinterHandle);
      end;
    finally
      EndDocPrinter(PrinterHandle);
    end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;

No hay comentarios:

Publicar un comentario

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...