【RPA案例分享】企業(yè)SRM系統(tǒng)填報——(一)業(yè)務流程文檔
模塊結構
在上一篇中,我們看到需求較為復雜谣殊,但總體的操作分為以下四個部分:SRM系統(tǒng)操作(B/S架構)、表格處理、發(fā)送郵件通知世分、PDF文件內容獲取。另外缀辩,從流程的角度臭埋,又可以分為以下兩個部分:SRM系統(tǒng)填報流程以及獲取填報結果流程。
我們可以根據四個操作設計四個模塊臀玄。再設計一個主模塊瓢阴,其中定義兩個流程(finish_erp和download_pdf),并將處理邏輯寫在這個主模塊中健无,作為整個RPA機器人運行的入口荣恐。
模塊結構
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位全為數字組成的,我們使用正則表達式進行提取
import re
def re_match(text):
"""
編寫正則表達式讶请,匹配pdf內容中我們需要的出入庫單號字段
"""
# 匹配規(guī)則:前四位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內容中我們需要的出入庫單號字段
"""
# 匹配規(guī)則:前四位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)))
發(fā)送郵件通知
我們通過SMTP協(xié)議進行郵件的發(fā)送嘉汰,需要用到python自帶的email
和smtplib
兩個模塊,前者用來構造郵件状勤,后者用來發(fā)送郵件鞋怀。用法請參考SMTP發(fā)送郵件。
由流程文檔可知一共有兩種類型的郵件:分別是異常提醒和業(yè)務處理完成提醒持搜,前者需要添加《ERP處理表》作為附件密似,后者直接將出貨單號作為正文即可。
我們使用開通了SMTP服務的QQ郵箱作為發(fā)件人葫盼,將郵箱密碼残腌、發(fā)件郵箱、收件人、主題抛猫、正文蟆盹、附件作為參數編寫函數如下:
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" # 設置服務器
# 創(chuàng)建一個郵件實例
message = MIMEMultipart()
message['From'] = Header("RPA機器人", 'utf-8')
message['To'] = Header("業(yè)務人員", '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("郵件發(fā)送成功")
except smtplib.SMTPException as e:
print(e)