模块结构
在上一篇中,我们看到需求较为复杂,但总体的操作分为以下四个部分:SRM系统操作(B/S架构)、表格处理、发送邮件通知、PDF文件内容获取。另外,从流程的角度,又可以分为以下两个部分:SRM系统填报流程以及获取填报结果流程。
我们可以根据四个操作设计四个模块。再设计一个主模块,其中定义两个流程(finish_erp和download_pdf),并将处理逻辑写在这个主模块中,作为整个RPA机器人运行的入口。
![](https://img.haomeiwen.com/i14211628/59902d524a505fd4.png)
PDF文件内容获取
对于这种非扫描件的PDF,我们使用pdfminer进行文本的提取
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
def read_pdf(pdf):
"""
读取pdf文件,获取所有内容
其中参数pdf为以二进制方式打开pdf的文件流
"""
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdf)
device.close()
content = retstr.getvalue()
retstr.close()
return str(content)
提取出所有文本后,要找到我们需要的出入库单号字段,该字段是由FMIX开头,后五位大写字母或数字,最后12位全为数字组成的,我们使用正则表达式进行提取
![](https://img.haomeiwen.com/i14211628/3738db208e7dde29.png)
import re
def re_match(text):
"""
编写正则表达式,匹配pdf内容中我们需要的出入库单号字段
"""
# 匹配规则:前四位FMIX,后五位大写字母或数字,最后12位全为数字
pattern = re.compile(r'[F][M][I][X][A-Z0-9]{5}[0-9]{12}')
return re.findall(pattern, text)[0]
完整的parse_pdf.py文件:
import re
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
def read_pdf(pdf):
"""
读取pdf文件,获取所有内容
其中参数pdf为以二进制方式打开pdf的文件流
"""
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdf)
device.close()
content = retstr.getvalue()
retstr.close()
return str(content)
def re_match(text):
"""
编写正则表达式,匹配pdf内容中我们需要的出入库单号字段
"""
# 匹配规则:前四位FMIX,后五位大写字母或数字,最后12位全为数字
pattern = re.compile(r'[F][M][I][X][A-Z0-9]{5}[0-9]{12}')
return re.findall(pattern, text)[0]
if __name__ == '__main__':
with open('ShipNote.pdf', "rb") as my_pdf:
print(re_match(read_pdf(my_pdf)))
发送邮件通知
我们通过SMTP协议进行邮件的发送,需要用到python自带的email
和smtplib
两个模块,前者用来构造邮件,后者用来发送邮件。用法请参考SMTP发送邮件。
由流程文档可知一共有两种类型的邮件:分别是异常提醒和业务处理完成提醒,前者需要添加《ERP处理表》作为附件,后者直接将出货单号作为正文即可。
我们使用开通了SMTP服务的QQ邮箱作为发件人,将邮箱密码、发件邮箱、收件人、主题、正文、附件作为参数编写函数如下:
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header
def send_email(mail_pass, sender, receivers, subject, text, file_path=None):
# 第三方 SMTP 服务
mail_host = "smtp.qq.com" # 设置服务器
# 创建一个邮件实例
message = MIMEMultipart()
message['From'] = Header("RPA机器人", 'utf-8')
message['To'] = Header("业务人员", 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
# 邮件正文内容
message.attach(MIMEText(text, 'plain', 'utf-8'))
# 构造附件
if file_path:
file = MIMEApplication(
open(file_path, 'rb').read())
file.add_header('Content-Disposition',
'attachment',
filename=Header("ERP处理表.xls", "utf-8").encode())
message.attach(file)
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25为 SMTP 端口号
smtpObj.login(sender, mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print(e)
网友评论