0
A
回答
1
它很好用。這是article on Zebra's website。
打印機具有內存並將處理作業以便接收它們。所以它會排隊,但如果打印機關機,內存中的作業將會丟失。您可能還必須確保不超過打印機的內存。
0
實際上,我發現使用Windows打印隊列來做這件事更容易和更靈活。這樣你就不必依賴使用tcp/ip vs serial vs usb。您可以在Windows中以任何方式配置打印機,並將原始數據發送到打印隊列。請參閱下面的詳細信息:
下面是摘自:https://support.microsoft.com/en-us/kb/322091
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 = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if(OpenPrinter(szPrinterName.Normalize(), 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 SendFileToPrinter(string szPrinterName, string szFileName)
{
// Open the file.
FileStream fs = new FileStream(szFileName, FileMode.Open);
// Create a BinaryReader on the file.
BinaryReader br = new BinaryReader(fs);
// Dim an array of bytes big enough to hold the file's contents.
Byte []bytes = new Byte[fs.Length];
bool bSuccess = false;
// Your unmanaged pointer.
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength;
nLength = Convert.ToInt32(fs.Length);
// Read the contents of the file into the array.
bytes = br.ReadBytes(nLength);
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
}
我公司使用這沒有問題,幾個生產環境。
相關問題
- 1. 通過USB發送原始ZPL到Zebra打印機
- 2. 向Zebra打印機發送ZPL標籤
- 3. 通過打印服務器發送原始ZPL斑馬打印機工作不
- 4. 如何使用C#通過USB將原始ZPL發送到斑馬打印機
- 5. 發送ZPL代碼到Zebra TLP2844打印機
- 6. 將ZPL發送到Zebra打印機的.NET代碼
- 7. 通過TCP套接字將ASCII文本發送到RAW打印機
- 8. 仿真ZPL打印機
- 9. 如何通過React Native向打印機發送打印作業
- 10. 斑馬GK420d ZPL打印機狀態通過USB在java中
- 11. 最佳實踐:通過TCP發送打印數據
- 12. 循環通過DV範圍併發送到打印機
- 13. 通過Java applet將JTable發送到打印機
- 14. 通過PHP網頁發送數據到收據打印機
- 15. 通過Windows服務發送PDF文件到打印機
- 16. 通過指定打印機名稱打印到打印機 - Javascript
- 17. 使用Visual Basic(MS Access 2000)將原始數據發送到ZPL打印機
- 18. 如何連接ZPL指令並將其發送到網絡打印機?
- 19. 無法連接到POS打印機通過TCP 9100
- 20. 通過移動應用程序到打印機的TCP連接
- 21. Java打印機:將文檔發送到遠程打印機
- 22. 用ZPL打印BMP
- 23. zpl打印機拆卸問題
- 24. 從c#編程切割ZPL打印機
- 25. ZPL代碼在2臺打印機
- 26. 使用.NET WinForm打印預覽ZPL II命令,然後將它發送到Zebra打印機
- 27. 通過tcp發送可發送對象
- 28. 通過TCP發送文本
- 29. 通過TCP發送圖片
- 30. 通過TCP發送長XML
你真的有問題,或者你只是好奇嗎?如果您遇到問題,則需要對其進行描述。 –
好奇。目前沒有問題。應用程序將運行在多個客戶端上。情況可能是多個客戶端向打印機發送多個命令的地方。 – wurzja