8000 增加转为PDF工具 · shibing624/python-tutorial@b20bb8c · GitHub
[go: up one dir, main page]

Skip to content

Commit b20bb8c

Browse files
author
jiangyang
committed
增加转为PDF工具
增加转为二维码工具 优化邮件模块:定时、附件参数、附图参数
1 parent 23c1067 commit b20bb8c

File tree

3 files changed

+200
-5
lines changed

3 files changed

+200
-5
lines changed

06_tool/ConvertedToPDF.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
'''
2+
@jiangmiemie(jiangyangcreate@gmail)
3+
自动分辨输入文件路径或文件夹路径,转换指定后缀文件为PDF('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx')
4+
'''
5+
6+
import os
7+
from pathlib import Path
8+
from win32com.client import Dispatch, gencache, DispatchEx
9+
import win32com.client
10+
11+
class PDFConverter:
12+
def __init__(self, pathname):
13+
self._handle_postfix = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
14+
self._filename_list = list()
15+
self._export_folder = os.path.join(os.path.abspath('.'), outpath)
16+
if not os.path.exists(self._export_folder):
17+
os.mkdir(self._export_folder)
18+
self._enumerate_filename(pathname)
19+
20+
def _enumerate_filename(self, pathname):
21+
full_pathname = os.path.abspath(pathname)
22+
if os.path.isfile(full_pathname):
23+
if self._is_legal_postfix(full_pathname):
24+
self._filename_list.append(full_pathname)
25+
else:
26+
raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format(
27+
pathname, '、'.join(self._handle_postfix)))
28+
elif os.path.isdir(full_pathname):
29+
for relpath, _, files in os.walk(full_pathname):
30+
for name in files:
31+
filename = os.path.join(full_pathname, relpath, name)
32+
if self._is_legal_postfix(filename):
33+
self._filename_list.append(os.path.join(filename))
34+
else:
35+
raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname))
36+
37+
def _is_legal_postfix(self, filename):
38+
return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith('~')
39+
40+
def run_conver(self):
41+
'''
42+
进行批量处理,根据后缀名调用函数执行转换
43+
'''
44+
print('需要转换的文件数:', len(self._filename_list))
45+
for filename in self._filename_list:
46+
postfix = filename.split('.')[-1].lower()
47+
funcCall = getattr(self, postfix)
48+
print('原文件:', filename)
49+
funcCall(filename)
50+
print('转换完成!')
51+
52+
def doc(self, filename):
53+
'''
54+
doc 和 docx 文件转换
55+
'''
56+
name = os.path.basename(filename).split('.')[0] + '.pdf'
57+
word = Dispatch('Word.Application')
58+
doc = word.Documents.Open(filename)
59+
pdf_file = os.path.join(self._export_folder, name)
60+
doc.SaveAs(pdf_file, FileFormat=17)
61+
doc.Close()
62+
word.Quit()
63+
64+
def docx(self, filename):
65+
self.doc(filename)
66+
67+
def xls(self, filename):
68+
'''
69+
xls 和 xlsx 文件转换
70+
'''
71+
name = os.path.basename(filename).split('.')[0] + '.pdf'
72+
exportfile = os.path.join(self._export_folder, name)
73+
xlApp = DispatchEx("Excel.Application")
74+
xlApp.Visible = False
75+
xlApp.DisplayAlerts = 0
76+
books = xlApp.Workbooks.Open(filename, False)
77+
books.ExportAsFixedFormat(0, exportfile)
78+
books.Close(False)
79+
print('保存 PDF 文件:', exportfile)
80+
xlApp.Quit()
81+
82+
def xlsx(self, filename):
83+
self.xls(filename)
84+
85+
def ppt(self,filename):
86+
"""
87+
PPT文件导出为pdf格式
88+
:param filename: PPT文件的名称
89+
:param output_filename: 导出的pdf文件的名称
90+
:return:
91+
"""
92+
name = os.path.basename(filename).split('.')[0] + '.pdf'
93+
exportfile = os.path.join(self._export_folder, name)
94+
ppt_app = win32com.client.Dispatch('PowerPoint.Application')
95+
ppt = ppt_app.Presentations.Open(filename)
96+
ppt.SaveAs(exportfile, 32)
97+
print('保存 PDF 文件:', exportfile)
98+
ppt_app.Quit()
99+
100+
def pptx(self, filename):
101+
self.ppt(filename)
102+
103+
104+
def main(In_Path):
105+
my_file = Path(In_Path)
106+
if my_file.is_dir(): # 判断是否为文件夹
107+
pathname = os.path.join(os.path.abspath('.'), In_Path)
108+
else:
109+
pathname = In_Path # 单个文件的转换
110+
pdfConverter = PDFConverter(pathname)
111+
pdfConverter.run_conver()
112+
113+
if __name__ == "__main__":
114+
outpath = 'SavePath'
115+
main(input('输入你要转化的文件或文件夹路径'))

