工作中遇到的需求: 采购文档在用友U8中打印出来后, 识别表格并把表格内容附在邮件内容中发送给对应采购人员
摘录一下关键点.
首先, 我用的 Python 脚本如下:
import pdfplumber
import os
def extract_table():
latest_pdf = get_latest_pdf()
if not latest_pdf:
return
pdf = pdfplumber.open(latest_pdf)
table_html = "<table border=1>"
for page in pdf.pages:
for table in page.extract_tables():
for i, item in enumerate(table):
table_html += "<tr>"
if i == 0 and table_html.find("<th>") == -1:
for value in item:
table_html += "<th>" + value + "</th>"
else :
for value in item:
table_html += "<td>" + value + "</td>"
table_html += "</tr>"
table_html += "</table>"
return table_html
def get_latest_pdf():
pdf_dir = "C:/pdf"
dir_list = os.listdir(pdf_dir)
if dir_list:
dir_list.sort(key = lambda fn : os.path.getmtime(pdf_dir + '/'+ fn), reverse = True)
return pdf_dir + "/" + dir_list[0]
if __name__ == "__main__":
print(extract_table())
先确保本地有Python环境 (我用的是Python3, 没测试过Python2) , 识别表格靠的就是 pdfplumber 这个包. 建一个 .py 后缀文件放在机器人流程目录下, 把上面的代码复制粘贴进去. 安装 pdfplumber 包, pip install pdfplumber 安装有问题的自行谷歌吧. 这个不展开篇幅了.

前面的流程先把采购文档打印成pdf文件放在一个目录下, 例如我这里用的是 C:/pdf , 不建议放机器人流程目录里, 要改动流程发布时会把pdf文件也发上去, 而且流程目录过大的情况下还会有异常. 参见: Error: Publish of Process project to Orchestrator failed. The operation has timed out.
接下来在 UIPATH 中调用 Python 脚本, 具体如下:
先在依赖中装 Uipath.Python.Activities 这个包:  使用 PythonScope 这个控件. 标红框的几个属性注意下, Path 输入框填的是 Python 环境的安装目录. Target 填的是本地安装的 Python 软件对应是多少位的, 32位的就选择 x86, 64位的就选x64 Version 填的是安装 Python 的版本, 当时写的时候 Uipath 只支持到最高 3.6 版本, 不清楚现在新版的依赖包能支持多少版本, 请自测, 建议要把版本对应上以防止出现一些莫名其妙的问题.  然后用 LoadScript 控件, 把脚本加载进来.  file 属性填脚本名称, 因为脚本是放在流程目录下的所以不需要带路径. 否则请把绝对路径带上. Result 属性填一个 Uipath.Python.PythonObject 类型的变量.  再来用 InvokeMethod 控件, 调用脚本里写的 extract_table 方法, instance 填上一步的脚本对象变量 Name 属性填脚本里写的方法. input parameters 理论上来说用这个属性把 pdf 文件名传到脚本中才科学, 但忘记我当时为毛没这么搞了, 可以自测下看有没问题, 最好还是使用传参的方式做保险些, 当然这样做的话, 脚本就要稍微修改下, 具体就是将 get_latest_pdf() 方法替换成传进来的文件名参数. PS: Python 脚本中的逻辑是拿目录中最新的一个 pdf 文件做识别, 所以必须保证打印出的PDF文件是正确的最新的. 不然可能会出现误将上一单的内容识别发送出去的异常.
result_data 也是一个 Uipath.Python.PythonObject 类型的变量. 用来存执行完脚本返回的数据.  最后用一个 GetObject 控件, 将 Python Object 类型的 result_data 转成 String 格式, 这个 table_html 变量就是一个 String 格式的变量. 注意在这一步最好加一个 Try Catch 控件捕获异常, 在正式使用时有遇见过因为表格内容过长导致解析失败的异常.
 最终把解析到的 table_html 文本放入邮件控件, 注意几个标注的位置, 由上往下分别是附件, 邮件内容, HTML格式(表格内容需要勾选)
 老规矩上个源码给小伙伴们参考下吧.
仓库位置 : https://gitee.com/geekqian/uipath_simple
|