问题描述
我们有很多旧的 ZPL 标签.
We have a lot of old ZPL labels.
我们希望能够从网络客户端打印它们.打印机连接到客户端而不是服务器.
We would like to be able to print them from a web client. The printer is connected to the client and not the server.
我们有一些想法:
从 Silverlight 打印.不可行.似乎无法在不调用 COM 对象的情况下从 .NET 将原始"打印到 Zebra,这在普通 Silverlight 中是不可能的.
Print from Silverlight. Not feasable. Seems to be no way to print "raw" to Zebra from .NET without calling COM object and that is not posible from plain Silverlight.
在 Silverlight 中,将 ZPL 视为文件并将其文件复制到打印机.本地打印机必须设置为共享.是否从 Silverlight Out of Browser 以更高的信任度工作.但如果可能的话,我们希望避免退出浏览器.
From Silverlight, treat the ZPL as file and file copy it to printer. Local printer must be setup as shared. Does work from Silverlight Out of Browser with elevated trust. But if posible we would like to avoid Out of browser.
如果 Zebra 打印机设置为使用通用/文本驱动程序,我可以在 Notepad.exe 中打开 ZPL 文件并使用文件 -> 打印将 ZPL 发送到打印机.在这种情况下,Zebra 打印机会将文本解释为 ZPL 指令而不是实际文本.有没有办法从浏览器利用"这个?尝试了几种方法,例如简单地在浏览器中打开 ZPL 文件,然后执行文件 -> 打印,但这似乎不起作用.还尝试从 Javascript windows.print();
If Zebra printer is set to use Generic/Text driver, I can open a ZPL-file in Notepad.exe and send ZPL to printer using File -> Print. In this case the Zebra printer will interpret the text as ZPL instructions and not actual text. Is there any way to "exploit" this from a browser? Have tried a few ways, for example to simply open the ZPL file in the browser and the do File -> Print but that does not seem to work. Have also tried to print from Javascript windows.print();
是否有任何其他插件(java 小程序、flash 等)能够将原始文本(例如 ZPL)发送到 Zebra 打印机?
Is there any other plugin (java applet, flash, etc.) capable of sending Raw text (e.g. ZPL) to the Zebra printer?
将 ZPL 转换为图像(或 pdf:s).有没有这样的工具?
Transform ZPL to images (or pdf:s). Is there any such tool?
还有其他想法吗?
推荐答案
在 Silverlight 5 中,当您打开增强的安全性时,您可以打印原始文本.这是我所做的:
In Silverlight 5 you can print raw text when you turn on enhanced security. Here is what I did:
private void Button_Click(object sender, RoutedEventArgs e)
{
StringBuilder label = new StringBuilder();
label.AppendLine("^XA^MCA^PR8^XZ");
label.AppendLine("^XA");
label.AppendLine("^DFCTN^FS");
label.AppendLine("^LH110,0^FS");
label.Append("^FO0,60^A0,30,20^FB250,1,0,C,0^FD");
label.Append(CategoryTextBox.Text.TrimEnd());
label.AppendLine("^FS");
label.AppendLine("^FO5,120^A0,40,30^FB250,1,0,C,0^FR^FN1^FS");
label.AppendLine("^XZ");
label.AppendLine("^XA");
label.AppendLine("^XFCTN^FS");
label.Append("^FO10,100");
label.Append("^B3N,N,40,Y^FD");
label.Append(LicensePlateTextBox.Text.TrimEnd());
label.AppendLine("^FS");
label.AppendLine("^XZ");
bool result = RawPrinterHelper.SendStringToPrinter("Zebra Label Printer", label.ToString());
if (!result)
{
MessageBox.Show("Error Returned From Print Spool. Check Setup.");
}
}
RawPrintHelper 类:
The RawPrintHelper class:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace TestPrinting
{
public class RawPrinterHelper
{
// Structure and API declarions:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)]
public string pDocName;
[MarshalAs(UnmanagedType.LPStr)]
public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)]
public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
// SendBytesToPrinter()
// When the function is given a printer name and an unmanaged array
// of bytes, the function sends those bytes to the print queue.
// Returns true on success, false on failure.
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName, out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string pDoc)
{
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(pDoc));
byte[] rawData = new byte[stream.Length];
stream.Read(rawData, 0, (int)stream.Length);
GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
IntPtr pointer = rawDataHandle.AddrOfPinnedObject();
return SendBytesToPrinter(szPrinterName, pointer, rawData.Length);
}
}
}
这篇关于打印“原始文本"(ZPL) 来自网络的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!