silverlight - 从网络打印 "raw text"(ZPL)

标签 silverlight printing zpl

我们有很多旧的 ZPL 标签。

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

我们有一些想法:

  1. 从 Silverlight 打印。不可行。似乎无法在不调用 COM 对象的情况下从 .NET 打印“原始”到 Zebra,而这在普通 Silverlight 中是不可能的。

  2. 从 Silverlight 中,将 ZPL 视为文件并将其文件复制到打印机。本地打印机必须设置为共享。可以在浏览器外的 Silverlight 中以更高的信任度工作。但如果可能的话,我们希望避免浏览器之外。

  3. 如果 Zebra 打印机设置为使用通用/文本驱动程序,我可以在 Notepad.exe 中打开 ZPL 文件,并使用"file"->“打印”将 ZPL 发送到打印机。在这种情况下,Zebra 打印机会将文本解释为 ZPL 指令,而不是实际文本。有什么方法可以从浏览器“利用”这个吗?尝试了几种方法,例如简单地在浏览器中打开 ZPL 文件并执行"file"->“打印”,但这似乎不起作用。还尝试过从 Javascript windows.print();

  4. 进行打印
  5. 是否有任何其他插件(java applet、flash 等)能够将原始文本(例如 ZPL)发送到 Zebra 打印机?

  6. 将 ZPL 转换为图像(或 pdf:s)。有这样的工具吗?

还有其他想法吗?

最佳答案

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

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 类:

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);
        }
    }
}

关于silverlight - 从网络打印 "raw text"(ZPL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7008575/

相关文章:

Silverlight 数据形式 MVVM 命令绑定(bind)更新

wpf - 可移植类库中的 ViewModel 支持

css - 通过 CSS 打印比例

在一个 ZPL 命令中打印多个(不同的)标签

utf-8 - 在 ZPL 中打印带有尖号的字符

java - Zebra GK420d ZPL 打印机通过 USB 在 Java 中的状态

javascript - 从 JavaScript 迭代 Silverlight 字典?

Silverlight 项目控件。可以通过模板完全移除面板吗?

php - 自动按计划打印 pdf

c# - C# Windows 应用程序中的打印问题 - 始终打印到默认打印机