Impressao - lendo e salvando todas as configuracoes da impressora

Top  Previous  Next

 Changing the properties of a global printer object is a tedious task. 

The code below allows to save current settings of any installed printer 

to a stream using the SavePrinterInfo procedure. These settings include 

vendor specific settings. } 

 

{ Using LoadPrinterInfo, one can retrieve saved settings and apply these 

to the printer. } 

 

unit PrinterIO; 

 

interface 

 

uses 

  Classes; 

 

procedure SavePrinterInfo(APrinterName: PChar; ADestStream: TStream); 

procedure LoadPrinterInfo(APrinterName: PChar; ASourceStream: TStream); 

 

implementation 

 

uses 

  Windows, SysUtils, WinSpool; 

 

procedure SavePrinterInfo(APrinterName: PChar; ADestStream: TStream); 

var 

  HPrinter : THandle; 

  InfoSize, 

  BytesNeeded: Cardinal; 

  PI2: PPrinterInfo2; 

  PrinterDefaults: TPrinterDefaults; 

begin 

  with PrinterDefaults do 

  begin 

    DesiredAccess := PRINTER_ACCESS_USE; 

    pDatatype := nil; 

    pDevMode := nil; 

  end

  if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then 

  try 

    SetLastError(0); 

    //Determine the number of bytes to allocate for the PRINTER_INFO_2 construct... 

    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then 

    begin 

      //Allocate memory space for the PRINTER_INFO_2 pointer (PrinterInfo2)... 

      PI2 := AllocMem(BytesNeeded); 

      try 

        InfoSize := SizeOf(TPrinterInfo2); 

        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then 

          ADestStream.Write(PChar(PI2)[InfoSize], BytesNeeded - InfoSize); 

      finally 

        FreeMem(PI2, BytesNeeded); 

      end

    end

  finally 

    ClosePrinter(HPrinter); 

  end

end

 

procedure LoadPrinterInfo(APrinterName: PChar; ASourceStream: TStream); 

var 

  HPrinter : THandle; 

  InfoSize, 

  BytesNeeded: Cardinal; 

  PI2: PPrinterInfo2; 

  PrinterDefaults: TPrinterDefaults; 

begin 

  with PrinterDefaults do 

  begin 

    DesiredAccess := PRINTER_ACCESS_USE; 

    pDatatype := nil; 

    pDevMode := nil; 

  end

  if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then 

  try 

    SetLastError(0); 

    //Determine the number of bytes to allocate for the PRINTER_INFO_2 construct... 

    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then 

    begin 

      //Allocate memory space for the PRINTER_INFO_2 pointer (PrinterInfo2)... 

      PI2 := AllocMem(BytesNeeded); 

      try 

        InfoSize := SizeOf(TPrinterInfo2); 

        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then 

        begin 

          PI2.pSecurityDescriptor := nil; 

          ASourceStream.ReadBuffer(PChar(PI2)[InfoSize], BytesNeeded - InfoSize); 

          // Apply settings to the printer 

          if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^, 

                                PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then 

          begin 

            SetPrinter(HPrinter, 2, PI2, 0);  // Ignore the result of this call... 

          end

        end

      finally 

        FreeMem(PI2, BytesNeeded); 

      end

    end

  finally 

    ClosePrinter(HPrinter); 

  end

end

 

end