如何用win32ui与win32print在同一打印页输出以减少间距?
实现同一页面混合打印Logo与文本的方案
核心思路是共享同一个打印作业的设备上下文(DC),让win32ui和win32print基于同一个DC输出,这样就能避免跨打印作业的间距问题,同时保留各自处理图片和文本的逻辑。
具体步骤与代码示例
- 初始化打印作业并获取共享DC
先用win32print创建打印作业,拿到打印设备上下文,这是后续所有输出的基础。 - 用win32ui在共享DC上绘制Logo
把获取到的打印DC包装成win32ui的CDC对象,复用你原有的print_logo逻辑输出图片。 - 用win32print在同一DC上绘制文本
直接在同一个DC上调用win32print的GDI函数输出文本,通过控制坐标让文本紧跟Logo。
以下是完整的整合代码:
import win32print import win32ui from win32con import * def print_logo(cdc, logo_path): # 复用你原有的win32ui打印Logo逻辑,适配传入的CDC对象 bmp = win32ui.LoadBitmap(logo_path) dc_bmp = win32ui.CreateDCFromHandle(cdc.GetSafeHdc()) dc_bmp.SelectObject(bmp) # 控制Logo的打印位置(x=10, y=10)和尺寸 cdc.StretchBlt((10, 10), (150, 80), dc_bmp, (0, 0), (bmp.GetWidth(), bmp.GetHeight()), SRCCOPY) bmp.DeleteObject() def print_text(hprinterdc, text, x, y): # 复用你原有的win32print打印文本逻辑,基于共享DC输出 import win32gui hfont = win32gui.CreateFont( 12, 0, 0, 0, FW_NORMAL, False, False, False, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial" ) old_font = win32gui.SelectObject(hprinterdc, hfont) win32gui.TextOut(hprinterdc, x, y, text) win32gui.SelectObject(hprinterdc, old_font) win32gui.DeleteObject(hfont) # 主打印流程 def print_combined(printer_name, logo_path, content_text): # 打开打印机 hprinter = win32print.OpenPrinter(printer_name) try: # 获取打印默认设置 devmode = win32print.GetPrinter(hprinter, 2)["pDevMode"] # 创建打印作业 win32print.StartDocPrinter(hprinter, 1, ("Combined Print Job", None, "RAW")) win32print.StartPagePrinter(hprinter) # 获取打印DC hprinterdc = win32print.CreateDC("", printer_name, devmode) try: # 用win32ui包装DC,打印Logo cdc = win32ui.CreateDCFromHandle(hprinterdc) print_logo(cdc, logo_path) # 在Logo下方(比如y=100的位置)打印文本,根据实际Logo尺寸调整坐标 print_text(hprinterdc, content_text, 10, 100) # 结束页面和作业 win32print.EndPagePrinter(hprinter) win32print.EndDocPrinter(hprinter) finally: # 释放DC资源 win32print.DeleteDC(hprinterdc) finally: win32print.ClosePrinter(hprinter) # 调用示例 if __name__ == "__main__": printer_name = win32print.GetDefaultPrinter() print_combined(printer_name, "your_logo.bmp", "欢迎使用POS打印服务")
关键注意点
- 坐标控制:POS打印机多为固定宽度的热敏纸,你可以根据Logo的实际尺寸调整文本的y坐标,确保两者紧密贴合。
- 资源释放:所有创建的GDI对象(字体、位图、DC等)必须手动释放,避免内存泄漏。
- RAW模式适配:如果你的POS打印机需要RAW指令,保持
StartDocPrinter第三个参数为"RAW",确保输出兼容。
内容的提问来源于stack exchange,提问作者Tinashe Mphisa
相关产品推荐
相关产品推荐

