首先從我的工作特點出發,介紹如果通過編程實現繁瑣的工作簡單化。
我在一家進口食品供應鍊企業工作,我的工作内容常常涉及到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、相關圖片
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!