您遇到的错误是因为缺少对 `ImageWin` 模块的导入。以下是修改后的代码,添加了 `from PIL import ImageWin` 的导入,确保能够正确使用 `ImageWin.Dib`:
# coding: utf-8
from PIL import Image, ImageWin
import win32print
import win32ui
import win32con
def print_image(image_path, printer_name):
# 打开图像
img = Image.open(image_path)
# 打印机 Handle
printer_handle = win32print.OpenPrinter(printer_name)
try:
# 获取打印机的DevMode
devmode = win32print.GetPrinter(printer_handle, 2)['pDevMode']
# 设置自定义纸张尺寸(210x1200 mm)
devmode.PaperWidth = 2100 # 1/10 mm
devmode.PaperLength = 12000 # 1/10 mm
# 设置打印质量为1200dpi
devmode.PrintQuality = 1200
# 强制设备模式字段应用
devmode.Fields |= win32con.DM_PRINTQUALITY | win32con.DM_PAPERSIZE | win32con.DM_ORIENTATION
# 创建打印上下文
hdc = win32ui.CreateDC()
hdc.CreatePrinterDC(printer_name)
hdc.StartDoc(image_path)
hdc.StartPage()
# 图像缩放和位置计算
img_width, img_height = img.size
image_scale = 1200 / img_width
pos_x = 100 # 从左边10mm开始,1/10 mm
pos_y = 100 # 从上边10mm开始,1/10 mm
# 绘制图像
dib = ImageWin.Dib(img)
dib.draw(hdc.GetHandleOutput(),
(pos_x, pos_y, pos_x + int(img_width * image_scale), pos_y + int(img_height * image_scale)))
# 结束任务
hdc.EndPage()
hdc.EndDoc()
hdc.DeleteDC()
finally:
# 关闭打印机
win32print.ClosePrinter(printer_handle)
# 示例调用
print_image("rz.png", "HP LaserJet Pro MFP M125-M126 PCLmS")
请确保你的机器上已安装 Pillow(PIL的一个分支)库,并且正确配置了打印机驱动。这样就可以打印长图而不分页。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |