首页 > 解决方案 > C# 从 WPF 应用程序将 ZPL 打印到 Zebra 打印机

问题描述

我有一个 C# WPF 应用程序,它应该从 Zebra 打印机打印标签。Zebra 打印机设置为通用文本打印机(与使用 Zebra/其他驱动程序相反)。标签的 ZPL 代码已经生成,当我从 Notepad 或 Notepad++ 等文本编辑器打印 ZPL 代码时,标签打印得非常好。当我从 WPF 应用程序打印相同的字符串时,我得到不同的结果。

什么可能导致这些不同的结果?我已经多次验证 ZPL 代码并将其重新复制到我的应用程序中,因此我非常确信 ZPL 是相同的。有没有更好的通过 C# WPF 应用程序打印的方法?这个想法是允许用户将 Zebra 打印机设置为标准 Windows 打印机,并在打印时从 PrintDialog 中选择它。

这是我的打印代码:

        System.Windows.Controls.PrintDialog prnt = new PrintDialog();            
        prnt.PageRangeSelection = PageRangeSelection.AllPages;
        prnt.UserPageRangeEnabled = false;                        

        Nullable<bool> result = prnt.ShowDialog();

        if (result == true)
        {

            string zpl = "^XA" + Environment.NewLine +
                "^RS,,,3,N,,,2" + Environment.NewLine +
                "^RR3" + Environment.NewLine +
                "^XZ" + Environment.NewLine +
                "^XA" + Environment.NewLine +
                "^SZ2^JMA" + Environment.NewLine +
                "^MCY^PMN" + Environment.NewLine +
                "^PW459" + Environment.NewLine +
                "^LT41" + Environment.NewLine +
                "~JSN" + Environment.NewLine +
                "^MD30" + Environment.NewLine +
                "^JZY" + Environment.NewLine +
                "^LH0,0^LRN" + Environment.NewLine +
                "^XZ" + Environment.NewLine +
                "^XA" + Environment.NewLine +
                "^FT31,42" + Environment.NewLine +
                "^CI0" + Environment.NewLine +
                "^A0N,23,31^FDAsset ID:^FS" + Environment.NewLine +
                "^FT31,74" + Environment.NewLine +
                "^A0N,23,31^FDA0000001^FS" + Environment.NewLine +
                "^FT31,106" + Environment.NewLine +
                "^A0N,23,31^FDItem Code:^FS" + Environment.NewLine +
                "^FT31,137" + Environment.NewLine +
                "^A0N,23,31^FD500124^FS" + Environment.NewLine +
                "^FT49,324" + Environment.NewLine +
                "^A0N,23,31^FDShuttleworth conveyor^FS" + Environment.NewLine +
                "^FT49,346" + Environment.NewLine +
                "^A0N,23,31^FDnylon rollers - A^FS" + Environment.NewLine +
                "^FT49,369" + Environment.NewLine +
                "^A0N,23,31^FDsection of roller is 4-1/2^FS" + Environment.NewLine +
                "^FT49,392" + Environment.NewLine +
                "^A0N,23,31^FDlong with a deep pocket...^FS" + Environment.NewLine +
                "^FT31,172" + Environment.NewLine +
                "^A0N,23,31^FDMfgr Part:^FS" + Environment.NewLine +
                "^FT31,202" + Environment.NewLine +
                "^A0N,23,31^FD701646-231A^FS" + Environment.NewLine +
                "^FT31,254" + Environment.NewLine +
                "^A0N,23,31^FDStore:^FS" + Environment.NewLine +
                "^FT258,254" + Environment.NewLine +
                "^A0N,23,31^FDBin:^FS" + Environment.NewLine +
                "^FT31,289" + Environment.NewLine +
                "^A0N,23,31^FDB5 Maint^FS" + Environment.NewLine +
                "^FT258,289" + Environment.NewLine +
                "^A0N,23,31^FDE6B^FS" + Environment.NewLine +
                "^FO258,23" + Environment.NewLine +
                "^BY1^BCN,38,N,N^FD>:A0>5000001^FS" + Environment.NewLine +
                "^FO258,87" + Environment.NewLine +
                "^BCN,38,N,N^FD>;500124^FS" + Environment.NewLine +
                "^RFW,H,1,2,1^FD1400^FS" + Environment.NewLine +
                "^RFW,H,2,4,1^FDA0000001^FS" + Environment.NewLine +
                "^PQ1,0,1,Y" + Environment.NewLine +
                "^XZ" + Environment.NewLine;

            var doc = new FlowDocument();
            doc.ColumnWidth = prnt.PrintableAreaWidth;

            Paragraph p = new Paragraph();
            p.Inlines.Add(zpl);
            doc.Blocks.Add(p);
            prnt.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "Label A0000001");

            //doc.Blocks.Add(new Paragraph(new Run(zpl)));
            //prnt.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "Label A0000001");
            //prnt.PrintDocument((Section)XamlReader.Parse(zpl));                 
            
        }

以下是从文本编辑器(左)与我的应用程序(右)打印标签的结果: 左侧文本编辑器,右侧应用程序

标签: c#wpfprintingzpl

解决方案


我能够使用以下代码解决我的问题:

System.Windows.Controls.PrintDialog prnt = new PrintDialog();            
prnt.PageRangeSelection = PageRangeSelection.AllPages;
prnt.UserPageRangeEnabled = false;

Nullable<bool> result = prnt.ShowDialog();

if (result == true)
{
    ZPL = "<My ZPL>"; // Global string variable
    PrintDocument pdoc = new PrintDocument();
    pdoc.PrintPage += pdoc_PrintPage;
    pdoc.PrinterSettings.PrinterName = prnt.PrintQueue.FullName; 
    pdoc.Print();
}

然后在 PrintPage 事件中:

void pdoc_PrintPage(object sender, PrintPageEventArgs ev)
{
    // printFont is a global Font variable set to new Font("Arial", 10)
    ev.Graphics.DrawString(ZPL, printFont, System.Drawing.Brushes.Black, 0, 0, new StringFormat());           
}

现在,在 PrintDialog 中自动选择最后使用的打印机是我的下一个挑战。


推荐阅读