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

Как отправить на принтер чистый поток данных

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

Как отправить на принтер чистый поток данных

Под Win16 Вы можете использовать функцию SpoolFile, или Passthrough escape, если принтер поддерживает последнее. Под Win32 Вы можете использовать WritePrinter.

Ниже пример открытия принтера и записи чистого потока данных в принтер. Учтите, что Вы должны передать корректное имя принтера, такое, как "HP LaserJet 5MP", чтобы функция сработала успешно.

Конечно, Вы можете включать в поток данных любые необходимые управляющие коды, которые могут потребоваться.


uses WinSpool;

procedure WriteRawStringToPrinter(PrinterName:string; S:string);
var
  Handle: THandle;
  N: DWORD;
  DocInfo1: TDocInfo1;
begin
  if not OpenPrinter(PChar(PrinterName), Handle, nil) then
  begin
    ShowMessage('Error ' + IntToStr(GetLastError));
    Exit;
  end;
  with DocInfo1 do
  begin
    pDocName := PChar('test doc');
    pOutputFile := nil;
    pDataType := 'RAW';
  end;
  StartDocPrinter(Handle, 1, @DocInfo1);
  StartPagePrinter(Handle);
  WritePrinter(Handle, PChar(S), Length(S), N);
  EndPagePrinter(Handle);
  EndDocPrinter(Handle);
  ClosePrinter(Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WriteRawStringToPrinter('HP', 'Test This');
end;

Посмотри и доделай как тебе надо:


unit TextPrinter;

interface

uses
  Windows, Controls, Forms, Dialogs;

type
  TTextPrinter = class(TObject)
    FNumberOfBytesWritten: Integer;
    FHandle: THandle;
    FPrinterOpen: Boolean;
    FErrorString: PChar;
    procedure SetErrorString;
  public
    constructor Create;
    procedure write(const Str: string);
    procedure WriteLn(const Str: string);
    destructor Destroy; override;
  published
    property NumberOfBytesWritten: Integer read FNumberOfBytesWritten;
end;

implementation

{TTextPrinter}

constructor TTextPrinter.Create;
begin
  FHandle := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ
  or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if FHandle = INVALID_HANDLE_VALUE then
  begin
    SetErrorString;
    raise Exception.Create(FErrorString);
  end
  else
    FPrinterOpen := True;
end;

procedure TTextPrinter.SetErrorString;
begin
  if FErrorString <> nil then
  LocalFree(Integer(FErrorString));
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
  nil, GetLastError(), LANG_USER_DEFAULT, @FErrorString, 0, nil);
end;

procedure TTextPrinter.write(const Str: string);
var
  OEMStr: PChar;
  NumberOfBytesToWrite: Integer;
begin
  if not FPrinterOpen then
    Exit;
  NumberOfBytesToWrite := Length(Str);
  OEMStr := PChar(LocalAlloc(LMEM_FIXED, NumberOfBytesToWrite + 1));
  try
    CharToOem(PChar(Str), OEMStr);
    if not WriteFile(FHandle, OEMStr^, NumberOfBytesToWrite, FNumberOfBytesWritten, nil) then
    begin
      SetErrorString;
      raise Exception.Create(FErrorString);
    end;
  finally
    LocalFree(Integer(OEMStr));
  end;
end;

procedure TTextPrinter.WriteLn(const Str: string);
begin
  Self.write(Str);
  Self.write(#10);
end;

destructor TTextPrinter.Destroy;
begin
  CloseHandle(FHandle);
  if FErrorString <> nil then
    LocalFree(Integer(FErrorString));
end;

end.

P.S. В принципе, вместо LPT1 может стоять что угодно, даже сетевой сервер печати (\\server\prn) - все равно печатает. Можно и параметр в конструктор вставить и т.д.

Программный код на языке Delphi, который пишет текст на принтере с помощью функции Windows API WritePrinter. Код разделен на две части: standalone-процедура и класс TTextPrinter, который обертывает эту функциональность и предоставляет методы для записи текста и переноса строк.

Standalone-процедура:

procedure WriteRawStringToPrinter( PrinterName: string; S: string );

Эта процедура принимает два параметра: PrinterName (имя принтера, который нужно использовать) и S (текст, который нужно записать на принтер). Она открывает указанный принтер, начинает документ, пишет текст на принтер с помощью WritePrinter, а затем закрывает документ и принтер.

Класс TTextPrinter:

type
  TTextPrinter = class(TObject)
    FNumberOfBytesWritten: Integer;
    FHandle: THandle;
    FPrinterOpen: Boolean;
    FErrorString: PChar;

    procedure SetErrorString;
    constructor Create;
    procedure write(const Str: string);
    procedure WriteLn(const Str: string);
    destructor Destroy; override;
  published
    property NumberOfBytesWritten: Integer read FNumberOfBytesWritten;
  end;

Класс имеет четыре свойства: FNumberOfBytesWritten (количество байтов, записанных на принтер), FHandle (указатель на принтер), FPrinterOpen (флаг, указывающий, является ли принтер открыт) и FErrorString (строка ошибки, которая может использоваться для отладки).

Класс имеет три метода:

  • SetErrorString: устанавливает строку ошибки на основе последнего Windows API-ошибки.
  • write(const Str: string): пишет строку на принтер с помощью функции WriteFile. Он конвертирует входную строку в OEM-символы с помощью функции CharToOem и затем записывает ее на принтер.
  • WriteLn(const Str: string): пишет перенос строки, за которым следует указанный текст.

Класс также имеет конструктор, который инициализирует указатель на принтер в CreateFile('LPT1', ...), а также деструктор, который закрывает указатель на принтер при уничтожении объекта.

Замечания:

  • Код предполагает, что принтер уже установлен и настроен на системе.
  • Код использует функцию WritePrinter, которая пишет raw-данные на принтер. Это означает, что вам нужно убедиться, что ваш текст кодируется корректно (например, в OEM-символах) перед записью его на принтер.
  • Код не обрабатывает ошибки хорошо; если возникает ошибка при записи на принтер, программа будет выбрасывать исключение и завершаться.
  • Вы можете модифицировать процедуру WriteRawStringToPrinter для использования другого имени принтера или добавления дополнительной функциональности (например, печати нескольких страниц).
  • В целом, этот код предоставляет основу для записи текста на принтер с помощью Delphi. Вы можете расширить его для обработки более сложных сценариев, таких как печать изображений или форматирование текста с жирным или курсивом стилями.

Как отправить на принтер чистый поток данных под Windows, используя функции SpoolFile, Passthrough escape или WritePrinter, а также пример кода на Delphi для записи текста в принтер.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:15:04/0.0062949657440186/1