【问题标题】:How to print a bill from POS printer in .net using socket?如何使用套接字从 .net 中的 POS 打印机打印账单?
【发布时间】:2022-01-24 06:48:39
【问题描述】:

我有一个 ASP Web API 和网络打印机 (Epson TM-U220)。我需要通过代码选择打印机并打印账单。我只是尝试如下。但不能正常工作。 I want to print this direct using pos printer

var server = "192.168.1.164";
var nome = "www.pdf";

Socket clientSocket = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp);
clientSocket.NoDelay = true;

IPAddress ip = IPAddress.Parse(server);
IPEndPoint ipep = new IPEndPoint(ip, 9100);
clientSocket.Connect(ipep);

clientSocket.Send(File.ReadAllBytes(nome));
clientSocket.Close();

【问题讨论】:

  • 您不能只将 PDF 字节流发送到打印机...打印机不是这样工作的
  • 我建议您阅读 CUPS 等已建立的网络打印协议:cups.org
  • 我建议您编辑问题并解释您实际上想要什么。 POS 打印机与普通打印机完全不同。使用普通打印机不需要套接字或 TCP 连接,您可以使用 .NET 的打印机类打印到配置的 Windows 打印机。 POS 打印机虽然不显示为普通打印机,但它们可能显示为程序向其发送打印机命令的虚拟串行或 LPT 端口。有些可能有自己的打印机驱动程序。
  • 您不能只是将 PDF 文件复制给他们,您必须将其转换。将带有打印命令和文本的字符串发送到打印机比创建 PDF 然后尝试将其转换为打印命令要容易得多。即使那样,您也不能只向打印机发送一堆字节。您发送的数据包需要具有打印机可以理解的格式。当您使用虚拟串行或 LPT 端口时,驱动程序负责打包字节。当您直接与打印机交谈时,您必须这样做。打印机的文档或支持网站可能解释需要什么
  • 查看printer's support page 我看到Epson OPOS ADK for .NET v1.14.20E 是第一次下载。你试过用这个吗?

标签: c# sockets pdf pos network-printers


【解决方案1】:

正如许多人评论的那样,Epson TM-U220 不具备打印 PDF 的能力。
发送前需将打印内容转换为Epson TM-U220支持的ESC/POS控制序列。

例如,这篇文章和那里介绍的库可能会有所帮助。
Printing PDF doc to esc/pos Thermal printer
MoienTajik/EscPrinterSample

但是,Epson TM-U220 是针式打印机,由于分辨率低,打印速度慢,热敏打印机的上述方法可能无法获得舒适的效果。
您介绍的打印示例是针对热敏打印机的,而针式打印机无法打印出如此精美细致的打印件。

顺便说一句,评论中的Epson OPOS ADK for .NET v1.14.20E是客户端打印方式,在服务器端操作难度很大。
更重要的是,简单地嵌入它需要理解和解决概念和子系统,例如 POS for.NET/OPOS。


鉴于以上情况,收据需要是PDF吗?

如果可以在创建PDF的时候调用函数转换为ESC/POS控制序列,你也许可以使用以下库。
lukevp/ESC-POS-.NET

ESCPOS.NET - 易于使用、跨平台、快速且高效。

即使你使用这个库,也不能直接指定打印PDF。
Print pdf file #13

如上题所述,可以使用应用程序或其他库将PDF转换为PNG,然后调用上述库,但这需要时间,而且打印效果会很差。
HOW TO CONVERT PDF TO PNG IN C# .NET?

【讨论】:

    【解决方案2】:

    我试试这个,效果很好。但是,我仍然无法获取打印机状态。

    //--printer script model
    public class DirectPrintingScript
    {
        public string Value { get; set; }
        public int PrintMethodID { get; set; }
        public bool IsNeedPrint { get; set; }
    }
    
    //--print method
    public void print(List<DirectPrintingScript> result, string IP, int Port)
    {
        var job = new DirectPrinterProcess();
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        clientSocket.NoDelay = true;
    
        IPAddress ip = IPAddress.Parse(IP);
        IPEndPoint ipep = new IPEndPoint(ip, Port);
        clientSocket.Connect(ipep);
        Encoding enc = Encoding.ASCII;
    
        foreach (DirectPrintingScript item in result)
        {
            var command = job.SelectMethod(item.PrintMethodID);
            byte[] commandBytes = Encoding.ASCII.GetBytes(command);
            byte[] contentBytes = Encoding.ASCII.GetBytes(item.Value);
            clientSocket.Send(commandBytes);
    
            if (item.IsNeedPrint)
            {
               clientSocket.Send(contentBytes);
               var n = job.NewLine();
               byte[] nBytes = Encoding.ASCII.GetBytes(n);
               clientSocket.Send(nBytes);
            }
         }
    
         // Line feed hexadecimal values
         byte[] bEsc = new byte[4];
         bEsc[0] = 0x0A;
         bEsc[1] = 0x0A;
         bEsc[2] = 0x0A;
         bEsc[3] = 0x0A;
    
         // Send the bytes over 
         clientSocket.Send(bEsc);
    
         clientSocket.Close();
    }
    
    //--print method process
        public class DirectPrinterProcess
        {
            public string SelectMethod(int MethodID)
            {
                switch (MethodID)
                {
                    case 1:
                        return JustificationCenter();
                    case 2:
                        return JustificationLeft();
                    case 3:
                        return DoubleHeight();
                    case 4:
                        return DoubleWidth();
                    case 5:
                        return CancelDoubleHeightWidth();
                    case 6:
                        return SetColorRed();
                    case 7:
                        return SetColorBlack();
                    default:
                        return CancelDoubleHeightWidth();
                }
            }
    
            private string JustificationCenter()
            {
                return "" + (char)27 + (char)97 + (char)1;
            }
    
            private string JustificationLeft()
            {
                return "" + (char)27 + (char)97 + (char)0;
            }
    
            private string DoubleHeight()
            {
                return "" + (char)27 + (char)33 + (char)16;
            }
    
            private string DoubleWidth()
            {
                return "" + (char)27 + (char)33 + (char)32;
            }
    
            private string CancelDoubleHeightWidth()
            {
                return "" + (char)27 + (char)33 + (char)0;
            }
    
            private string SetColorRed()
            {
                return "" + (char)27 + (char)114 + (char)1;
            }
    
            private string SetColorBlack()
            {
                return "" + (char)27 + (char)114 + (char)0;
            }
    
            public string NewLine()
            {
                return "" + "\n";
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 2019-02-08
      • 2014-11-16
      • 2014-03-06
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多