Предварительный просмотр команд ZPL II с использованием .NET WinForm перед отправкой на принтер Zebra

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


person hasan lamaa    schedule 14.09.2011    source источник


Ответы (4)


Взгляните на веб-сервис 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, позволяющее редактировать и просматривать ZPL непосредственно на веб-странице.

person Abel    schedule 10.06.2014

Мне нужна была возможность показать метку в моем приложении. Так что я подключил 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-адресации. (Хотя это не значит, что пути нет.)

person Vaccano    schedule 04.12.2013
comment
Кажется, хорошая работа! Не могли бы вы добавить, с каким производителем принтера и моделью работает ваш код? - person bluish; 05.12.2013
comment
@bluish - принтеры этикеток Zebra. Проверял на ZM400. - person Vaccano; 06.12.2013
comment
Также работает с Zebra170Xi4. Я обнаружил, что изображение, создаваемое принтером, создает большое количество пустого пространства вокруг отображаемой этикетки. Я не уверен, что установка ширины метки в ZPL исправит это (большинство наших дизайнов этого не делают). - person nbering; 07.09.2014
comment
Что вы использовали для IP-адреса вашего принтера? Он был подключен к компьютеру через USB? Или это было только под принт-сервером? Любая идея, как я буду использовать это только через USB или локальную сеть? - person JWiley; 18.09.2014
comment
@JWiley - я не знаю, может ли это работать через USB. Мы используем принтер, который находится в нашей локальной сети. У него фиксированный IP-адрес (установлен моими системными администраторами). Вы можете получить IP-адрес от принтера ZM400, который я использовал. - person Vaccano; 19.09.2014
comment
Ваш ZM400 имеет фиксированный IP-адрес? Это не через LPT1? Любая идея, как я мог бы использовать этот метод, если бы я мог назначить IP-адрес принтеру в зависимости от того, к какому компьютеру он подключен? - person JWiley; 19.09.2014
comment
@JWiley - это будет работать, только если у вашего принтера есть IP-адрес, доступный вызывающему абоненту. Я не сетевой парень, поэтому я не знаю, можно ли это сделать так, как вы говорите. Самый простой способ проверить это перейти к IP-адресу. У него должна быть страница для администрирования принтера. - person Vaccano; 19.09.2014
comment
@Vaccano Есть идеи, как я могу отправить zpl, который содержит информацию заголовка, такую ​​​​как [CARD] SlotID=1 OrgName=C:\\mypath\\myfile.mmf CardSize=4096000 Description=mymmf? - person JWiley; 29.09.2014

Если вы согласны с использованием подключаемого модуля Chrome, попробуйте Принтер Zpl. Этот подключаемый модуль основан на веб-сервисе Labelary, на который мы ссылались в предыдущих комментариях.

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

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

хром ZPL-принтер

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

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

person tresf    schedule 26.09.2018

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

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

person Ovi Tisler    schedule 14.09.2011
comment
Есть несколько других способов сделать это с помощью принтера, отформатировав этикетку без печати. Допустимо ли наличие встроенного принтера? - person banno; 14.09.2011
comment
Что, если у меня установлен только драйвер принтера, а не сам принтер? Могу ли я по-прежнему иметь доступ к этому списку каталогов? - person SleepNot; 14.11.2012
comment
Для других, которые ищут, как это сделать, см. мой ответ, в котором есть код для предварительного просмотра этикетки. - person Vaccano; 05.12.2013