Предварительный просмотр команд ZPL II с использованием .NET WinForm перед отправкой на принтер Zebra - PullRequest
17 голосов
/ 14 сентября 2011

У меня есть приложение .NET для Windows, которое печатает команды на принтер Zebra с использованием ZPL II или EPL2.Есть ли способ распечатать предварительный просмотр данных в форме перед печатью непосредственно с принтера Zebra?

Ответы [ 4 ]

20 голосов
/ 10 июня 2014

Взгляните на веб-службу Labelary , которая позволяет программно преобразовывать ZPL в изображение.

Просто создайте URL, содержащий ZPL, который вы хотите визуализировать, получите изображение обратно с веб-сервера и покажите изображение пользователю из вашего приложения.

string zpl = "YOUR ZPL HERE";
string url = "http://api.labelary.com/v1/printers/8dpmm/labels/4x6/0/" + zpl;
using (WebClient client = new WebClient()) {
    client.DownloadFile(url, "zpl.png");
}

Также имеется ZPL viewer , позволяющий редактировать и просматривать ZPL непосредственно на веб-странице.

10 голосов
/ 05 декабря 2013

Мне нужна была возможность показать ярлык в моем приложении. Поэтому я подключил Fiddler и выяснил, что это за сообщение, чтобы получить изображение этикетки.

Я запустил его в LinqPad. HTTP-материал можно немного очистить, но я подумал, что выложу код для использования другими:

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

Это имеет следующие ссылки:

HtmlAgilityPack
System.Drawing
System.Net

и следующие применения:

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

ПРИМЕЧАНИЕ. Я не смог найти способ связи с принтером с последовательным / не IP-адресом. (Хотя это не значит, что пути нет.)

3 голосов
/ 26 сентября 2018

Если вы согласны с использованием Chrome Plugin, попробуйте Simon Binkert's Zpl Printer .Этот плагин основан на Labelary Web Service , указанной в предыдущих комментариях.

См. Также: https://stackoverflow.com/a/33066790/3196753

Примечание. Хотя этот плагин работает в Google Chrome, он можетработать с любым приложением на компьютере, способным отправлять необработанные команды.

chrome zpl printer

Его можно настроить для прослушивания на локальном хосте или выделенном IP-адресе, чтобы он могиспользоваться для эмуляции принтера ZPL на ПК и в локальной сети.Если вам нужен локальный принтер или общий ресурс принтера, вы можете настроить на ПК очередь необработанных принтеров, которая указывает на него имя хоста / ip и порт, и другие настольные приложения смогут отправлять на него ZPL.

Обратите внимание: если вам нужно сделать его доступным для других компьютеров в сети, обязательно измените 127.0.0.1 в настройках принтера на действительный IP-адрес локальной сети.

2 голосов
/ 14 сентября 2011

Единственный способ предварительного просмотра этикетки - на веб-странице принтера.

Если вы перейдете в каталог каталога принтера http://<printer IP>/dir и нажмете на сохраненную метку (или создадите новую), то вы можете нажать "Preview Label"

...