Printing 使用GDI切割纸张(“送纸和切割”)?

Printing 使用GDI切割纸张(“送纸和切割”)?,printing,gdi,point-of-sale,Printing,Gdi,Point Of Sale,许多打印机都有“进纸和剪切”或“切纸”命令(这里我指的是POS打印机) 由于使用POS.NET并不总是可能的(可怕的驱动程序不兼容),而且GDI可以做更多的事情,因此我们希望在使用GDI打印时也使用切纸机 有没有办法做到这一点?可能是在发布EndDocument()时 或者甚至从.NET?GDI甚至抽象的Windows打印模型都可能帮不了你。您必须以打印机通常希望接收数据的语言向打印机发送feed和cut命令 例如,本机使用ESC/POS语言,而不是一系列GDI或PCL命令。然而,大多数打印机都

许多打印机都有“进纸和剪切”或“切纸”命令(这里我指的是POS打印机)

由于使用POS.NET并不总是可能的(可怕的驱动程序不兼容),而且GDI可以做更多的事情,因此我们希望在使用GDI打印时也使用切纸机

有没有办法做到这一点?可能是在发布EndDocument()时


或者甚至从.NET?

GDI甚至抽象的Windows打印模型都可能帮不了你。您必须以打印机通常希望接收数据的语言向打印机发送feed和cut命令

例如,本机使用ESC/POS语言,而不是一系列GDI或PCL命令。然而,大多数打印机都带有打印机驱动程序,使Windows将其视为常规GDI打印机。这些驱动程序的典型工作方式是,它们在软件中将所有GDI命令光栅化为一个大位图,然后将位图分发给打印机,以便通过其母语“打印位图像”命令进行打印。这通常会产生不理想的效果:

  • 将大量位图数据发送到打印机的效率(从所需时间和传输数据的角度来看)远低于打印机知道如何解释的一系列二进制命令。(您更愿意发送文本图像进行打印,还是只发送实际文本和字体大小规格?类似于HTML/CSS与文本图像。)
  • 这些打印机的分辨率通常较低,为单色(即全黑或全白,无灰度或彩色)。它们的预加载字体设计为在这些限制下工作良好,以便清晰、清晰地呈现。通过栅格化为位图,我们失去了这种精心设计,因为像素被捕捉并舍入网格,从而导致在实际打印输出上呈现参差不齐的文本。如果你想画一些对这种舍入非常敏感的东西,比如条形码,你就是索尔,除非你在使用GDI的时候刻意记住打印机设备上下文的DPI
例如,下面是中的一段代码。在接近尾声时,您可以看到我如何用必要的字节序列填充
BinaryWriter
,这些字节序列等于Epson thermal收据打印机上的“进纸和剪切”命令(
AsciiControlChars
只是一个带有常量的静态类):

然后,您可以直接将字节作为原始文档发送到打印机,或者使用文章末尾的代码(该代码适用于各种Win32打印机功能),或者使用Microsoft的

您需要查找特定于打印机的命令。很可能它与您在这里看到的没有太大的不同:POS语言开始标准化,但这也就像说SQL是一种标准——人类可以相互理解,但如果不做一些调整,就不能真正实现互操作

如果您真的还想使用GDI,您可以用通常的方式将GDI文档打印到打印机上(同样,假设存在GDI打印机驱动程序,它可能会这样做),然后向打印机发出第二个小的原始文档,该文档包含本机的feed and cut命令。(或者,一些GDI打印机驱动程序允许您在打印机控制面板中指定“打印文档后始终剪切”——但祝您好运,可以通过编程方式以文档化的方式访问该驱动程序功能!)


希望这有助于描绘出GDI与POS打印机之间的关系。

真是一个很好的解释。谢谢。谢谢你-当我在那天接受你的解决方案时,互联网断了。。。只是在错误的时刻。
        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();
        }