StartDocA StartPage和 StartDocPrinter StartPagePrinter WritePrinter 区别是什么?
·
GDI 打印 API(StartDocA / StartPage / EndPage / EndDoc)
这是 图形设备接口 (GDI) 提供的打印方式:
-
调用路径:
HDC hdc = CreateDCA("WINSPOOL", "打印机名", NULL, devmode); StartDocA(hdc, &di); StartPage(hdc); // GDI 绘制(TextOut, BitBlt, LineTo, Rectangle...) EndPage(hdc); EndDoc(hdc); DeleteDC(hdc); -
特点:
-
你得到一个 打印机的 HDC(设备上下文),就像画布一样。
-
你用 GDI 函数画文字、图形、图片,GDI 会转换成打印机能理解的数据(可能是 EMF,可能是光栅图像,取决于驱动)。
-
驱动层负责把图形转换成打印机语言(PCL、PostScript、ESC/POS 等)。
-
程序不用关心打印机的命令语言。
-
缺点:可控性有限,效率比“写原始数据”低。
-
原始打印 API(StartDocPrinter / StartPagePrinter / WritePrinter / EndPagePrinter / EndDocPrinter)
这是 打印后台处理程序(Spooler API),绕过 GDI,直接往打印机端口写数据:
-
调用路径:
HANDLE hPrinter; OpenPrinter("打印机名", &hPrinter, NULL); DOC_INFO_1A di = {0}; di.pDocName = "My Raw Document"; di.pDatatype = "RAW"; // 原始数据,不经 GDI 处理 StartDocPrinter(hPrinter, 1, (LPBYTE)&di); StartPagePrinter(hPrinter); // 直接写打印机命令(PCL、ZPL、ESC/POS 等) const char* data = "^XA^FO50,50^ADN,36,20^FDHello ZPL!^FS^XZ"; DWORD written; WritePrinter(hPrinter, data, strlen(data), &written); EndPagePrinter(hPrinter); EndDocPrinter(hPrinter); ClosePrinter(hPrinter); -
特点:
-
不做 GDI 绘图,直接发数据。
-
你要自己知道打印机的语言(PCL, ZPL, ESC/POS...)。
-
速度快、控制精确,适合条码机、票据打印机等。
-
如果你传
"RAW",数据会直接下发,不会经过驱动渲染。
-
🔍 对比总结
| API | 使用对象 | 数据格式 | 适用场景 |
|---|---|---|---|
| StartDocA / StartPage / EndPage / EndDoc | GDI(HDC) | GDI 绘制指令(驱动转换) | 通用打印(Word、图片、Office 程序等) |
| StartDocPrinter / StartPagePrinter / WritePrinter | 打印机句柄(Spooler API) | 你自己写的原始命令(PCL/ZPL/ESC/POS) | 条码机、热敏小票机、专用打印控制 |
举例
-
如果你打印一张条形码:
-
用 GDI API:你自己画矩形、画线、填充,GDI 转换成点阵图给打印机。
-
用 Raw API:你直接发 ZPL/ESC/POS 命令,打印机自己画条码。
-
你现在说的 StartDocA/StartPage 打印条码,说明你走的是 GDI 路径。
如果你的打印机本身是条码机,支持 ZPL/ESC/POS,用 StartDocPrinter + WritePrinter 会更快、更精准。
更多推荐


所有评论(0)