鱼C论坛

 找回密码
 立即注册
查看: 291|回复: 3

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

[复制链接]
发表于 2024-12-29 08:43:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以普通打印机打印长图片,不分页,如打印对联。
以下代码显示错误:    dib = ImageWin.Dib(img)
NameError: name 'ImageWin' is not defined
  1. # coding: utf-8
  2. from PIL import Image
  3. import win32print
  4. import win32ui
  5. import win32con

  6. def print_image(image_path, printer_name):
  7.     # 打开图像
  8.     img = Image.open(image_path)

  9.     # 打印机 Handle
  10.     printer_handle = win32print.OpenPrinter(printer_name)

  11.     try:
  12.         # 设置DEVMODE以配置打印机参数
  13.         devmode = win32print.GetPrinter(printer_handle, 2)['pDevMode']

  14.         # 设置自定义纸张尺寸(210x1200 mm)
  15.         devmode.PaperWidth = 2100  # 1/10 mm
  16.         devmode.PaperLength = 12000  # 1/10 mm

  17.         # 设置打印质量为1200dpi
  18.         devmode.PrintQuality = 1200

  19.         # 关闭打印机对话框
  20.         devmode.Fields |= win32con.DM_PRINTQUALITY | win32con.DM_PAPERSIZE | win32con.DM_ORIENTATION

  21.         # 创建打印上下文
  22.         hdc = win32ui.CreateDC()
  23.         hdc.CreatePrinterDC(printer_name)
  24.         hdc.StartDoc(image_path)
  25.         hdc.StartPage()

  26.         # 图像缩放和位置计算(如果需要居中打印,调整这里的坐标值)
  27.         img_width, img_height = img.size
  28.         image_scale = 1200 / img_width
  29.         pos_x = 100  # 从左边10mm开始,1/10 mm
  30.         pos_y = 100  # 从上边10mm开始,1/10 mm

  31.         # 绘制图像
  32.         dib = ImageWin.Dib(img)
  33.         dib.draw(hdc.GetHandleOutput(),
  34.                  (pos_x, pos_y, pos_x + int(img_width * image_scale), pos_y + int(img_height * image_scale)))

  35.         # 结束任务
  36.         hdc.EndPage()
  37.         hdc.EndDoc()
  38.         hdc.DeleteDC()

  39.     finally:
  40.         # 关闭打印机
  41.         win32print.ClosePrinter(printer_handle)

  42. # 示例调用
  43. print_image("rz.png", "HP LaserJet Pro MFP M125-M126 PCLmS")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-29 08:49:38 | 显示全部楼层
您遇到的错误是因为缺少对 `ImageWin` 模块的导入。以下是修改后的代码,添加了 `from PIL import ImageWin` 的导入,确保能够正确使用 `ImageWin.Dib`:

  1. # coding: utf-8
  2. from PIL import Image, ImageWin
  3. import win32print
  4. import win32ui
  5. import win32con

  6. def print_image(image_path, printer_name):
  7.     # 打开图像
  8.     img = Image.open(image_path)

  9.     # 打印机 Handle
  10.     printer_handle = win32print.OpenPrinter(printer_name)

  11.     try:
  12.         # 获取打印机的DevMode
  13.         devmode = win32print.GetPrinter(printer_handle, 2)['pDevMode']

  14.         # 设置自定义纸张尺寸(210x1200 mm)
  15.         devmode.PaperWidth = 2100  # 1/10 mm
  16.         devmode.PaperLength = 12000  # 1/10 mm

  17.         # 设置打印质量为1200dpi
  18.         devmode.PrintQuality = 1200

  19.         # 强制设备模式字段应用
  20.         devmode.Fields |= win32con.DM_PRINTQUALITY | win32con.DM_PAPERSIZE | win32con.DM_ORIENTATION

  21.         # 创建打印上下文
  22.         hdc = win32ui.CreateDC()
  23.         hdc.CreatePrinterDC(printer_name)
  24.         hdc.StartDoc(image_path)
  25.         hdc.StartPage()

  26.         # 图像缩放和位置计算
  27.         img_width, img_height = img.size
  28.         image_scale = 1200 / img_width
  29.         pos_x = 100  # 从左边10mm开始,1/10 mm
  30.         pos_y = 100  # 从上边10mm开始,1/10 mm

  31.         # 绘制图像
  32.         dib = ImageWin.Dib(img)
  33.         dib.draw(hdc.GetHandleOutput(),
  34.                  (pos_x, pos_y, pos_x + int(img_width * image_scale), pos_y + int(img_height * image_scale)))

  35.         # 结束任务
  36.         hdc.EndPage()
  37.         hdc.EndDoc()
  38.         hdc.DeleteDC()

  39.     finally:
  40.         # 关闭打印机
  41.         win32print.ClosePrinter(printer_handle)

  42. # 示例调用
  43. print_image("rz.png", "HP LaserJet Pro MFP M125-M126 PCLmS")
复制代码


请确保你的机器上已安装 Pillow(PIL的一个分支)库,并且正确配置了打印机驱动。这样就可以打印长图而不分页。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-29 14:22:29 | 显示全部楼层
以上代码用长幅纸打印(210*1200mm),只打印A4纸长度(297mm),然后停止,打印机显示屏显示卡纸。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 06:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表