[许多打印机都有一个“送纸和裁切”或“裁切纸”命令(我说的是POS-这里的打印机)。
由于并非总是可以使用POS.NET(严重的驱动程序不兼容性),并且GDI可以做得更多,因此,在使用GDI进行打印时,我们也想使用切纸器。
有办法吗?可能在发出EndDocument()时?
甚至可能来自.NET?
GDI甚至是抽象的Windows打印模型都可能对您没有帮助。您将必须使用通常希望接收数据的语言将供纸和剪切命令发送到打印机。
例如,Epson TM-T88III thermal receipt printer本身讲ESC / POS语言,而不是GDI或PCL命令序列。但是,大多数这些打印机都附带打印机驱动程序,这些驱动程序使Windows将其视为常规GDI打印机。这些驱动程序通常的工作方式是,将所有GDI命令光栅化为软件中的一个大位图,然后通过其本机语言“打印位图”命令将位图分发给打印机以进行打印。这通常具有不良效果:
例如,这是an extensive example on my usually-irrelevant blog中的代码段。您可以在结尾处看到如何在Epson热敏票据打印机上用等于“进纸并裁切”命令的必要字节顺序填充BinaryWriter
(AsciiControlChars
只是一个带有常量的静态类):
using (var ms = new MemoryStream())
using (var bw = new BinaryWriter(ms))
{
// Reset the printer bws (NV images are not cleared)
bw.Write(AsciiControlChars.Escape);
bw.Write('@');
// Render the logo
RenderLogo(bw);
// Feed 3 vertical motion units and cut the paper with a 1 point cut
bw.Write(AsciiControlChars.GroupSeparator);
bw.Write('V');
bw.Write((byte)66);
bw.Write((byte)3);
bw.Flush();
return ms.ToArray();
}
然后,您可以使用该文章末尾的代码将字节作为RAW文档直接发送到打印机,该代码可与各种Win32打印机功能配合使用,或者使用Microsoft的RawPrinterHelper class。
您需要查找特定于打印机的命令。可能是它与您在此处看到的没有太大不同:POS语言已经开始标准化,但这也就像说SQL是一种标准-人类可以相互理解,但如果不进行一些调整就无法真正实现互操作。
[如果您确实仍然想使用GDI,则可以按常规方式将GDI文档打印到打印机(同样,假设它确实存在GDI打印机驱动程序),然后发出第二个小的RAW文档发送到包含本机送纸和剪切命令的打印机。 (或者,某些GDI打印机驱动程序使您可以在“打印机”控制面板中直接指定“在打印文档后始终剪切”,但是祝您好运,以编程方式很好地访问该驱动程序功能!)
希望这有助于描绘GDI与POS打印机的关系。
[向您问好,您有库存爱普生TM-T88V打印机,我想购买100台爱普生TM-T88V打印机。请发送报价,我们的付款条件是信用卡。
David Shively.1-346-246-0339。