Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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+
@jiangmiemie(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)

AltStyle によって変換されたページ (->オリジナル) /