首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Web打印“原始文本”(ZPL)

从Web打印“原始文本”(ZPL)
EN

Stack Overflow用户
提问于 2011-08-10 09:29:16
回答 3查看 11.3K关注 0票数 7

我们有很多旧的ZPL标签。

我们希望能够从网络客户端打印它们。打印机连接到客户端,而不是服务器。

我们有一些想法:

  1. 银光的指纹。不会死的。在没有调用COM对象的情况下,似乎无法从.NET中将"raw“打印到斑马,这在普通Silverlight中是不可能实现的。
  2. 从Silverlight,将ZPL视为文件,并将其复制到打印机。本地打印机必须设置为共享。是否在信任提升的情况下从浏览器外运行Silverlight。但是,如果是肯定的,我们希望避免脱离浏览器。
  3. 如果Zebra打印机设置为使用泛型/文本驱动程序,则可以在Notepad.exe中打开ZPL -文件,并使用文件->打印将ZPL发送到打印机。在这种情况下,斑马打印机将将文本解释为ZPL指令,而不是实际文本。有什么方法可以从浏览器中“利用”吗?尝试过几种方法,例如,简单地在浏览器中打开ZPL文件和do file ->打印,但这似乎不起作用。还尝试从Javascript windows.print()打印;
  4. 还有其他插件(java applet、flash等)吗?能够发送原始文本(例如ZPL)到斑马打印机?
  5. 将ZPL转换为图像(或pdf:s)。有这样的工具吗?

还有其他想法吗?

EN

回答 3

Stack Overflow用户

发布于 2012-02-08 21:20:49

在Silverlight 5中,您可以在打开增强的安全性时打印原始文本。以下是我所做的:

代码语言:javascript
复制
private void Button_Click(object sender, RoutedEventArgs e)
{
    StringBuilder label = new StringBuilder();
    label.AppendLine("^XA^MCA^PR8^XZ");
    label.AppendLine("^XA");
    label.AppendLine("^DFCTN^FS");
    label.AppendLine("^LH110,0^FS");
    label.Append("^FO0,60^A0,30,20^FB250,1,0,C,0^FD");
    label.Append(CategoryTextBox.Text.TrimEnd());
    label.AppendLine("^FS");
    label.AppendLine("^FO5,120^A0,40,30^FB250,1,0,C,0^FR^FN1^FS");
    label.AppendLine("^XZ");
    label.AppendLine("^XA");
    label.AppendLine("^XFCTN^FS");
    label.Append("^FO10,100");
    label.Append("^B3N,N,40,Y^FD");
    label.Append(LicensePlateTextBox.Text.TrimEnd());
    label.AppendLine("^FS");
    label.AppendLine("^XZ");

    bool result = RawPrinterHelper.SendStringToPrinter("Zebra Label Printer", label.ToString());
    if (!result)
    {
        MessageBox.Show("Error Returned From Print Spool.  Check Setup.");
    }
}

RawPrintHelper类:

代码语言:javascript
复制
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace TestPrinting
{
    public class RawPrinterHelper
    {
        // Structure and API declarions:
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

        [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool ClosePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

        [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndDocPrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

        // SendBytesToPrinter()
        // When the function is given a printer name and an unmanaged array
        // of bytes, the function sends those bytes to the print queue.
        // Returns true on success, false on failure.
        public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32 dwError = 0, dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool bSuccess = false; // Assume failure unless you specifically succeed.

            di.pDocName = "Document";
            di.pDataType = "RAW";

            // Open the printer.
            if (OpenPrinter(szPrinterName, out hPrinter, IntPtr.Zero))
            {
                // Start a document.
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    // Start a page.
                    if (StartPagePrinter(hPrinter))
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if (bSuccess == false)
            {
                dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }

        public static bool SendStringToPrinter(string szPrinterName, string pDoc)
        {
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(pDoc));
            byte[] rawData = new byte[stream.Length];
            stream.Read(rawData, 0, (int)stream.Length);
            GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
            IntPtr pointer = rawDataHandle.AddrOfPinnedObject();
            return SendBytesToPrinter(szPrinterName, pointer, rawData.Length);
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2011-10-02 19:53:05

如果打印机直接连接到网络,您可以打开一个套接字到端口9100,并在那里发送ZPL代码。

代码语言:javascript
复制
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
    ProtocolType.Tcp);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.RemoteEndPoint = new IPEndPoint("192.168.0.2", 9100);
args.UserToken = sock;
args.Completed += (s,e) => {
    if (e.SocketError == SocketError.Success)
    {
        string zpl = string.Format(
            @"
^XA^MCA^PR8^XZ
^XA
^DFCTN^FS
^LH110,0^FS
^FO0,60^A0,30,20^FB250,1,0,C,0^FD{0}^FS
^FO5,120^A0,40,30^FB250,1,0,C,0^FR^FN1^FS
^XZ
^XA
^XFCTN^FS
^FO10,100^B3N,N,40,Y^FD{1}^FS
^XZ
            ".Trim(),
            category, licencePlate);
        byte[] buf = Encoding.UTF8.GetBytes(zpl);
        e.SetBuffer(buf, 0, buf.Length);
        sock.SendAsync(e);
    }
};

sock.ConnectAsync(args);

不幸的是,Silverlight只允许港口4502-4534上的套接字连接,除非它是以提升的权限运行的。您必须将silverlight应用程序作为受信任的应用程序运行,将打印机配置为在安全端口上侦听,或者通过服务器中继它。

票数 2
EN

Stack Overflow用户

发布于 2011-09-06 23:38:29

您可以使用这个出色的java applet jZebra http://code.google.com/p/jzebra/,它将原始数据发送到任何打印机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7008575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档