从PuTTY发送打印作业到Zebra ZXP 3 SDK(non.zpl打印机)

时间:2014-12-11 21:41:56

标签: c# putty zebra-printers redmon

我所拥有的是通过PuTTY(SSH客户端)访问的病历数据库。这些卡本身只有客户名称,条形码格式的记录编号(仍然确定要使用的条形码类型)和客户注册日期。

1)我们可以将Zebra条码标签打印机的数据输出为.zpl,或者与HP或Brother等激光打印机兼容,格式为RAW格式。 2)ZXP 3 SDK接受什么输出? 3)SDK是否可以设置为等待并接受来自RedMon等命令行的数据?

这些卡片本身只有印刷数据,没有磁条,智能芯片,层压板或类似物。

Mahalo提前。

1 个答案:

答案 0 :(得分:0)

我不建议使用RedMon和SDK,因为你不想要做什么,而且他们都是时间吸血鬼。相反,我会编写一个小型Windows窗体应用程序,它侦听TCP端口以接收打印作业并将其发送到使用Zebra驱动程序的标准打印机。

让MUMPS应用程序通过VT100中的Remote Print支持发送XML文档。我一直在使用的例子如下:

^[[5i
<patient>
    <name first="John" last="Smith" />
    <mrn>A04390503</mrn>
    <dob>1991-03-12</dob>
</patient>
^[[4i

在Windows客户端上配置打印机以重定向到TCP / IP:

  1. 添加打印机
  2. 本地打印机
  3. 创建新端口
    • 标准TCP / IP端口
    • 主机名:127.0.0.1
    • 端口名称:CardFormatter
    • 取消选中&#34;查询打印机并自动选择要使用的驱动程序&#34;
    • 设备类型:自定义
      • 协议:原始
      • 港口:9101
  4. 驱动程序:Generic / Text Only
  5. 在登录时启动应用程序,然后从服务器打印。 MUMPS应用程序将发回XML,Putty打印到Text打印机,然后将其发送到localhost上的C#应用​​程序。 C#应用程序解释XML并通过Zebra驱动程序或SDK打印到实际的打印机。

    注意:这仅假设每个工作站有一个交互式会话。如果您使用快速用户切换或终端服务,必须进一步注意确保工作正常。

    示例应用程序:

    Program.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace PassThroughPrinterTest
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new TrayApplicationContext());
            }
        }
    }
    

    TrayApplicationContext.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics.Contracts;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace PassThroughPrinterTest
    {
        class TrayApplicationContext : ApplicationContext
        {
            private NotifyIcon trayIcon;
            private PrintListener listener;
            private PrintHandler handler;
    
            public TrayApplicationContext()
            {
                this.trayIcon = new NotifyIcon()
                {
                    Text = "Card Formatter",
                    Icon = Properties.Resources.AppIcon,
                    ContextMenu = new ContextMenu()
                    {
                        MenuItems =
                        {
                            new MenuItem("Print Options...", miPrintOptions_Click),
                            new MenuItem("Exit", miExit_Click)
                        }
                    },
                    Visible = true
                };
    
                this.handler = new PrintHandler();
    
                this.listener = new PrintListener(9101);
                this.listener.PrintDataReceived += this.handler.HandlePrintData;
            }
    
            private void miPrintOptions_Click(object sender, EventArgs args)
            {
                // TODO: add configuration and options to avoid having to hard code
                // the printer name in PrintHandler.cs
                MessageBox.Show("Options");
            }
    
            private void miExit_Click(object sender, EventArgs args)
            {
                Application.Exit();
            }
    
            protected override void Dispose(bool disposing)
            {
                base.Dispose(disposing);
    
                if (disposing)
                {
                    trayIcon.Dispose();
                }
            }
        }
    }
    

    PrintHandler.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml.Linq;
    
    namespace PassThroughPrinterTest
    {
        partial class PrintHandler : Form
        {
            public PrintHandler()
            {
                InitializeComponent();
            }
    
            public void HandlePrintData(object sender, PrintDataReceivedEventArgs args)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new EventHandler<PrintDataReceivedEventArgs>(HandlePrintData), sender, args);
                    return;
                }
    
                this.Show();
    
                var sXml = Encoding.UTF8.GetString(args.PrintData);
                this.PrintCard(XDocument.Parse(sXml));
    
                this.Hide();
            }
    
            private void PrintCard(XDocument xDocument)
            {
                var nameElement = xDocument.Root.Element("name");
                var lastName = nameElement.Attribute("last").Value;
                var firstName = nameElement.Attribute("first").Value;
                var mrn = xDocument.Root.Element("mrn").Value;
    
                var printDoc = new PrintDocument()
                {
                    PrinterSettings = new PrinterSettings()
                    {
                        PrinterName = "Adobe PDF"
                    },
                    DocumentName = "Patient ID Card"
                };
                var cardPaperSize = new PaperSize("Card", 337, 213) { RawKind = (int)PaperKind.Custom };
                printDoc.DefaultPageSettings.PaperSize = cardPaperSize;
                printDoc.PrinterSettings.DefaultPageSettings.PaperSize = cardPaperSize;
                printDoc.PrintPage += (s, e) =>
                {
                    var gfx = e.Graphics;
    
                    // print the text information
                    var fArial12 = new Font("Arial", 12);
                    gfx.DrawString(lastName, fArial12, Brushes.Black, new RectangleF(25, 25, 200, 75));
                    gfx.DrawString(firstName, fArial12, Brushes.Black, new RectangleF(25, 100, 200, 75));
    
                    // add a code39 barcode using a barcode font
                    // http://www.idautomation.com/free-barcode-products/code39-font/
                    // var fCode39 = new Font("IDAutomationHC39M", 12);
                    // gfx.DrawString("(" + mrn + ")", fArial12, Brushes.Black, new RectangleF(25, 200, 200, 75));
    
                    // or by using a barcode library
                    // https://barcoderender.codeplex.com/
                    // var barcode = BarcodeDrawFactory.Code128WithChecksum.Draw(mrn, 20, 2);
                    // gfx.DrawImage(barcode, 50, 200);
    
                    e.HasMorePages = false;
                };
                printDoc.Print();
            }
        }
    }
    

    PrintListener.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Diagnostics.Contracts;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    
    namespace PassThroughPrinterTest
    {
        sealed class PrintListener : IDisposable
        {
            private TcpListener listener;
    
            public event EventHandler<PrintDataReceivedEventArgs> PrintDataReceived;
    
            public PrintListener(int port)
            {
                this.listener = new TcpListener(IPAddress.Loopback, port);
                this.listener.Start();
    
                this.listener.BeginAcceptTcpClient(listener_AcceptClient, null);
            }
    
            public void Dispose()
            {
                this.listener.Stop();
            }
    
            private void listener_AcceptClient(IAsyncResult iar)
            {
                TcpClient client = null;
                bool isStopped = false;
                try
                {
                    client = this.listener.EndAcceptTcpClient(iar);
                }
                catch (ObjectDisposedException)
                {
                    // this will occur in graceful shutdown
                    isStopped = true;
                    return;
                }
                finally
                {
                    if (!isStopped)
                    {
                        this.listener.BeginAcceptTcpClient(listener_AcceptClient, null);
                    }
                }
                Debug.Assert(client != null);
    
                try
                {
                    byte[] printData;
                    using (var clientStream = client.GetStream())
                    using (var buffer = new MemoryStream())
                    {
                        clientStream.CopyTo(buffer);
    
                        printData = buffer.ToArray();
                    }
    
                    OnPrintDataReceived(printData);
                }
                catch
                {
                    // TODO: add logging and error handling for network issues or processing issues
                    throw;
                }
                finally
                {
                    client.Close();
                }
            }
    
            private void OnPrintDataReceived(byte[] printData)
            {
                var handler = PrintDataReceived;
                if (handler != null)
                {
                    handler(this, new PrintDataReceivedEventArgs(printData));
                }
            }
        }
    }
    

    TrayApplicationContext.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics.Contracts;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace PassThroughPrinterTest
    {
        class TrayApplicationContext : ApplicationContext
        {
            private NotifyIcon trayIcon;
            private PrintListener listener;
            private PrintHandler handler;
    
            public TrayApplicationContext()
            {
                this.trayIcon = new NotifyIcon()
                {
                    Text = "Card Formatter",
                    Icon = Properties.Resources.AppIcon,
                    ContextMenu = new ContextMenu()
                    {
                        MenuItems =
                        {
                            new MenuItem("Print Options...", miPrintOptions_Click),
                            new MenuItem("Exit", miExit_Click)
                        }
                    },
                    Visible = true
                };
    
                this.handler = new PrintHandler();
    
                this.listener = new PrintListener(9101);
                this.listener.PrintDataReceived += this.handler.HandlePrintData;
            }
    
            private void miPrintOptions_Click(object sender, EventArgs args)
            {
                // TODO: add configuration and options to avoid having to hard code
                // the printer name in PrintHandler.cs
                MessageBox.Show("Options");
            }
    
            private void miExit_Click(object sender, EventArgs args)
            {
                Application.Exit();
            }
    
            protected override void Dispose(bool disposing)
            {
                base.Dispose(disposing);
    
                if (disposing)
                {
                    listener.Dispose();
                    trayIcon.Dispose();
                }
            }
        }
    }
    

    PrintDataReceivedEventArgs.cs

    using System;
    
    namespace PassThroughPrinterTest
    {
        class PrintDataReceivedEventArgs : EventArgs
        {
            public byte[] PrintData { get; set; }
    
            public PrintDataReceivedEventArgs(byte[] data)
            {
                if (data == null)
                    throw new ArgumentNullException("data");
    
                this.PrintData = data;
            }
        }
    }