業務流程
- 患者刷卡 → 讀卡器(鍵盤模式/串口)輸入卡號。
- 系統查詢 HIS/EMR 獲取患者信息(姓名、性別、年齡、就診號)。
- 本地生成 Code128/QR Code 條碼圖片(含就診號)。
- 合成標簽:條碼 + 患者文本信息 → 統一圖片/打印模板。
- 發送到標簽打印機(TSC/Zebra/得實)或 A4 打印機。
技術選型對比
| 方案 | 核心組件 | 優點 | 缺點 |
| 純圖片合成 + GDI+ 打印 | ZXing.Net 生成條碼 + Graphics.DrawImage 合成 + PrintDocument | 無需驅動開發,通用性強 | 打印精度受 DPI 影響,條碼識讀率略低 |
| 打印機指令語言 (TSPL/ZPL/EPL) | 拼接指令字符串 → RawPrinterHelper 發送 | 打印機內部渲染,條碼極清晰,速度極快 | 需針對打印機型號調試指令 |
| 報表控件 | FastReport / Stimulsoft / Crystal Reports | 所見即所得設計、支持複雜版面 | 部署體積大、授權成本高 |
推薦:TSPL 指令直發方案(以 TSC 打印機為例)
// 1. 構建 TSPL 指令
string tspl = $@"
SIZE 50 mm, 30 mm
GAP 2 mm, 0
DIRECTION 1
CLS
TEXT 10, 10, ""3"", 0, 1, 1, ""{patient.Name}""
TEXT 10, 40, ""3"", 0, 1, 1, ""性別:{patient.Gender} 年齡:{patient.Age}""
BARCODE 10, 70, ""128"", 50, 1, 0, 2, 2, ""{patient.VisitNo}""
PRINT 1, 1
";
// 2. 發送到打印機 (Raw Print)
public static void SendToPrinter(string printerName, string data) {
var bytes = Encoding.GetEncoding("GB2312").GetBytes(data);
IntPtr hPrinter;
OpenPrinter(printerName, out hPrinter, IntPtr.Zero);
StartDocPrinter(hPrinter, 1, new DOCINFOA { pDocName = "Label", pDataType = "RAW" });
StartPagePrinter(hPrinter);
WritePrinter(hPrinter, bytes, bytes.Length, out _);
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
}
關鍵優勢
- **無圖片轉換損耗**,條碼由打印機 203/300 DPI 直接渲染,掃碼槍 100% 識讀。
- **極快**:單標簽 < 100ms,適合高峰期排隊場景。
- **易維護**:修改版面只需調整指令坐標,無需重新編譯 UI。