Python在Windows下如何控制打印机打印表格和图片?

如题最近研究了,生成网页用 lodop 打印,发现网页得打开浏览器点打印按钮,打开浏览器比较麻烦,想通过 python 本地生成 html 文件直接打印,有没有方法


Python在Windows下如何控制打印机打印表格和图片?
8 回复

关注一个… 我也没搜到 怎么 传入一个 word 打印的资料


在Windows下用Python控制打印机打印表格和图片,主要用win32printPIL库。下面是一个完整的例子,可以直接运行。

首先安装必要的库:

pip install pywin32 pillow reportlab

核心代码示例:

import win32print
import win32ui
from PIL import Image, ImageDraw, ImageFont
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os
import tempfile

def print_table_and_image(table_data, image_path):
    # 1. 创建临时PDF文件
    pdf_path = os.path.join(tempfile.gettempdir(), "print_temp.pdf")
    c = canvas.Canvas(pdf_path, pagesize=letter)
    width, height = letter
    
    # 2. 绘制表格
    y_position = height - 50
    for row in table_data:
        x_position = 50
        for cell in row:
            c.drawString(x_position, y_position, str(cell))
            x_position += 100
        y_position -= 20
    
    # 3. 添加图片
    if os.path.exists(image_path):
        c.drawImage(image_path, 50, y_position - 200, width=200, height=150)
    
    c.save()
    
    # 4. 发送到打印机
    printer_name = win32print.GetDefaultPrinter()
    hprinter = win32print.OpenPrinter(printer_name)
    
    try:
        with open(pdf_path, "rb") as f:
            data = f.read()
        
        hjob = win32print.StartDocPrinter(hprinter, 1, ("Python Print Job", None, "RAW"))
        win32print.StartPagePrinter(hprinter)
        win32print.WritePrinter(hprinter, data)
        win32print.EndPagePrinter(hprinter)
        win32print.EndDocPrinter(hprinter)
    finally:
        win32print.ClosePrinter(hprinter)
    
    # 清理临时文件
    os.remove(pdf_path)

# 使用示例
table_data = [
    ["姓名", "年龄", "部门"],
    ["张三", "25", "技术部"],
    ["李四", "30", "市场部"]
]

image_path = "example.jpg"  # 替换为你的图片路径
print_table_and_image(table_data, image_path)

代码说明:

  1. reportlab生成PDF,它处理表格和图片布局最方便
  2. 表格数据用二维列表传入,自动计算位置
  3. 图片支持常见格式(JPG/PNG等)
  4. 通过Windows打印API直接发送原始数据到默认打印机

注意点:

  • 确保图片路径正确
  • 表格数据不要超过页面宽度
  • 需要管理员权限才能访问某些打印机

替代方案: 如果只需要简单文本,可以直接用win32print发送ESC/POS指令(热敏打印机常用):

def print_raw_text(text):
    printer_name = win32print.GetDefaultPrinter()
    hprinter = win32print.OpenPrinter(printer_name)
    hjob = win32print.StartDocPrinter(hprinter, 1, ("Raw Text", None, "RAW"))
    win32print.StartPagePrinter(hprinter)
    win32print.WritePrinter(hprinter, text.encode('gbk'))  # 中文编码
    win32print.EndPagePrinter(hprinter)
    win32print.EndDocPrinter(hprinter)
    win32print.ClosePrinter(hprinter)

用PDF方案最通用,兼容所有Windows打印机。

可以调用 print 命令。

print 对 html 支持不知道怎么样,我用系统命令无法添加到虚拟打印机里面打印
刚刚找到可以使用 pyqt 里面的 Qpainter 打印文档 现在想办法把 browser 里面图像传过去

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView
app = QApplication(sys.argv)
browser = QWebEngineView()
browser.load(QUrl(“http://www.baidu.com/”))
browser.show()
app.exec_()

windows 的话可以用 com 组件吧?

com 也可以,还有些直接写打印语句,想直接生成网页,然后打印出来,使用样式表或者 css 或者并列的列表排序的 html 文件 pyqt5 打印效果有问题

小伙子,python 也是可以控制鼠标键盘的。在浏览器弹出打印按钮后用pyautogui模块控制鼠标自动点击打印按钮。虽然感觉有点治标不治本,但是如果实在找不到其他方法可以一试。

谢谢老大哥了,现在是用 pyqt 打开浏览器,
加载 lodop 后自动运行 js 打印,速度慢,无法控制,
我是直接用 html 做模板,听说 pyqt5 可以直接控制运行 js
想实现自助打印,传参后自动就打印,不行就看看 fastreport 或者水晶报表支持 dll 调用打印不。
谢谢意见

回到顶部