在Dynamics 365用Power Automate根据模板生成PDF

发布时间 2023-04-05 23:35:00作者: 不为人知的鹅妈妈

  在Dynamics 365的项目中经常遇到需要把CRM的表单根据模板生成PDF以便打印的需求,本文以合同表单根据合同模板生成PDF文件为例,介绍通过Power Automate的云端流实现该需求的方法。

  先看最终效果:

     

  下面是详细的步骤

  step1 环境需求

  我在Power Automate中用的是SharePoint连接器来获取和生成文件,因此组织中需要有SharePoint应用和权限,CRM是online版本,如果是OP版本还需要创建OP的连接器。

  step2 创建Word模板

  1、Word模板中需要用到“纯文本内容控件”和“重复分区内容控件”,它们位于“开发工具”菜单栏。

  

   如果看不到“开发工具”栏,按以下步骤打开它

  · 点击“文件”--“选项”

  · 在“Word选项”窗口点击“自定义功能区”,将左侧选项栏中的“开发工具”添加到右侧,点击确定。

  

 

  2、准备好合同模板的word文档,注意文档不能有任何修订和批注内容,不然SharePoint无法将它作为模板进行内容填充。

  

 

  3、在需要替换单个文本的位置点击并插入“纯文本内容控件”,在控件内输入变量名,这里我插入了contractnum、accountname、contactname、address、phone、email几个纯文本控件,这些控件的内容将在填充模板时根据合同和客户上的字段进行动态替换。

  

 

  4、如果合同中需要展示多行动态表格,例如和合同明细、产品明细等,则需要用到“重复分区内容控件”,选中模板中的表格行,点击“重复分区内容控件”。

  

  5、插入控件后点击属性,给控件的标题和标记命名,我这里给两个都命名“productsection”

  

 

   6、在表格行的单元格内再插入“纯文本内容控件”,并给纯文本内容控件的属性标题和标记命名,后面填充内容时需要用到这些变量名。

   

 

   step3 将Word模板上传到SharePoint

  1、在SharePoint中新建一个文档库,这里我已经创建了一个合同模板文档库

  

 

   2、在合同模板文档库内创建一个Template Files文件夹,用于存放临时文件,将前面准备好的Word模板上传到合同模板文档库内。

  

 

  step4 创建Power Automate云端流

  1、在Power Automate首页,选择创建“即时云端流”,触发方式选择“当收到HTTP请求时”

  

 

 

 

 

  2、给云端流创建步骤,以下是整个流所有步骤的总览,下面会介绍每个步骤的细节。

 

  

 

 

 

  step5 当收到HTTP请求步骤

 

  

  1、method选择POST

  2、请求正文JSON架构为

{
    "type": "object",
    "properties": {
        "recordid": {
            "type": "string"
        },
        "productlist": {
            "type": "string"
        }
    }
}

  下面是请求传参的示例,recordid为合同的id,在Power Automate中根据id获取合同数据,productlist为合同明细的JSON格式字符串,注意productlist中的属性名要和step2第6点纯文本内容控件属性的标题一致,在后续步骤解析这个字符串用来填充模板中的动态表格。

