首先从我的工作特点出发,介绍如果通过编程实现繁琐的工作简单化。
我在一家进口食品供应链企业工作,我的工作内容常常涉及到PDF文件的打印,比如:报关单,上回我在头条分享了两篇文章,关于 EXCEL - VBA代码的实现批量打印PDF打印文件的文章:1、EXCE-VBA-批量打印单元格内指定文件名的文件;2、批量打印PDF文件 Excel VBA;今天还是围绕打印PDF文件的,不过这次是用 Python代码实现。
Python和Pycharm的安装我这里就直接跳过,搜索一下有很多教程的,Pycharm用免费版就可以了。
首先,实现方式完全是按照自己的想法来的,每个公司都自己的系统或者表格记录着公司的重要信息,然而我们通过系统或者表格筛选出需要的数据后,通过复制相关信息后运行python程序后,程序会根据所复制的内容,在指定的文件夹内检索相关PDF文件,进行PDF文件的复制和打印。
我们用到的库有以下,安装方法可以通过Win+R,运行:CMA,输入pip install 库名安装;或者 通过Pycharm的的文件-设置-python解释器+ 搜索安装,搜索一下有很多教程的;
import os
import shutil
from tkinter import *
from tkinter import filedialog
import glob
import pyperclip
import win32api,win32con,win32print
定义def函数:
1、用于存放复制过来的PDF文件,这个文件夹我叫它“需打印的报关单”(我的电脑桌面路径是:C:\Users\Administrator\Desktop),主要功能就是判断一下这个文件夹是否存在,不存在就直接创建,已存在的话弹出提示框;
def mkdir(): # 文件夹是否存在处理过程
isExists = os.path.exists("C:\\Users\\Administrator\\Desktop\\需打印的报关单") # 判断路径是否存在 # 存在True # 不存在False
if not isExists: # 判断
os.makedirs("C:\\Users\\Administrator\\Desktop\\需打印的报关单") # 不存在创建文件夹
return True
else: #存在就弹出提示框
win32api.MessageBox(0, "帅哥美女:桌面已经有所需的文件夹了,文件夹内可能有之前的文件,请妥善处理后再点击 确认 。", "小叶提醒", win32con.MB_ICONASTERISK)
2、定义打印PDF文件指令,自动选择 电脑默认打印机;
def print_file(print_file): #定义打印PDF文件指令
open(print_file,"r")
win32api.ShellExecute(
0,
"print",
print_file,
'/d:"%s"' % win32print.GetDefaultPrinter(),
".",
0
)
3、程序入口,已标注得非常清楚,这里就不再扒拉巴拉了;
if __name__ == '__main__':
a = 0 #定义一个变量,赋值为0,这个变量用于统计打印报关单的份数
mkdir() #调用函数 def mkdir(): 文件夹是否存在处理过程
path0 = "C:\\Users\\Administrator\\Desktop\\需打印的报关单\\" #定义一个变量,将创建的文件夹路径赋值给它
path2 = pyperclip.paste() #定义一个变量,存放获取的剪切板数据
filelist0 = path2.split("\r\n") #定义一个变量,存放列表化的剪切板数据
if not path2: #剪切板为空的时候弹出提示框
win32api.MessageBox(0, "帅哥美女:没有复制到柜号 或者 复制了其他无关内容,请重新到Excel表格复制柜号。", "小叶提醒QQ308699402", win32con.MB_ICONASTERISK)
root = Tk() #创建一个窗体,通过这个窗口选择指定的目标文件夹,目标文件夹存放着很多PDF文件,我们要通过这个程序在这个文件夹中筛选出需要的文件
root.withdraw() # 隐藏主窗口
path1 = filedialog.askdirectory() #定义一个变量,存放存放目标文件夹内容
filelist1 = os.listdir(path1) #定义一个变量,存放文件内容列表化数据
for aa in filelist0: #将列表化的剪切板数据一个一个的循环赋值给 aa
for bb in filelist1: #将文件内容列表化数据一个一个的循环赋值给 bb
bb1 = bb[0:7] #过滤文件名
bb2 = bb[3:10] #过滤文件名
bb3 = bb[-13:-6] #过滤文件名
bb4 = bb[-14:-7] #过滤文件名
if bb1 == aa or bb2 == aa or bb3 == aa or bb4 == aa: #判断过滤后的文件名与剪切板数据是否一致,直到全部剪切板数据比对完成 aa
for cc in glob.glob(path1 +"/*" + aa + "*关*.pdf"): #循环选取一致的文件
shutil.copy(cc,path0) #复制PDF文件到需打印的报关单文件夹
win32api.MessageBox( #批次量打印前的一次重要提醒,点击 确认 便开始打印复制好的PDF文件
0,
"帅哥美女:\n"
"电脑自动选择默认打印机\n"
"请检查打印机里面的纸张是否全部都是白纸,白纸是否足够\n"
"点击 确定 后开始打印文件夹内的报关单", "小叶提醒QQ308699402", win32con.MB_ICONASTERISK)
desktop_path = "C:\\Users\\Administrator\\Desktop\\" #定义一个变量,赋值一个路径,用于存放打印结果
full_path = desktop_path + '已打印的报关单详细清单.txt' # 创建一个txt文件,也可以创建一个.doc的word文档
file = open(full_path, 'w') #打开txt文档,写入数据
file.write("已打印的报关单有:\n")
for i in os.listdir(path0): #循环打印报关单,直到 文件夹需打印的报关单里的全部文件加载到打印
file_path = os.path.join(path0, i)
print_file(file_path) #调用打印PDF文件指令函数
a += 1 #打印计数
file.write(str(i) + "\n") #已打印的文件名
file.write("一共打印了" + str(a) + "份报关单,请等待打印机完成全部打印!!!")
file.close() #写入关闭
大功告成,运行一下吧!
注意:
1、电脑必须安装Adobe的PDF阅读器,并且将Adobe的PDF阅读器必须设为置为PDF文件的默认打开方式,否则程序会报错(error: (31, 'ShellExecute', '连到系统上的设备没有发挥作用。'))
2、运行前先复制好数据;
3、相关图片