You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成的图片无法自动打印,PDF打印存在缩放问题求助

问题1:图片无法自动打印

解决方案

方法1:用rundll32调用系统打印命令(无需额外依赖)

Windows可通过rundll32.exe直接触发图片打印,指定打印机后可自动执行,不会弹出确认窗口。先在控制面板的「设备和打印机」中获取你的打印机名称,替换代码里的<打印机名称>:

import subprocess
from PIL import Image, ImageDraw, ImageFont

# 生成图片逻辑不变
img = Image.new("RGB", (300, 250), 'white')
draw = ImageDraw.Draw(img)
sticker_text = 'Name\nSurname\n\nCompany'
font = ImageFont.truetype('arial.ttf', size=40)
_, _, w, h = draw.textbbox((0, 0), sticker_text, font=font)
draw.text(((300 - w) / 2, (250 - h) / 2), sticker_text, font=font, fill='black', align='center')
img_path = 'sticker.jpg'
img.save(img_path)

# 自动打印图片,替换为你的实际打印机名称
printer_name = "你的打印机名称"
subprocess.run(
    ['rundll32.exe', 'C:\\Windows\\System32\\shimgvw.dll,ImageView_PrintTo', img_path, printer_name],
    shell=True,
    check=True
)

方法2:用win32print直接控制打印(需pywin32)

通过win32print直接发送打印任务,适合批量打印场景,可精准控制打印位置:

import win32print
import win32ui
from PIL import Image, ImageDraw, ImageFont, ImageWin

# 生成图片逻辑不变
img = Image.new("RGB", (300, 250), 'white')
draw = ImageDraw.Draw(img)
sticker_text = 'Name\nSurname\n\nCompany'
font = ImageFont.truetype('arial.ttf', size=40)
_, _, w, h = draw.textbbox((0, 0), sticker_text, font=font)
draw.text(((300 - w) / 2, (250 - h) / 2), sticker_text, font=font, fill='black', align='center')

# 执行打印
printer_name = win32print.GetDefaultPrinter()
hDC = win32ui.CreateDC()
hDC.CreatePrinterDC(printer_name)
hDC.StartDoc("Sticker Print")
hDC.StartPage()

# 获取打印机可打印区域,计算居中坐标
print_area = hDC.GetDeviceCaps(8), hDC.GetDeviceCaps(10)
img_width, img_height = img.size
x = (print_area[0] - img_width) // 2
y = (print_area[1] - img_height) // 2

# 绘制图片到打印画布
dib = ImageWin.Dib(img)
dib.draw(hDC.GetHandleOutput(), (x, y, x+img_width, y+img_height))

hDC.EndPage()
hDC.EndDoc()
hDC.DeleteDC()

问题2:PDF打印保持原比例

生成PDF时将原图片居中放置在A4页面上,不做拉伸缩放,即可实现原比例打印。使用reportlab库实现:

  1. 先安装依赖:
pip install reportlab
  1. 修改代码生成带原尺寸图片的PDF:
from PIL import Image, ImageDraw, ImageFont
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
import win32api

# 生成原图片逻辑不变
img = Image.new("RGB", (300, 250), 'white')
draw = ImageDraw.Draw(img)
sticker_text = 'Name\nSurname\n\nCompany'
font = ImageFont.truetype('arial.ttf', size=40)
_, _, w, h = draw.textbbox((0, 0), sticker_text, font=font)
draw.text(((300 - w) / 2, (250 - h) / 2), sticker_text, font=font, fill='black', align='center')
img_path = 'sticker.jpg'
img.save(img_path)

# 生成A4 PDF,图片居中且保持原尺寸
pdf_path = 'sticker.pdf'
a4_width, a4_height = A4
img_width, img_height = img.size

c = canvas.Canvas(pdf_path, pagesize=A4)
x_pos = (a4_width - img_width) / 2
y_pos = (a4_height - img_height) / 2
c.drawImage(img_path, x_pos, y_pos, width=img_width, height=img_height)
c.save()

# 自动打印PDF
win32api.ShellExecute(0, "print", pdf_path, None, ".", 0)

内容的提问来源于stack exchange,提问作者MahoneyZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:01:09