首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows API 直接發送原始數據到印表機完整指南

     編輯:關於C++

直接列印原始數據的核心概念

在 Windows 環境下,開發人員常需繞過標準列印對話框,直接將格式化數據(如 ESC/P 指令、PCL 語言、ZPL 標籤指令)發送至印表機。這對 POS 系統、標籤列印、報表自動化等場景至關重要。Windows 提供 winspool.h 中的 Spooler API 實現此功能,支援 RAW、EMF、TEXT 等數據類型。

核心 API 流程解析

  1. OpenPrinter:取得印表機控制代碼,指定裝置名稱(如 "EPSON TM-T88V" 或網路路徑 "\\\\PrintServer\\LabelPrinter")
  2. StartDocPrinter:啟動列印作業,需填入 DOC_INFO_1 結構,設定 pDatatype = "RAW" 表示原始數據流
  3. StartPagePrinter / EndPagePrinter:管理頁面邊界
  4. WritePrinter:將位元組陣列寫入印表機緩衝區
  5. EndDocPrinter / ClosePrinter:結束作業並釋放資源

完整實作範例 (C/C++)

#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);
}

替代方案:檔案 I/O 方式

若印表機連接於 LPT 埠或已映射為網路共享,可直接使用標準檔案操作:

// 並行埠
FILE* f = fopen("LPT1", "wb");
if (f) { fwrite(data, 1, len, f); fclose(f); }

// 網路共享印表機 (需先 net use 映射)
FILE* f = fopen("\\\\Server\\ReceiptPrinter", "wb");

注意:此法缺乏作業管理、狀態監控、錯誤處理能力,不建議用於生產環境關鍵流程。

常見問題與最佳實踐

  • 編碼一致性:確保發送數據編碼與印表機固件設定一致 (Big5/GB2312/UTF-8)
  • 緩衝區管理:大量數據分塊發送,檢查 WritePrinter 回傳值
  • 權限問題:服務帳戶需具備「列印」權限,網路印表機需有效憑證
  • 非同步列印:生產環境建議使用執行緒佇列,避免阻塞主執行緒

進階應用場景

  • 熱感應收據列印 (ESC/POS 指令集)
  • 條碼/QR Code 標籤列印 (ZPL/EPL/TSPL)
  • 工業報表自動化 (PCL/PostScript)
  • 醫療/物流腕帶列印
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved