我的任務是通過熱敏打印機打印標籤。爲此,生成一串tspl(打印機可識別的編程語言)命令並將其發送到打印機。後者在C#實現從微軟例子"How to send raw data to a printer by using Visual C# .NET"通過重定向打印機打印標籤
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();
MessageBox.Show("Error " + dwError);
}
return bSuccess;
}
採取以下方法實際打印機的PrintDialog類
private void button2_Click(object sender, EventArgs e)
{
string s = "CLS\nPRINT 1\n"; // device-dependent string, need a FormFeed?
// Allow the user to select a printer.
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
// Send a printer-specific to the printer.
RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
}
}
選擇在我的工作環境,一切工作正常。環境是一個局域網,包括3臺計算機和1臺共享熱敏打印機:
- PC_with_printer - 它運行在Windows 7和具有經由USB
- 連接到它的打印機PC_aware - 它運行在Win 8上,並且知道共享打印機
- PC_unaware - 它運行在WinXP上,並且沒有共享打印呃安裝
從PC_aware我通過rdp連接到PC_unaware和打印機出現在打印機列表中作爲重定向。然後我運行我的應用程序,選擇重定向的打印機並打印我的空標籤。到現在爲止還挺好。
我將PC_unaware替換爲另一臺計算機時出現問題。它運行在Windows Server 2008 R2上,不在我們的LAN中。我們稱之爲服務器。於是我進行了同樣的實驗:
- 從PC_aware我使用它的公共IP地址通過RDP連接到服務器
- 我的熱敏打印機出現在「打印機和設備」作爲「TSC_TDP-244(重定向20)」
- 我去打印機的屬性,然後單擊打印測試頁,它會打印
- 我運行我的應用程序和打印機不打印任何東西。
我已檢查,其將在SendBytesToPrinter方法中使用的所有WINAPI函數的返回值(OpenPrinter,StartDocPrinter,StartPagePrinter,WritePrinter,EndPagePrinter,EndDocPrinter,ClosePrinter),其中沒有指示錯誤。任何想法爲什麼會發生,以及如何解決它?
這實際上更像是一個遠程桌面問題。由於PC_unaware沒有局域網連接,並且共享打印機尚未安裝,所以它依賴於RD的打印機克隆功能,我一直髮現這種功能是有問題的。 RD對你想解決的問題真的很重要嗎?如果沒有,我會把它從圖片中刪除。 – 2015-04-01 14:22:45
此打印功能應該在服務器上提供,用戶通過rdp連接到它,所以我擔心RD是必不可少的部分。 – zurab 2015-04-01 14:51:39
我不知道RD如何實現打印機克隆,但是我強烈懷疑它依賴於捲入程序,這意味着直接寫入克隆打印機將無法工作。 RD中需要很多複雜的代碼才能支持直接打印,而且我很少會猜測他們沒有實現它。 – 2015-04-01 15:10:27