Warm tip: This article is reproduced from serverfault.com, please click

zebra printers-Delphi 打印使用文件重写功能

(zebra printers - Delphi Printing using file rewrite function)

发布于 2021-01-15 06:38:20

在我的应用程序中,所有打印机都使用printer.printers命令列出这仅列出打印机名称。选择后,它被保存在数据库中。

稍后,使用该AssignFile函数将此打印机名称分配给文本文件。打印是使用Rewrite功能完成的

如果我将所选打印机保存\\PCname\printer name在数据库中,然后将其与Rewrite函数一起使用,则它可以工作。

但是如果我们只在数据库中保存打印机名称,那么打印就不会发生。是否需要保存\\PCname\printer name路径?或者有没有其他解决方案。

Questioner
poonam
Viewed
0
Delphi Coder 2021-01-15 20:12:47

除了使用 Pascal 文件访问功能进行打印之外,另一种方法是使用 Windows API 进行后台处理程序。

function PrintWithSpooler(const Name: string; const Data: AnsiString): integer;
var
  hPrinter: THandle;
  DocInfo: TDocInfo1;
  bSuccess: boolean;
  dwBytesWritten: DWORD;
begin
  result := S_OK;
  bSuccess := false;

  DocInfo.pOutputFile := nil;
  DocInfo.pDatatype := 'RAW';
  DocInfo.pDocName := 'Label';

  if OpenPrinter(PChar(Trim(Name)), hPrinter, nil) then
  begin
    try
      if StartDocPrinter(hPrinter, 1, @DocInfo) > 0 then
      begin
        try
          if StartPagePrinter(hPrinter) then
          begin
            try
              bSuccess := WritePrinter(hPrinter, Pointer(Data), Length(Data), dwBytesWritten);
            finally
              EndPagePrinter(hPrinter);
            end;
          end;
        finally
          EndDocPrinter(hPrinter);
        end;
      end;
    finally
      ClosePrinter(hPrinter);
    end;
  end;

  if not bSuccess then
  begin
    result := GetLastError;

    // in case there was no error from GetLastError
    if result = S_OK then
      result := S_FALSE;
  end;
end;