许多打印机都有“送纸和切纸”命令(我在这里谈论POS - 打印机)。
由于使用POS.NET并不总是可行(可怕的驱动程序不兼容)并且GDI可以做得更多,我们也希望在使用GDI进行打印时也使用切纸器。
有没有办法这样做?可能在发布EndDocument()?
时或者甚至可能来自.NET?
答案 0 :(得分:2)
GDI甚至是抽象的Windows打印模型都可能无法帮助您。您将不得不使用它希望通常接收数据的语言将feed和cut命令发送到打印机。
例如,Epson TM-T88III thermal receipt printer本身使用ESC / POS语言,而不是GDI或PCL命令序列。但是,大多数这些打印机都带有打印机驱动程序,使Windows将它们视为常规GDI打印机。这些驱动程序通常的工作方式是将所有GDI命令光栅化为软件中的一个大位图,然后将位图发送到打印机,以通过其本机语言“print the bit-image”命令进行打印。这通常具有不太理想的效果:
例如,以下是an extensive example on my usually-irrelevant blog的代码片段。你可以看到我最近如何在BinaryWriter
填充必要的字节序列,这些字节等于我们Epson热敏收据打印机上的“送纸和切纸”命令(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包含本机feed和cut命令的打印机文档。 (或者,某些GDI打印机驱动程序允许您在“打印机”控制面板中指定“在打印文档后始终剪切” - 但是以编程方式以详细记录的方式访问该驱动程序功能会很幸运!)
希望这有助于描绘GDI与POS打印机的关系。