У меня есть приложение .NET для Windows, которое печатает команды на принтер Zebra, используя ZPL II или EPL2. Есть ли способ распечатать предварительный просмотр данных в форме перед их печатью непосредственно с принтера Zebra?
Предварительный просмотр команд ZPL II с использованием .NET WinForm перед отправкой на принтер Zebra
Ответы (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 непосредственно на веб-странице.
Мне нужна была возможность показать метку в моем приложении. Так что я подключил 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-адресации. (Хотя это не значит, что пути нет.)
[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, он может работать с любым приложением на компьютере, способным отправлять необработанные команды.
Его можно настроить для прослушивания на локальном хосте или выделенном IP-адресе, поэтому его можно использовать для эмуляции принтера ZPL на ПК и в локальной сети. Если вам нужен локальный принтер или общий принтер, вы можете настроить необработанную очередь принтера на ПК, которая указывает на него по имени хоста / IP и порту, и другие настольные приложения смогут отправлять на него ZPL.
Обратите внимание: если вам нужно сделать его доступным для других компьютеров в сети, обязательно измените 127.0.0.1
в настройках принтера на действительный IP-адрес локальной сети.
Единственный способ предварительно просмотреть этикетку — на веб-странице принтера.
Если вы перейдете к списку каталога принтера http://<printer IP>/dir
и щелкните сохраненную этикетку (или создадите новую), вы можете нажать "Preview Label"