{
  "recordid": "1489C313-0993-ED11-AAD1-000D3A856701",
  "productlist": "[{\"prdno\":\"01\",\"prdname\":\"商品A\",\"prdtype\":\"商品A\",\"prdcount\":\"20\",\"price\":\"400\",\"pricenotax\":\"8000\",\"totalprice\":\"8000\"},{\"prdno\":\"11\",\"prdname\":\"商品A\",\"prdtype\":\"商品A\",\"prdcount\":\"20\",\"price\":\"400\",\"pricenotax\":\"8000\",\"totalprice\":\"8000\"}]"
}

 

  step6 分析产品列表JSON

  1、在“当收到HTTP请求时”步骤下点击“+新步骤”,命名“分析产品列表JSON”,选择“数据操作”,在操作栏选择“分析JSON”

  

 

 

 

  2、步骤内容选择动态内容--收到HTTP请求时--productlist。

 

  

 

 

 

 

  3、架构内容为以下json代码,也可以点击“从示例生成”,输入入参示例中productlist的json值(注意要去掉"\"),Power Automate会自动生成架构。

 

 

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "prdno": {
                "type": "string"
            },
            "prdname": {
                "type": "string"
            },
            "prdtype": {
                "type": "string"
            },
            "prdcount": {
                "type": "string"
            },
            "price": {
                "type": "string"
            },
            "pricenotax": {
                "type": "string"
            },
            "totalprice": {
                "type": "string"
            }
        },
        "required": [
            "prdno",
            "prdname",
            "prdtype",
            "prdcount",
            "price",
            "pricenotax",
            "totalprice"
        ]
    }
}

 

 

  step7 按ID获取合同

  1、在上面的步骤下继续添加步骤,命名“按ID获取合同”,选择Microsoft Dataverse,操作选择按ID获取行。

  

 

 

 

   2、表名称选择合同(Dataverse中的合同表),行ID选择动态内容--当收到HTTP请求时--recordid。

  

 

 

 

   step8 获取合同客户

  新增步骤,命名“获取合同客户”,跟上面一样选择Microsoft Dataverse,按ID获取行,表名称选择客户,行ID选择动态内容--按ID获取合同--合同相对方(值),这个字段是合同上关联客户的字段,这样就可以获取到合同上关联客户的电话邮箱地址等信息。

  

 

 

   

  step9 获取合同模板

  1、新增步骤,命名“获取合同模板”,选择SharePoint,操作选择“获取文件内容”。

  

 

  2、站点地址选择组织内绑定的SharePoint站点,在文件标识符栏点击右侧的文件夹图标,选择DocLib/销售合同模板.docx。

  

 

 

   

  step10 填充合同Word模板

  1、新增步骤,命名“填充合同Word模板”,选择“Word Online”,操作选择“填充Microsoft Word模板”

  

 

  2、位置选择“SharePoint Site - Communication site”,文档库选择“合同模板”,文件选择“销售合同模板.docx”

 

   

 

  3、在选择文件后,步骤会自动弹出我们之前在合同模板文档中插入的纯文本内容控件字段,我们给这些字段填入step7和step8获取到的动态内容字段。

  

 

  4、虚线框内为重复分区内容控件,可以看到里面的字段对应step2第6点内我们插入的控件属性名,这里不要单独给这些字段填充值,点击右侧的图标按钮,切换到输入整个数组

  

 

  5、在重复分区内容控件收起后,给productsection字段填入“分析产品列表JSON”--正文

  

 

 

   

  step11 创建合同Word文件

  1、新增步骤,命名“创建合同Word文件”,选择SharePoint,操作选择“创建文件”

  

 

 

 

  2、站点地址选择组织内的SharePoint站点,文件夹路径选择“/DocLib/Temp Files”,文件名为 Contra_pdf_@{guid()}.docx(注意文件名后面一定要带.docx后缀,SharePoint根据后缀名确认生成的文件类型),可以根据需求定义文件名格式,文件名中带使用表达式生成的guid可以避免重名,文件内容选择动态内容--填充合同Word模板--Microsoft Word 文档。

  

 

 

   

  step12 将合同Word文档转换为 PDF

  1、新增步骤,命名“将合同Word文档转换为 PDF”,选择“Word Onlie”,操作选择“将Word文档转换为PDF”。

  

 

 

 

 

   2、位置选择SharePoint Site - Communication site,文档库选择合同模板,文件选择 /Temp Files/+“动态内容--创建合同word文件--Name”

  

 

 

   step13 创建合同pdf文件

  1、新增步骤,命名“创建合同pdf文件”,选择SharePoint,操作选择“创建文件”

  

 

  2、站点地址选择组织内的SharePoint站点,文件夹路径选择“/DocLib/Temp Files”,文件名为 Contra_pdf_@{guid()}.pdf(注意文件名后面一定要带.pdf后缀,SharePoint根据后缀名确认生成的文件类型),可以根据需求定义文件名格式,文件名中带使用表达式生成的guid可以避免重名,文件内容选择动态内容--将合同word文档转换为PDF--PDF文档。

  

 

 

   step14 获取合同pdf文件内容

  1、新增步骤,命名“获取合同pdf文件内容”,选择SharePoint,操作选择“获取文件内容”。

   2、站点地址选择组织内绑定的SharePoint站点,在文件标识选择“动态内容--创建合同pdf文件--Id”。

  

 

  step15 响应

  1、新增步骤,选择“请求”,操作选择“响应”

  

 

 

  2、正文选择“动态内容--创建合同pdf文件--Path”。

 

  

 

 

 

 

  3、点击保存,至此整个云端流创建完成了。

 

 

 

  step16 测试效果

 

  1、把“当收到HTTP请求时”步骤的HTTP POST URL放到Postman测试,云端流成功返回了生成pdf文件的路径。

 

  

 

 

  2、进入SharePoint站点--合同模板--Temp Files查看,可以看到postman返回路径下对应的文件

 

  

 

  3、在Dynamics 365的自定义按钮执行的js中调用这个云端流,将返回的路径前面拼接SharePoint的站点域名,把拼接到的完整url在浏览器的新窗口中打开,就实现了最开始动态图中的效果,具体操作就不赘述了。当然打开这个路径url需要用户默认登录了SharePoint,因为D365当前登录账号和SharePoint账号是一体的,可以直接打开,否则需要登录SharePoint,基于此我们也可以直接返回pdf文件的base64字符串,这样请求方就能直接下载这个文件。Power Automate还有很多强大的功能,我这里也只是一个简单的尝试,愿大家一起探索更多玩法,多多交流!

  

 

 

 

参考:https://dynamicsbackpage.wordpress.com/2019/11/24/generating-dynamic-word-documents-for-dynamics-365-using-power-automate/