ydwb 发表于 2024-12-29 08:43:34

普通打印机打印长图片代码

以普通打印机打印长图片,不分页,如打印对联。
以下代码显示错误:    dib = ImageWin.Dib(img)
NameError: name 'ImageWin' is not defined
# coding: utf-8
from PIL import Image
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")

FishC 发表于 2024-12-29 08:49:38

您遇到的错误是因为缺少对 `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 小助理,如未能正确解答您的问题,请继续追问。

ydwb 发表于 2024-12-29 14:22:29

以上代码用长幅纸打印(210*1200mm),只打印A4纸长度(297mm),然后停止,打印机显示屏显示卡纸。

FishC 发表于 2024-12-29 14:22:41

ydwb 发表于 2024-12-29 14:22
以上代码用长幅纸打印(210*1200mm),只打印A4纸长度 ...

这种情况可能涉及多个方面的问题,包括打印机设置、纸张尺寸的配置和打印机是否支持自定义纸张长度。以下是一些建议和检查步骤:

1. **检查打印机支持**:
   - 确保您的打印机支持自定义纸张长度(210mm x 1200mm)。有些桌面打印机可能不支持超过一定长度的连续纸张。

2. **检查纸张设置**:
   - 确保打印机驱动程序和设备设置中已正确配置纸张尺寸为210mm x 1200mm。

3. **设置正确的 DEVMODE**:
   - 您已经在代码中设置了自定义纸张尺寸和打印质量,但要确保这些设置正确应用到了打印机。可能需要使用 `win32print.DocumentProperties` 来显式地应用这些设置到打印机。

4. **调整缩放和定位**:
   - 根据打印机特性,确定是否需要根据实际纸张长度调整图像缩放比例,以防止图像末尾部分超出纸张范围,导致卡纸。

5. **检查打印机物理设置**:
   - 确保打印机纸张托盘和进纸器正确设置为适应长纸。部分打印机可能需要手动配置或调整进纸设置。

6. **参考打印机手册**:
   - 查看打印机的用户手册,确认打印机能够处理长纸张,并实施相关建议。

如果在确认以上设置仍然不能解决问题,可能需要联系打印机的技术支持以获得进一步帮助。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 普通打印机打印长图片代码