使用win32api.ShellExecute打印文件的帖子很多,但是如果每个PDF的打印设置都不一样就很麻烦。这里拿一个惠普打印机型号作为范例。其他打印机也差不多。
如果要打印具体页面,需要安装Ghostscript,GhostView。参考如下:python 批量打印PDF - onelang - 博客园
其他主要参考以下:
Python使用win32print实现打印机控制(一)_通信河马的博客-CSDN博客_win32print
Python使用win32print实现打印机控制(二)打印机api部分参数解析_通信河马的博客-CSDN博客_打印机api
python连接打印机打印文档、图片、pdf文件等_ersaijun的博客-CSDN博客_python 调用打印机
打印pdf后关闭Adobe Acrobat PRO DC - 问答 - Python中文网
python使用自定义配置并调用电脑打印机 - 不要不说 - 博客园
win32print设置打印机属性进行pdf打印_scf_cy的博客-CSDN博客_win32print
python win32print api_python学习笔记(win32print API介绍)_weixin_39932300的博客-CSDN博客
# !python3
# 自动打印.py - 自动打印,使用PDF
# -*- coding: utf-8 -*-
import os,time
import win32api
import win32print
# 重要提示:因为我的PDF默认使用Adobe Acrobat DC打开,但这里有一个问题是必须关闭Acrobat.exe才能知道默认打印机的更改,故每次打印前为保险起见需要关闭所有Acrobat.exe
try:
os.system("taskkill /F /IM Acrobat.exe")
except:
pass# 如没有找到Acrobat.exe进程,则跳过
# 获取所有打印机信息
printers = win32print.EnumPrinters(3)
# 获取默认打印机
default_printers = win32print.GetDefaultPrinter()
print(default_printers)
# 指定另一个打印机名作为默认打印机
win32print.SetDefaultPrinter('HP Color MFP E87640-50-60 PCL-6 (V4) (网络)')# 这里可以换成其他打印机名称
default_printers = win32print.GetDefaultPrinter()
print(default_printers)
# 设置权限作为获得句柄语句的参数,有时也可不用
printaccess = {"DesiredAccess":win32print.PRINTER_ACCESS_USE}# 较低的权限
print_DEFAULTS = {"DesiredAccess":win32print.PRINTER_ALL_ACCESS}# 较高的权限
# 获取指定打印机句柄
pHandle = win32print.OpenPrinter(default_printers,print_DEFAULTS)# 这里使用默认打印机,第2个权限参数是可选选项,但如果不设置足够高的权限可能无法成功更改打印参数设置
# 根据指定打印机句柄获取指定打印机信息
properties = win32print.GetPrinter(pHandle,2)#传入1返回1个元祖,传入2返回1个字典
# 获取打印机打印参数设置——pDevMode类
devmode = properties['pDevMode']
##查看devmode各类属性
for n in dir(devmode):
print(n,getattr(devmode,n))
# 设置打印函数
def printFile(filename,Copies,FormName='A4',PaperSize=9,Orientation=1,Duplex=2,Color=1):
# 设置各类参数
devmode.Copies = Copies # 打印份数设置
devmode.FormName = FormName # 纸张尺寸设置:默认A4
devmode.PaperSize = PaperSize # 只设置FormName不能更改纸张尺寸,设定PaperSize可以。另外指定PaperSize大小(A3为8,A4为9,A5为11,B4为12,B5为13等等)后,则PaperLength和PaperWidth不生效,
devmode.Orientation = Orientation # 方向设置:1为纵向,2为横向。这里默认为1.
devmode.Duplex = Duplex # 双面打印设置:1代表单面;2代表是,翻转;3代表是,向上翻。默认为2。
devmode.Color = Color # 灰度打印设置:1代表仅限黑白,2代表关(即彩色)
# 可以对一些一般不更改的打印参数进行默认设置
devmode.MediaType = 291 # 纸张类型设置:292是未指定,291是普通纸,290是HP EcoFFICIENT,以此往下类推。这里默认291——普通纸
devmode.DefaultSource = 264 # 纸张来源设置:这里默认为1——打印机自动选择
#保存更改后的设置
properties['pDevMode'] = devmode
win32print.SetPrinter(pHandle,2,properties,0)
#使用ShellExecute打印
win32api.ShellExecute(
0,
"print",
filename,
None,#设置为None即可,也可用下面一行的语句
#'/d:"%s"' % win32print.GetDefaultPrinter(),
".",
0
)
time.sleep(10)
files = os.listdir('C:\\test')
for file in files:
if '横向打印测试' in file:
printFile(filename=filepath,Copies=1,Orientation=2,Duplex=3) # 各种不同打印参数设置下传入不同参数
elif '纵向打印测试' in file:
printFile(filename=filepath,Copies=1,Duplex=2)#
# 恢复自己用的默认打印机
try:
os.system("taskkill /F /IM Acrobat.exe")
except:
pass
win32print.SetDefaultPrinter('SHARP DX-2508NC')
#退出窗口
exit()