鱼C论坛

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

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

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

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

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

x
以普通打印机打印长图片,不分页,如打印对联。
以下代码显示错误:    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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
您遇到的错误是因为缺少对 `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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
以上代码用长幅纸打印(210*1200mm),只打印A4纸长度(297mm),然后停止,打印机显示屏显示卡纸。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-2 21:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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