我有一个.NET Windows应用程序,它使用ZPL II或EPL2将命令打印到Zebra打印机。 有没有办法在直接从Zebra打印机打印之前打印预览表格中的数据?
答案 0 :(得分:20)
查看Labelary web service,它允许您以编程方式将ZPL转换为图像。
只需构建一个包含要呈现的ZPL的URL,从Web服务器返回图像,然后在应用程序中向用户显示图像。
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。
答案 1 :(得分:10)
我需要能够在我的应用程序中显示标签。所以我联系了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地址打印机通信的方法。 (虽然这并不意味着没有办法。)
答案 2 :(得分:3)
如果可以使用Chrome插件,请尝试 西蒙·宾克(Simon Binkert)的Zpl Printer。该插件基于先前评论中链接的Labelary Web Service。
另请参阅:https://stackoverflow.com/a/33066790/3196753
请注意,尽管此插件在Google Chrome浏览器中运行,但它可以与计算机上能够发送原始命令的任何应用程序一起使用。
可以将其配置为侦听localhost或专用IP地址,因此可以在PC和本地网络上模拟ZPL打印机。如果需要本地打印机或打印机共享,则可以在PC上设置原始打印机队列,该队列在主机名/ ip和端口上指向它,其他桌面应用程序将能够向其发送ZPL。
注意,如果需要使其可用于网络上的其他计算机,请确保将“打印机设置”中的127.0.0.1
更改为有效的LAN IP地址。
答案 3 :(得分:2)
预览标签的唯一方法是在打印机的网页上。
如果您转到列出http://<printer IP>/dir
的打印机目录并单击已保存的标签(或创建一个新标签),则可以点击"Preview Label"
答案 4 :(得分:0)
如果您不想将数据发送到云服务,您可以查看我们的项目,我们开发了一个开放式 ZPL 查看器,可将 ZPL 数据转换为图形。该项目基于.NET。
此处提供更多信息BinaryKits.Zpl.Viewer (GitHub)
还有一个 nuget package 可用
<块引用>PM> install-package BinaryKits.Zpl.Viewer
示例代码
IPrinterStorage printerStorage = new PrinterStorage();
var drawer = new ZplElementDrawer(printerStorage);
var analyzer = new ZplAnalyzer(printerStorage);
var analyzeInfo = analyzer.Analyze("^XA^FT100,100^A0N,67,0^FDTestLabel^FS^XZ");
var labels = new List<LabelDto>();
foreach (var labelInfo in analyzeInfo.LabelInfos)
{
var imageData = drawer.Draw(labelInfo.ZplElements);
}