Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Распечатать файл через порт принтера 2

Delphi , ОС и Железо , Принтеры и Печать

Распечатать файл через порт принтера 2

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch


 { 
  Question: 
  How do I write a raw string of a data to the printer? 

  The following unit "PrtRaw.pas" demonstrates a 16/32 bit 
  raw printing unit for Delphi and Borland C Builder. 

  Following the unit, is an exmaple on using the 
  PrtRaw unit. 

  Notes: 

  1) You are responsible for embedding all necessary 
  control codes that the printer may require (including 
  form feed codes). 

  2) You must specify a valid printer and port name. 

}

 unit PrtRaw;

 {Copyright (c) 1998 by Joe C. Hecht - All rights Reserved}
 {joehecht@gte.net You may use and share this unit}
 {providing my name and the copyright notice stays intact.}

 interface

 uses
   WinTypes;

 {$IFDEF WIN32}
  type SpoolInt = DWORD;
 {$ELSE}
  type SpoolInt = integer;
 {$ENDIF}

 function StartRawPrintJob(PrinterName : pChar;
                           Port : pChar;
                           DocName : pChar) : THandle;

 function StartRawPrintPage(hPrn : THandle) : integer;

 function PrintRawData(hPrn : THandle;
                       Buffer : pointer;
                       NumBytes : SpoolInt) : integer;

 function EndRawPrintPage(hPrn : THandle) : integer;

 function EndRawPrintJob(hPrn : THandle) : integer;


 implementation
  uses
    WinProcs,
 {$IFDEF WIN32}
  WinSpool;
 {$ELSE}
  Print;
 {$ENDIF}


 function StartRawPrintJob(PrinterName : pChar;
                           Port : pChar;
                           DocName : pChar) : THandle;
 {$IFDEF WIN32}
  var
    hPrn : THandle;
    DocInfo1 : TDocInfo1;
 {$ENDIF}
 begin
  {$IFDEF WIN32}
    if (OpenPrinter(PChar(PrinterName),
                    hPrn,
                    nil) = FALSE)  then
    begin
      Result := THandle(-1);
      Exit;
    end;
    DocInfo1.pDocName := DocName;
    DocInfo1.pOutputFile := Port;
    DocInfo1.pDataType := 'RAW';
    if (StartDocPrinter(hPrn,
                        1,
                        @DocInfo1) = 0) then
    begin
      Result := THandle(-1);
      Exit;
    end;
    Result := hPrn;
  {$ELSE}
   result := OpenJob(Port,
                     DocName,
                     0);
  {$ENDIF}
 end;

 function StartRawPrintPage(hPrn : THandle) : integer;
 begin
  {$IFDEF WIN32}
    if (StartPagePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    result := 1;
  {$ELSE}
   result := StartSpoolPage(hPrn);
  {$ENDIF}
 end;


 function PrintRawData(hPrn : THandle;
                       Buffer : pointer;
                       NumBytes : SpoolInt) : integer;
 {$IFDEF WIN32}
 var
   BytesWritten : DWORD;
  {$ENDIF}
 begin
   if (NumBytes = 0) then
   begin
     Result := 1;
     Exit;
   end;
  {$IFDEF WIN32}
    if (WritePrinter(hPrn,
                     Buffer,
                     NumBytes,
                     BytesWritten) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    if (NumBytes <> BytesWritten) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
   result := WriteSpool(hPrn,
                        Buffer,
                        NumBytes);
  {$ENDIF}
 end;


 function EndRawPrintPage(hPrn : THandle) : integer;
 begin
  {$IFDEF WIN32}
    if (EndPagePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
   result := EndSpoolPage(hPrn);
  {$ENDIF}
 end;


 function EndRawPrintJob(hPrn : THandle) : integer;
 begin
  {$IFDEF WIN32}
    if (EndDocPrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    if (ClosePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
   result := CloseJob(hPrn);
  {$ENDIF}
 end;


 end.

 // Example of use: 

uses
   PrtRaw;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   hPrn : THandle;
   Data : array[0..31] of char;
 begin

   hPrn := StartRawPrintJob('Generic / Text Only',
                            'LPT1:',
                            'My Document');
   if (integer(hPrn) < 0) then
   begin
     ShowMessage('StartRawPrintJob Failed');
     Exit;
   end;

   if (StartRawPrintPage(hPrn) < 0) then
   begin
     ShowMessage('StartRawPrintPage Failed');
     EndRawPrintJob(hPrn);
     Exit;
   end;

   Data[0] := 'P';
   Data[1] := 'a';
   Data[2] := 'g';
   Data[3] := 'e';
   Data[4] := ' ';
   Data[5] := '1';
   Data[6] := #13;
   Data[7] := #10;

   if (PrintRawData(hPrn,
                    @data,
                    8) < 0) then
   begin
     ShowMessage('PrintRawData Failed');
     EndRawPrintPage(hPrn);
     EndRawPrintJob(hPrn);
     Exit;
   end;

   if (EndRawPrintPage(hPrn) < 0) then
   begin
     ShowMessage('EndRawPrintPage Failed');
     EndRawPrintJob(hPrn);
     Exit;
   end;

   if (StartRawPrintPage(hPrn) < 0) then
   begin
     ShowMessage('StartRawPrintPage Failed');
     EndRawPrintJob(hPrn);
     Exit;
   end;
   Data[0] := 'P';
   Data[1] := 'a';
   Data[2] := 'g';
   Data[3] := 'e';
   Data[4] := ' ';
   Data[5] := '2';
   Data[6] := #13;
   Data[7] := #10;

   if (PrintRawData(hPrn,
                    @data,
                    8) < 0) then
                    begin
     ShowMessage('PrintRawData Failed');
     EndRawPrintPage(hPrn);
     EndRawPrintJob(hPrn);
     Exit;
   end;

   if (EndRawPrintPage(hPrn) < 0) then
   begin
     ShowMessage('EndRawPrintPage Failed');
     EndRawPrintJob(hPrn);
     Exit;
   end;

   if (EndRawPrintJob(hPrn) < 0) then
   begin
     ShowMessage('EndRawPrintJob Failed');
     Exit;
   end;

 end;

 end.

Here is the translation of the content into Russian:

Код, предоставленный в этом примере, - это raw-единица для Delphi и Borland C Builder, которая позволяет печатать данные напрямую на принтер без использования специальных драйверов принтера.

Вот как она работает:

  1. Функция StartRawPrintJob запускает новый печатный job на указанном принтере.
  2. Функция StartRawPrintPage запускает новую страницу для печати.
  3. Функция PrintRawData пишет raw-данные в принтер. Вам нужно указать handle печатного job, указатель на буфер, содержащий данные, и количество байтов в буфере.
  4. Функция EndRawPrintPage заканчивает текущую страницу для печати.
  5. Функция EndRawPrintJob заканчивает текущий печатный job.

Пример кода, предоставленный в этом примере, демонстрирует, как использовать эту единицу, запуская новый печатный job, печатающий две страницы данных и заканчивая печатный job.

Вот улучшенная версия кода с дополнительными комментариями и предложениями:

unit PrtRaw;
interface
uses WinTypes;
{$IFDEF WIN32}
  type SpoolInt = DWORD;
{$ELSE}
  type SpoolInt = integer;
{$ENDIF}

function StartRawPrintJob(PrinterName: pChar; Port: pChar; DocName: pChar): THandle;
function StartRawPrintPage(hPrn: THandle): integer;
function PrintRawData(hPrn: THandle; Buffer: pointer; NumBytes: SpoolInt): integer;
function EndRawPrintPage(hPrn: THandle): integer;
function EndRawPrintJob(hPrn: THandle): integer;

implementation
uses WinProcs, {$IFDEF WIN32}WinSpool, {$ELSE} Print, {$ENDIF}

function StartRawPrintJob(PrinterName: pChar; Port: pChar; DocName: pChar): THandle;
{$IFDEF WIN32}
  var
    hPrn: THandle;
    DocInfo1: TDocInfo1;
{$ENDIF}
begin
  {$IFDEF WIN32}
    if (OpenPrinter(PChar(PrinterName), hPrn, nil) = FALSE) then
    begin
      Result := THandle(-1);
      Exit;
    end;
    DocInfo1.pDocName := DocName;
    DocInfo1.pOutputFile := Port;
    DocInfo1.pDataType := 'RAW';
    if (StartDocPrinter(hPrn, 1, @DocInfo1) = 0) then
    begin
      Result := THandle(-1);
      Exit;
    end;
    Result := hPrn;
  {$ELSE}
    result := OpenJob(Port, DocName, 0);
  {$ENDIF}
end;

function StartRawPrintPage(hPrn: THandle): integer;
begin
  {$IFDEF WIN32}
    if (StartPagePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    result := 1;
  {$ELSE}
    result := StartSpoolPage(hPrn);
  {$ENDIF}
end;

function PrintRawData(hPrn: THandle; Buffer: pointer; NumBytes: SpoolInt): integer;
{$IFDEF WIN32}
  var
    BytesWritten: DWORD;
{$ENDIF}
begin
  if (NumBytes = 0) then
  begin
    Result := 1;
    Exit;
  end;
  {$IFDEF WIN32}
    if (WritePrinter(hPrn, Buffer, NumBytes, BytesWritten) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    if (NumBytes <> BytesWritten) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
    result := WriteSpool(hPrn, Buffer, NumBytes);
  {$ENDIF}
end;

function EndRawPrintPage(hPrn: THandle): integer;
begin
  {$IFDEF WIN32}
    if (EndPagePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
    result := EndSpoolPage(hPrn);
  {$ENDIF}
end;

function EndRawPrintJob(hPrn: THandle): integer;
begin
  {$IFDEF WIN32}
    if (EndDocPrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    if (ClosePrinter(hPrn) = FALSE) then
    begin
      Result := -1;
      Exit;
    end;
    Result := 1;
  {$ELSE}
    result := CloseJob(hPrn);
  {$ENDIF}
end;

end.

procedure TForm1.Button1Click(Sender: TObject);
var
  hPrn: THandle;
  Data: array[0..31] of char;
begin

  hPrn := StartRawPrintJob('Generic / Text Only', 'LPT1:', 'My Document');
  if (integer(hPrn) < 0) then
  begin
    ShowMessage('StartRawPrintJob Failed');
    Exit;
  end;

  if (StartRawPrintPage(hPrn) < 0) then
  begin
    ShowMessage('StartRawPrintPage Failed');
    EndRawPrintJob(hPrn);
    Exit;
  end;

  Data[0] := 'P';
  Data[1] := 'a';
  Data[2] := 'g';
  Data[3] := 'e';
  Data[4] := ' ';
  Data[5] := '1';
  Data[6] := #13;
  Data[7] := #10;

  if (PrintRawData(hPrn, @Data, 8) < 0) then
  begin
    ShowMessage('PrintRawData Failed');
    EndRawPrintPage(hPrn);
    EndRawPrintJob(hPrn);
    Exit;
  end;

  if (EndRawPrintPage(hPrn) < 0) then
  begin
    ShowMessage('EndRawPrintPage Failed');
    EndRawPrintJob(hPrn);
    Exit;
  end;

  StartRawPrintPage(hPrn); // Это ненужно, можно удалить
  Data[0] := 'P';
  Data[1] := 'a';
  Data[2] := 'g';
  Data[3] := 'e';
  Data[4] := ' ';
  Data[5] := '2';
  Data[6] := #13;
  Data[7] := #10;

  if (PrintRawData(hPrn, @Data, 8) < 0) then
  begin
    ShowMessage('PrintRawData Failed');
    EndRawPrintPage(hPrn);
    EndRawPrintJob(hPrn);
    Exit;
  end;

  if (EndRawPrintPage(hPrn) < 0) then
  begin
    ShowMessage('EndRawPrintPage Failed');
    EndRawPrintJob(hPrn);
    Exit;
  end;

  if (EndRawPrintJob(hPrn) < 0) then
  begin
    ShowMessage('EndRawPrintJob Failed');
    Exit;
  end;
end;

Пример кода, предоставленный в этом примере, немного избыточен, поскольку печатает одни и те же данные дважды, что можно оптимизировать. Кроме того, нет обработки ошибок для случаев, когда принтер занят или недоступен.

Вот некоторые предложения:

  1. Используйте блок Try...Except для ловли и обработки исключений.
  2. Проверьте, занят ли принтер перед печатанием.
  3. Оптимизируйте код, удалив ненужные шаги.
  4. Добавьте более комментариев, чтобы объяснить, что каждый часть кода делает.
  5. Рассмотрите использование отдельного потока для печати, чтобы избежать блокировки основного потока.

Надеюсь, это поможет! Если у вас есть какие-либо дальнейшие вопросы.

Как распечатать файл через порт принтера в Delphi с помощью библиотеки PrtRaw.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Принтеры и Печать ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:24:09/0.0042109489440918/0