Print preview ZPL II commands using .NET WinForm before sending it to Zebra printer

前端 未结 4 1502
不知归路
不知归路 2020-12-02 19:08

I have an .NET Windows application that prints commands to Zebra printer using ZPL II or EPL2. Is there any way to print preview the data in a form before printing it direct

4条回答
  •  忘掉有多难
    2020-12-02 19:35

    I needed the ability to show the label in my Application. So I hooked up Fiddler and figured out what the communication was to get the image of the label.

    I got it running in LinqPad. The HTTP stuff can be cleaned up a bit, but I thought I would post the code for others to use:

    void Main()
    {
        string printerIpAddress = "10.92.0.167";
        string zpl="^XA^CFD^CVY^PON^FWN^LS0^LT0^LH15,17^FS^FO0,2^FO14,3^FH^FDHi^FS^XZ";
    
        // post the data to the printer
        var imageName = PostZplAndReturnImageName(zpl, printerIpAddress);
    
        // Get the image from the printer
        var image = LoadImageFromPrinter(imageName, printerIpAddress);
    
        Console.WriteLine(image);   
    }
    
    
    public static string PostZplAndReturnImageName(string zpl, string printerIpAddress)
    {
        string response = null;
        // Setup the post parameters.
        string parameters = "data="+ zpl;
        parameters = parameters + "&" + "dev=R";
        parameters = parameters + "&" + "oname=UNKNOWN";
        parameters = parameters + "&" + "otype=ZPL";
        parameters = parameters + "&" + "prev=Preview Label";
        parameters = parameters + "&" + "pw=";
    
        // Post to the printer
        response = HttpPost("http://"+ printerIpAddress +"/zpl", parameters);
    
        // Parse the response to get the image name.  This image name is stored for one retrieval only.
        HtmlAgilityPack.HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(response);
        var imageNameXPath = "/html[1]/body[1]/div[1]/img[1]/@alt[1]";
        var imageAttributeValue = doc.DocumentNode.SelectSingleNode(imageNameXPath).GetAttributeValue("alt","");
        // Take off the R: from the front and the .PNG from the back.
        var imageName = imageAttributeValue.Substring(2);
        imageName = imageName.Substring(0,imageName.Length - 4);
    
        // Return the image name.
        return imageName;
    }
    
    
    public static string HttpPost(string URI, string Parameters) 
    {
       System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
       req.Proxy = new System.Net.WebProxy();
    
       //Add these, as we're doing a POST
       req.ContentType = "application/x-www-form-urlencoded";
       req.Method = "POST";
    
       //We need to count how many bytes we're sending. 
       //Post'ed Faked Forms should be name=value&
       byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
       req.ContentLength = bytes.Length;
    
       System.IO.Stream os = req.GetRequestStream();
       os.Write (bytes, 0, bytes.Length); //Push it out there
       os.Close ();
    
       System.Net.WebResponse resp = req.GetResponse();
    
       if (resp== null) return null;
       System.IO.StreamReader sr = 
             new System.IO.StreamReader(resp.GetResponseStream());
       return sr.ReadToEnd().Trim();
    }
    
    public static Image LoadImageFromPrinter(string imageName, string printerIpAddress)
    {
        string url = "http://"+ printerIpAddress +"/png?prev=Y&dev=R&oname="+ imageName +"&otype=PNG";  
    
        var response = Http.Get(url);   
    
        using (var ms = new MemoryStream(response))
        {       
            Image image = Image.FromStream(ms);
    
            return image;
        }  
    
    
    }
    
    public static class Http
    {
        public static byte[] Get(string uri)
        {               
            byte[] response = null;
            using (WebClient client = new WebClient())
            {
                response = client.DownloadData(uri);
            }
            return response;
        }   
    }
    

    This has the following References:

    HtmlAgilityPack
    System.Drawing
    System.Net
    

    and the following Uses:

    HtmlAgilityPack
    System.Drawing
    System.Drawing.Imaging
    System.Net
    

    NOTE: I could not find a way to communicate with a serial/non-IP Addressed printer. (Though that does not mean that there is not a way.)

提交回复
热议问题