You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用win32ui与win32print在同一打印页输出以减少间距?

实现同一页面混合打印Logo与文本的方案

核心思路是共享同一个打印作业的设备上下文(DC),让win32ui和win32print基于同一个DC输出,这样就能避免跨打印作业的间距问题,同时保留各自处理图片和文本的逻辑。

具体步骤与代码示例

  1. 初始化打印作业并获取共享DC
    先用win32print创建打印作业,拿到打印设备上下文,这是后续所有输出的基础。
  2. 用win32ui在共享DC上绘制Logo
    把获取到的打印DC包装成win32ui的CDC对象,复用你原有的print_logo逻辑输出图片。
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:22:47