06_tool/Qr_Code.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'''
2+
@jiang F438 miemie(jiangyangcreate@gmail)
3+
生成二维码/解析二维码、生成动态二维码的模块
4+
'''
5+
6+
from easyqr import easyqr as qr# 解析模块
7+
#上传图片
8+
path = r'code\ME.png'#使用你自己的微信二维码截图即可
9+
url = qr.upload(path)
10+
#获得解析的地址
11+
url =qr.online(url)
12+
13+
from MyQR import myqr #动态二维码模块,结果不支持中文
14+
myqr.run(
15+
words= str(url) , # 扫描二维码后,显示的内容,或是跳转的链接
16+
version=9 , # 设置容错率
17+
level='L' , # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
18+
picture='gif.gif' , # 图片所在目录,可以是动图
19+
colorized=True , # 黑白(False)还是彩色(True)
20+
contrast=1.0 , # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。
21+
brightness=1.0 , # 用来调节图片的亮度,用法同上。
22+
save_name='xxxxx.gif' , # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif
23+
)
24+
25+
import qrcode #静态二维码模块,支持中文
26+
img = qrcode.make('DESKTOP')# 填写你想要扫码出现的内容(文字/链接)
27+
img.save('DESKTOP.png') # 填写文件保存路径

06_tool/send_email.py

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
@description: 需要先开启两个服务:
55
IMAP/SMTP服务已开启
66
POP3/SMTP服务已开启
7-
"""
87
8+
schedule模块是定时任务,需要程序一直运行。
9+
增加附件与附图
10+
"""
11+
import time,schedule
912
from smtplib import SMTP_SSL, SMTP
1013
from email.mime.text import MIMEText
14+
from email.mime.multipart import MIMEMultipart
15+
from email.mime.image import MIMEImage
1116

12-
13-
def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show=''):
17+
def send_mail(message, Subject, sender_show, recipient_show, to_addrs,filelanguage = 'cn',filepath=None,imagepath=None, cc_show=''):
1418
"""
1519
:param message: str 邮件内容
1620
:param Subject: str 邮件主题描述
@@ -22,8 +26,38 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show='
2226
# 填写真实的发邮件服务器用户名、密码
2327
user = 'xxx@126.com'
2428
password = 'xxx'
29+
#发送附件的方法定义为一个变量
30+
msg=MIMEMultipart()
2531
# 邮件内容
26-
msg = MIMEText(message, 'plain', _charset="utf-8")
32+
content='邮件正文'
33+
#发送正文
34+
msg.attach(MIMEText(content,'html', 'utf-8'))
35+
#调用传送附件模块,传送附件
36+
if filepath != None:
37+
att=MIMEText(open(filepath,'rb').read(),'base64','utf-8')
38+
#修改下方filename为文件名(文本型,不支持中文)
39+
att["Content-Type"]='application/octet-stream'
40+
if filelanguage == 'cn':
41+
show_file_name = '中文附件.xlsx' # 填写你希望展示出来的附件名称
42+
att.add_header("Content-Disposition", "attachment", filename=("gbk", "", show_file_name))
43+
else:
44+
show_file_name = 'English.XLSX' # 填写你希望展示出来的附件名称
45+
att["Content-Disposition"]=f'attachment;filename="{show_file_name}"'
46+
47+
msg.attach(att)#发送附件
48+
49+
if imagepath != None:
50+
#批量添加图片时需要修改值
51+
mime_images = '<p><img src="cid:imageid{0}" alt="imageid{0}"></p>'.format(1)
52+
mime_img = MIMEImage(open(imagepath, 'rb').read(), _subtype='octet-stream')
53+
mime_img.add_header('Content-ID', 'imageid')
54+
#上传图片至缓存空间
55+
msg.attach(mime_img)
56+
# 上传正文
57+
mime_html = MIMEText('<html><body><p>{0}</p>{1}</body></html>'.format('', mime_images), 'html', 'utf-8')
58+
# 添加附图至正文
59+
msg.attach(mime_html)
60+
2761
# 邮件主题描述
2862
msg["Subject"] = Subject
2963
# 发件人显示,不起实际作用
@@ -43,6 +77,8 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show='
4377
print("send error.", e)
4478

4579

80+
81+
4682
if __name__ == '__main__':
4783
message = 'Python 测试邮件...'
4884
Subject = '主题测试'
@@ -52,4 +88,21 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show='
5288
recipient_show = 'xxx'
5389
# 实际发给的收件人
5490
to_addrs = 'xxx@qq.com,'
55-
send_mail(message, Subject, sender_show, recipient_show, to_addrs)
91+
def job():
92+
send_mail(message, Subject, sender_show, recipient_show, to_addrs)
93+
94+
# 每隔10分钟执行一次任务
95+
# schedule.every(10).minutes.do(job)
96+
# 每隔一小时执行一次任务
97+
# schedule.every().hour.do(job)
98+
# 每天10:30执行一次任务
99+
# schedule.every().day.at("10:30").do(job)
100+
# 每周一的这个时候执行一次任务
101+
# schedule.every().monday.do(job)
102+
# 每周三13:15执行一次任务
103+
# schedule.every().wednesday.at("13:15").do(job)
104+
# 每周五18:00执行一次任务
105+
schedule.every().friday.at("18:00").do(job)
106+
while True:
107+
schedule.run_pending()
108+
time.sleep(1)

0 commit comments

Comments
 (0)
0