6

古い ZPL ラベルがたくさんあります。

Web クライアントから印刷できるようにしたいと考えています。プリンターはサーバーではなくクライアントに接続されています。

いくつかのアイデアがありました:

  1. Silverlight から印刷します。実行不可能。COM オブジェクトを呼び出さずに .NET から Zebra に "raw" を出力する方法はないようで、プレーンな Silverlight からは不可能です。

  2. Silverlight から、ZPL をファイルとして扱い、ファイルをプリンターにコピーします。ローカル プリンターは共有として設定する必要があります。昇格された信頼を使用して、Silverlight Out of Browser から動作します。しかし、可能であれば、Out of browser は避けたいと思います。

  3. Zebra プリンターが Generic/Text ドライバーを使用するように設定されている場合、Notepad.exe で ZPL ファイルを開き、[ファイル] -> [印刷] を使用して ZPL をプリンターに送信できます。この場合、Zebra プリンタはテキストを実際のテキストではなく ZPL 命令として解釈します。これをブラウザから「悪用」する方法はありますか? たとえば、ブラウザで ZPL ファイルを開き、[ファイル] -> [印刷] を実行するなど、いくつかの方法を試しましたが、うまくいかないようです。また、Javascript windows.print(); から印刷しようとしました。

  4. Raw テキスト (ZPL など) を Zebra プリンタに送信できる他のプラグイン (Java アプレット、フラッシュなど) はありますか?

  5. ZPL を画像 (または pdf:s) に変換します。そのようなツールはありますか?

他のアイデアはありますか?

4

3 に答える 3

3

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);
        }
    }
}
于 2012-02-08T21:20:49.897 に答える
2

プリンターがネットワークに直接接続されている場合は、ポート 9100 へのソケットを開き、そこに ZPL コードを送信できます。

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 アプリケーションを信頼できるアプリケーションとして実行するか、安全なポートでリッスンするようにプリンターを構成するか、サーバー経由で中継する必要があります。

于 2011-10-02T19:53:05.520 に答える
1

このすばらしい Java アプレット jZebra http://code.google.com/p/jzebra/を使用して、生データを任意のプリンタに送信できます。

于 2011-09-06T23:38:29.240 に答える