在 Windows 環境下,開發人員常需繞過標準列印對話框,直接將格式化數據(如 ESC/P 指令、PCL 語言、ZPL 標籤指令)發送至印表機。這對 POS 系統、標籤列印、報表自動化等場景至關重要。Windows 提供 winspool.h 中的 Spooler API 實現此功能,支援 RAW、EMF、TEXT 等數據類型。
DOC_INFO_1 結構,設定 pDatatype = "RAW" 表示原始數據流#include <windows.h>
#include <winspool.h>
#include <string.h>
bool SendRawDataToPrinter(const char* szPrinterName, const char* szBuffer) {
HANDLE hPrinter = NULL;
DWORD dwWritten = 0;
int iLen = (int)strlen(szBuffer);
// 1. 開啟印表機
if (!OpenPrinterA((LPSTR)szPrinterName, &hPrinter, NULL)) {
return false;
}
// 2. 設定列印作業屬性
DOC_INFO_1A DocInfo = {0};
DocInfo.pDocName = "Raw Data Print Job";
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = "RAW"; // 關鍵:指定原始數據模式
// 3. 開始列印作業
if (!StartDocPrinterA(hPrinter, 1, (LPBYTE)&DocInfo)) {
ClosePrinter(hPrinter);
return false;
}
if (!StartPagePrinter(hPrinter)) {
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return false;
}
// 4. 寫入原始數據
BOOL bSuccess = WritePrinter(hPrinter, (LPVOID)szBuffer, iLen, &dwWritten);
// 5. 清理資源
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return bSuccess && (dwWritten == (DWORD)iLen);
}
若印表機連接於 LPT 埠或已映射為網路共享,可直接使用標準檔案操作:
// 並行埠
FILE* f = fopen("LPT1", "wb");
if (f) { fwrite(data, 1, len, f); fclose(f); }
// 網路共享印表機 (需先 net use 映射)
FILE* f = fopen("\\\\Server\\ReceiptPrinter", "wb");
注意:此法缺乏作業管理、狀態監控、錯誤處理能力,不建議用於生產環境關鍵流程。
WritePrinter 回傳值