当前位置: 首页 > 工具软件 > PythonWin > 使用案例 >

使用python的win32模块打印PDF

东郭翰音
2023-12-01

使用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()

 类似资料: