Delphi:PJL 命令到打印机并读回响应

Posted

技术标签:

【中文标题】Delphi:PJL 命令到打印机并读回响应【英文标题】:Delphi: PJL commands to printer and reading the responses back 【发布时间】:2010-07-12 07:39:03 【问题描述】:

在将 PJL 发送到打印机时,我正在努力从打印机获取信息。打印机支持 PJL,它是一个 USB 打印机。现在获取信息/示例似乎是一个问题,或者我正在寻找错误的地方。我知道 MSDN 上有很多信息,但是我已经尝试了所有我在那里得到的东西,从 docinfo 到写/读打印机,但似乎没有任何效果。

有人说可以使用 writeprinter 和 readprinter。我试过这个,当我写打印机时,打印机似乎在“做”一些事情,但读打印机返回或错误或空白。现在我认为这可能是因为打印驱动程序正在“锁定”端口,所以您无法从中读取信息?

我在某处看到的另一个选项是使用 writefile 和 readfile。在这里,您将获得打印机的物理端口部分,例如“\?\USB#VID_05CA&PID_0403#S5208603411#28d78fad-5a12-11d1-ae5b-0000f803a8c2”。然后将端口更改为“FILE”。使用带有路径的 writefile 和 readfile 作为上面的物理路径。获取您需要的信息,然后将端口设置回原始端口。也试过了,也报错。

我只是想做一个简单的@PJL INFO PAGECOUNT(我省略了转义字符等)。该字符串是正确的,因为在联网打印机上使用该字符串,它可以 100% 工作,我可以获得信息。但是本地打印机是个问题。

有没有人有这个工作或工作的例子?任何帮助将不胜感激。

PS:以下是我尝试过的 100 个示例中的 1 个。这是 writeprinter 示例:

procedure TForm1.Button5Click(Sender: TObject);
Const
    Defaults: TPrinterDefaults = (
      pDatatype : Nil;
      pDevMode  : nil;
      DesiredAccess :  PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER  ) ;
Var
  Device : array[0..255] of char;
  FPrinterHandle:THandle;
  DocInfo1: TDocInfo1;
  Buffer, Buffer2:PChar;
  Written, Len:Cardinal;
  i: Integer;
  sPath: String;
Begin

  StrCopy(Device,PChar('RICOH Aficio SP 4210N PCL 6'));
  OpenPrinter(@Device, FPrinterHandle, @Defaults);

  DocInfo1.pDocName := 'test';
  DocInfo1.pOutputFile := Nil;
  DocInfo1.pDatatype := 'RAW';

  StartDocPrinter(FPrinterHandle, 1, @DocInfo1);

  StartPagePrinter(FPrinterHandle);

  Buffer := #27+'%-12345X@PJL COMMENT'+#13+#10+'@PJL INFO PAGECOUNT'+#13+#10+#27+'%-12345X';

  WritePrinter(FPrinterHandle,@Buffer,Length(Buffer), Written);

  EndPagePrinter(FPrinterHandle);

  EndDocPrinter(FPrinterHandle);

// everithing is OK here, BUT

  ReadPrinter(FPrinterHandle, @Buffer2, Length(Buffer2), len  );

end;

【问题讨论】:

什么Delphi版本?我们在这里说的是 unicode 还是 ansi PChar? 它的 Delphi 2007 32bit 和它的 ansi pchar 或者应该是。这只是一个示例代码,我还有很多其他代码,其中一些是用 PAnsiChar 指定的。 【参考方案1】:

查看http://www.undocprint.org/winspool/tips_and_tricks 了解如何操作以及一些示例 C 代码。

即使使用此代码,对您有用的可能性也很小。为了能够从打印机回读,端口监视器必须支持双向模式,而标准 USB 端口监视器不支持。

另外,在您上面的代码中,传递给 ReadPrinter() 的 Buffer2 不正确。需要预先分配缓冲区空间,然后传递缓冲区的地址,而不是缓冲区的指针地址...

var
    Buffer2 : array[0..255] of Char;
begin
...
ReadPrinter( FPrinterHandle, @Buffer2[0], Length(Buffer2), len );
end;

【讨论】:

如果在打印的过程中发生错误,readprinter 会返回任何内容吗?

以上是关于Delphi:PJL 命令到打印机并读回响应的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 打印使用文件重写功能

在 Delphi 中使用 ADOConnection 查看“打印”语句的输出

delphi如何打印到指定的打印机

delphi ReportMachine打印问题

使用Delphi实现票据精确打印

Delphi 10 Seattle 小票打印控件TQ_Printer