生成的图片无法自动打印,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库实现:
- 先安装依赖:
pip install reportlab
- 修改代码生成带原尺寸图片的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
相关产品推荐
相关产品推荐

