Power Automate 中的催款函模板:使用 PDF4me 为 SharePoint 中的每个就绪案件生成 PDF 信函

PDF4me Generate Document Single是一个 Power Automate 操作,它将 JSON 数据合并到Word模板中并返回最终文档。该操作指向 SharePoint 中的法律事务列表,它会将一个催款函模板转换为 PDF 格式,每个标记为已准备就绪的事务对应一封催款函,并将每封催款函归档到相应的事务文件夹中,同时更新事务状态。
搜索催款函模板,第一页的内容大多来自法院自助中心、法律援助网站和表格库。加州法院、WashingtonLawHelp 和 LawDepot 都提供了如何撰写催款函的详细指南。然而,这些指南都没有涵盖每周发送三十封催款函的律师事务所的情况。在这些事务所,撰写催款函本身并不难,难的是相关的行政工作:从案件记录中复制客户、对方当事人以及索赔金额,将 PDF 文件保存到正确的案件文件夹中,并记得将案件标记为已完成。本流程可以处理这些行政工作,并将正文内容保留在律师可控的Word文档中。
在 SharePoint 中将案件标记为Ready for Demand Letter,然后运行流程。每个标记为准备发送的案件都会生成一份 PDF 格式的催款函,并保存在各自的文件夹中,同时状态也会更新。团队还会收到一封电子邮件,告知已发送催款函的数量。催款函本身是一个Word文档,包含六个占位符,由 PDF4me 从案件记录中自动填充。整个流程共 11 个操作,处理两个案件大约需要 8 秒。
基于原因的问答
为什么要使用Word模板来创建信函?因为撰写信函的人员本身就习惯使用Word。律师可以修改段落、更新信头或添加条款,而无需改变信函的整体结构,占位符也会保留在原位。PDF4me 可以直接读取 .docx 文件,因此无需先将其转换为 HTML 格式。
为什么选择按状态列进行筛选,而不是针对每个新案件触发筛选?因为案件并非在创建之初就具备发出催款函的条件。状态列允许律师助理判断案件事实何时完整,查询会精确地选取这些行。在提交案件后立即更改状态,可以防止同一案件在下次运行时收到第二封催款函。
为什么要给每个案件都单独创建一个文件夹?因为案件文件本来就是这样组织的。文件夹路径使用案件ID,所以MAT-1001.pdf会放在DemandLetters/MAT-1001文件夹里,和其他所有案件相关的文件放在一起,这样任何打开案件的人都能直接找到这封信,无需搜索。
为什么要用一个变量来统计信件数量?因为汇总邮件需要报告本次运行实际生成了多少封信件。每次处理结束后,信件归档且状态更改后,DocIndex值都会加一,因此邮件主题中的数字就是成功完成整个流程的信件数量。
您将获得
输入:一个 SharePoint 事项列表,每个事项包含事项ID、客户、事件日期、对方当事人、损失金额、律师和状态。输出:每个事项生成一份 PDF 格式的催款函,标记为已准备就绪,位于/Shared Documents/DemandLetters/<matter ID>下;事项状态更改为Demand Letter Generated;以及一封汇总邮件,用于汇总该批次事项。

MAT-1001.pdf位于其单独的文件夹中,由流程帐户编写。

这是来自单个案件批次的摘要。计数来自DocIndex变量。
你需要什么
- Power Automate。打开 Power Automate。基于标准连接器的云流。SharePoint、Office 365 Outlook和 PDF4me 无需高级计划。
- PDF4me API 密钥。获取您的 API 密钥。此流程使用一个 PDF4me 连接,PDF4me PDF。
- 一个 SharePoint 事项列表。捕获的列表名为Matters。其Title列包含事项ID,在列表视图中重命名为MatterID ID,此外还有ClientName、IncidentDate、OpposingParty、DamagesAmount和Attorney列,以及一个Status选择列,其值包括草稿、Ready for Demand Letter和Demand Letter Generated。
- 模板和信函的文档库。模板位于Shared Documents下,信函位于Shared Documents/DemandLetters.
- 催款函模板. demand-letter-template.docx。PDF4me 模板语法中包含六个占位符。措辞仅为示例,并非法律建议,因此在发送给任何人之前,请务必咨询律师并审核您自己的版本。
- 最终信函.mat mat-1001-demand-letter.pdf。这正是MAT-1001事项流程所产生的结果。
首先获取示例。将模板上传到Shared Documents,文件名为DemandLetterTemplate.docx,添加一个状态为Ready for Demand Letter案件,然后运行流程。之后,将您的催款函与已完成的催款函并排比较。如果姓名、金额和案件ID都完全一致,则所有映射都正确。
流程概览
- Manually trigger a flow即可启动批次处理。
- Get items读取
Matters列表,Filter QueryStatus eq 'Ready for Demand Letter'。 - Select将每个事项映射到六个模板字段。
- Get file content读取
/Shared Documents/DemandLetterTemplate.docx。 - Initialize variable会创建
DocIndex,其值为0的整数。 - 对Get items中的Apply to each。
- PDF - Generate Document (Single) (PDF4me PDF)将模板填充为Output Type
PDF。 - Create file (SharePoint)将信函保存到
/Shared Documents/DemandLetters/<matter ID>中。 - Update item (SharePoint)将Status设置为
Demand Letter Generated。 - Increment variable将
DocIndex加1。 - Send an email (V2) (Office 365 Outlook)发送批次摘要。
完整流程概述

一个包含两个事项的批次。循环两次运行共耗时七秒,其中 SharePoint 写入是整个循环中最慢的步骤,每个字母需要两秒。
第一步:如何按需批量发送催款函?
目前流程:尚未启动,这是触发点。
手动触发方式符合信件实际寄出的方式:有人查看标记为已准备就绪的事项,然后按下按钮。
- 创建Instant cloud flow并选择Manually trigger a flow。
- 无需输入任何内容。列表本身会决定哪些事项包含在批次中。
手动触发配置

无需输入任何内容。选择操作将在下一步的Status列中进行。
提示:流程的其余部分都不依赖于谁启动了它。将触发器替换为Recurrence,同一个流程就会变成一个夜间批处理,它会获取当天标记为就绪的所有任务。
第二步:如何筛选出那些可以发出催款函的事项?
目前流程: Manually trigger a flow。
Get items会进行选择,因此流程本身无需检查状态。
- 添加SharePoint > Get items。
- 配置:
- Site Address:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints - List Name:
Matters
- Site Address:
- 打开Advanced parameters并进行设置:
- Filter Query:
Status eq 'Ready for Demand Letter' - Order By:
Title asc
- Filter Query:
Get items:配置

筛选值将完全匹配,包括大小写。按Title排序将按案件 ID 顺序排列字母。
提示:除非您提高返回最多 100 行Top Count或在操作设置中启用分页,否则Get items最多返回 100 行。这对于每日批量处理来说已经足够,但最好在首次月末运行之前了解这一点。
步骤 3:Select操作映射什么?
目前流程: Manually trigger a flow + Get items。
Select将每个事项行转换为模板所知道的六个字段,这使得列表和模板之间的联系易于理解。
- 添加Data Operation > Select。
- 来自:Get items的
body/valuetoken。 - 映射:每个模板字段一行,如下表所示。
Select:配置

五个字段保留了原列名。第六个字段MatterID来自列表的Title列。
每个占位符如何获得其值
| 模板中的占位符 | JSON 密钥 | SharePoint 列 | 在MAT-1001信函中 |
|---|---|---|---|
<<[ClientName]>> | ClientName | ClientName | Sarah Chen |
<<[IncidentDate]>> | IncidentDate | IncidentDate | 06/14/2026 00:00:00 |
<<[OpposingParty]>> | OpposingParty | OpposingParty | Meridian Logistics Inc. |
<<[DamagesAmount]>> | DamagesAmount | DamagesAmount | 18500 |
<<[Attorney]>> | Attorney | Attorney | David Park |
<<[MatterID]>> | MatterID | Title | MAT-1001 |
在复制此步骤之前,需要了解以下几点。在捕获的流程中,循环直接读取Get items,并且信函的值也来自循环,因此下游没有任何操作使用Select输出。这在某种程度上是故意的:Update item需要每个事项的ID,而Select输出会省略它。要改为从Select 输出驱动循环,请将ID添加到映射中,并将应用指向Select输出的Apply to each。
步骤 4:流程从哪里读取Word模板?
目前流程: Manually trigger a flow + Get items + Select。
模板是文档库中的一个普通Word文件。在循环之前读取它,意味着它是按批次读取一次,而不是按事项读取一次。
- 添加SharePoint > Get file content。
- 配置:
- Site Address:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints - File Identifier:
/Shared Documents/DemandLetterTemplate.docx - Infer content type (高级):
Yes
- Site Address:
Get file content:配置

在 SharePoint 中编辑模板,下一批邮件将使用新的措辞,流程保持不变。
该模板包含六个 PDF4me 模板语法占位符:<<[Attorney]>>、<<[IncidentDate]>>、<<[OpposingParty]>>、<<[MatterID]>>、<<[ClientName]>>和<<[DamagesAmount]>>。信头、参考行及其周围的正文均为纯Word内容。Word Word语法概述涵盖了占位符的所有其他功能。
步骤 5:为什么流程需要一个计数器变量?
目前为止的流程:所有操作都通过Get file content。
摘要邮件需要一个数字,而使用变量是将其从循环中取出的最简单方法。
- 添加Variables > Initialize variable。
- 配置:
- 名称:
DocIndex - 类型:
Integer - 值:
0
- 名称:
Initialize variable:配置

Initialize variable必须位于流程的顶层。Power Automate 不允许将其放在循环内部。
步骤 6:如何为每个案件生成一封催款函?
目前为止的流程:所有操作都通过Initialize variable完成。
这是真正执行工作的循环。每次循环都会生成一封信函,将其归档,更新案件信息并进行计数。
- 添加Control > Apply to each。
- Select an output from previous steps:从Get items中
body/value标记。
Apply to each:配置

循环内有四个动作,无论处理一个问题还是五十个问题,这个结论都成立。
现在是循环中的第一个操作。
- 添加 PDF - 从PDF4me PDF连接PDF - Generate Document (Single)。
- 配置:
- Template File Type:
Docx (PDF4me Template Syntax) - Template File Name:
DemandLetterTemplate.docx - Template File Data:对Get file content输出进行
base64()编码的表达式,例如base64(body('Get_file_content')) - Document Data Type:
Json - Document Data File:留空
- Document Data Text:以下 JSON 数据由当前事项构建而成
- Output Type:
PDF - Keep Pdf template Editable:
No
- Template File Type:
Document Data Text中的标记解析为以下表达式:
{
"ClientName": "@{items('Apply_to_each')?['ClientName']}",
"IncidentDate": "@{items('Apply_to_each')?['IncidentDate']}",
"OpposingParty": "@{items('Apply_to_each')?['OpposingParty']}",
"DamagesAmount": "@{items('Apply_to_each')?['DamagesAmount']}",
"Attorney": "@{items('Apply_to_each')?['Attorney']}",
"MatterID": "@{items('Apply_to_each')?['Title']}"
}
Generate Document (Single):配置

JSON 键必须与占位符名称完全匹配。只有MatterID的值来自一个名称不同的列。
在发出第一封正式信函之前,请先修正日期和金额。目前,由于日期和金额均未设置格式,导致信函中显示的事件日期为 2026 年 6 月 14 日 00:00:00,损失金额为 18500 美元。通常情况下,索赔信函中不会包含时间戳,因此请在模板中的日期占位符处添加格式,并在流程中设置金额格式,如下所示。
对于日期,请在Word模板中为占位符提供格式字符串,具体操作请参见Word模板中的格式设置:
<<[IncidentDate]:"MMMM dd, yyyy">>输出 2026 年 6 月 14 日。
对于金额,请在将其应用到模板之前,在Document Data Text中对其进行格式化。这里假设DamagesAmount是数字或货币类型:
formatNumber(items('Apply_to_each')?['DamagesAmount'], 'N0', 'en-US')生成 18,500。
formatNumber和本文中使用的其他函数在工作流表达式函数参考中有详细说明。
步骤 7:每封信件归档到哪里?
目前流程:循环,通过Generate Document (Single)。
这里的事项ID起到了双重作用,既是文件夹的名称,也是文件的名称。
- 添加SharePoint > 在循环内Create file。
- 配置:
- Site Address:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints - Folder Path:
/Shared Documents/DemandLetters/,后跟Title标记 - File Name:Title标记后跟
.pdf - File Content:PDF Body标记PDF - Generate Document (Single)
- Site Address:
Create file:配置

对于MAT-1001事项,请写入/Shared Documents/DemandLetters/MAT-1001/MAT-1001.pdf.
提示:像MAT-1001这样的ID非常适合用作文件夹和文件名,因为它不包含 SharePoint 会拒绝的任何内容。如果您的案件 ID 是自由文本,请先去除斜杠、冒号和问号,否则在第一个包含此类字符的案件上Create file将会失败。
第 8 步:如何阻止某个事项收到第二封信函?
目前为止的流程:循环,通过Create file。
步骤 2 中的筛选器仅在信件存在后状态发生变化时才有效。这就是此操作的全部作用。
- 在循环内添加SharePoint > Update item。
- 配置:
- Site Address:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints - List Name:
Matters - ID:当前事项的ID令牌
- Status Value (高级):
Demand Letter Generated
- Site Address:
Update item:配置

Update item仅在Create file成功后运行,因此信函失败的事项仍可等待下一批处理。
步骤 9:团队如何知道批次已完成?
目前为止的流程:循环,通过Update item。
完成这项工作需要两个操作:一个在循环内进行计数,另一个在循环结束后进行报告。
- 添加Variables > Increment variable作为循环内的最后一个操作。
- 名称:
DocIndex - 数值:
1
- 名称:
- 在循环之后添加Office 365 Outlook > Send an email (V2)。
- 收件人:您的团队地址
- 主题:
Demand Letters Generated -后跟DocIndex标记,并in this batch - Body:
Hi team,本批次已生成文档索引DocIndex和demand letters were generated in this batch and saved to the matter folders in SharePoint. Matter statuses have been updated to "Demand Letter Generated". - Importance (高级):
Normal
Increment variable 和 Send an email (V2):配置

最后放在循环内部,所以它只统计已归档和记录的信件。

每批邮件一封,而不是每封信件一封。
提示:捕获的电子邮件显示1 封催款函。将固定单词替换为if(equals(variables('DocIndex'), 1), 'letter', 'letters'),主题和正文即可正确显示为一批一封邮件。
运行流程并验证
- Save流程并选择Test,然后Manually。
- 在运行之前,至少将一个事项标记为Ready for Demand Letter。
- 打开运行历史记录。Apply to each,应显示每个事项的一次迭代,并标记为就绪,且每个操作都应显示为绿色。
- 打开
/Shared Documents/DemandLetters,检查每个案件是否对应一个文件夹,每个文件夹内都有一个以案件ID命名的 PDF 文件。 - 打开Matters列表,确认这些事项现在显示Demand Letter Generated。
跑步结束后,Matters清单如下

目前有三项事项显示Demand Letter Generated。MAT-1003 仍为草稿,因此筛选器跳过了该事项,未生成催款函。
捕获的运行过程在大约八秒内处理了两个事项。MAT MAT-1001的信函为单页,大小为 21,121 字节,由PDF4me Legal Associates发出,David Park代表Sarah Chen签名,收件人为Meridian Logistics Inc.其 XMP 元数据声明pdfaid:part为1,pdfaid:conformance为B,即 PDF/A-1b。前面显示的摘要电子邮件来自另一个单独的单事项批次。
你实际搭建了什么?一个小型法律文件自动化流程。已批准的措辞保存在一个Word模板中,案件事实列在案件列表中,状态栏决定哪些文件发出,并记录已发出的文件。这样一来,就无需有人手动将客户姓名抄写到信函中,也无需有人记住哪些案件还需要处理。
无需重建即可添加的常见变体
与其他催款函制作方式相比,这种方法有何异同?
每一行描述了一种替代方案。最后一行就是这个流程。
| 比较 | 模板 | 连接器或许可证 | 输出 | 更新案件记录 |
|---|---|---|---|---|
| 手工填写模板与此流程 | Word,每个字母都要重新输入 | 没有任何 | 无论这个人存了多少钱 | 如果有人记得的话,就用手写 |
| 微软Populate a Microsoft Word template与此流程 | 带有内容控件的Word | Premium Word Online (Business)连接器 | .docx 和 PDF 文件需要进行二次转换 | 只有当你添加它时 |
| 专用法律文件自动化软件与此流程的比较 | 通常是供应商自己的模板编辑器 | 单独订阅 | Word或 PDF | 该产品内部 |
| 这种流程 | 带有占位符的Word,PDF4me 模板语法 | 标准连接器 | PDF文件,按事项提交 | 是的,Status已更新 |
关键区别在于:这是唯一一行模板保持为普通Word文件,而事项记录在同一次运行中发生变化的情况。
常见问题
如何撰写催款函模板?
首先,以贵公司已发出的信函为基础,标记出不同案件中所有发生变化的数值。一封典型的催款函包含信头、日期、收件人、案件编号(包含案件ID、简要事实陈述、索赔金额及截止日期、逾期处理措施以及签名。除数值变化外,其余内容均为固定措辞。
为了实现自动化,每个更改的值都会变成一个占位符。示例模板使用了六个值:客户、事件日期、对方当事人、金额、律师和案件ID。其措辞仅供参考,因此请务必让律师审核您实际发送的任何模板的措辞。
如何使用 Power Automate 填充Word模板?
有两种常见方法。微软的Populate a Microsoft Word template操作使用文档中的内容控件,并且位于高级版Word Online (Business)连接器中。它返回 .docx 文件,因此需要进行二次转换才能生成 PDF 文件。
此流程使用PDF4me 的Generate Document (Single)功能。模板是一个普通的 .docx 文件,包含诸如<<[ClientName]>>之类的占位符,数据以 JSON 格式输入,操作直接通过标准连接器返回 PDF 文件。使用Get file content功能读取模板,通过base64()进行编码,并从列表项构建Document Data Text。
如何在Word中自动撰写信函?
在Word内部,传统的解决方法是邮件合并:创建一个带有合并域的文档,并导入 Excel 表格等数据源。这种方法虽然可行,但需要有人在电脑上运行邮件合并,并将结果归档。
要真正实现自动化,就需要将Word文档作为模板,并让流程根据记录自动填充。这里,记录指的是 SharePoint 列表,触发器决定何时运行批处理,文件归档和状态更新在同一次运行中完成,因此无需任何合并步骤。
什么是法律文件自动化?
法律文件自动化是指利用已批准的模板和案件数据生成法律文件,例如催款函、委托书和通知书,而不是逐一手工起草。模板包含律所已批准的文本,数据来自案件记录,软件负责合并这些数据。
这个流程是一个很小的具体例子:一个Word模板,一个事项列表,以及一个 PDF4me 操作执行合并,事项状态记录信件已存在。
故障排除
在该事项的数据中查找双引号,通常位于公司名称中。Document Data Text是由文本组装而成的 JSON,因此多余的引号会导致值提前结束,从而使 JSON 无效。请转义值中的引号,或者先在Compose操作中构建对象,然后传递其输出。
由于占位符没有格式,因此日期会连同时间一起打印出来。请按照步骤 6 所示,在模板中的IncidentDate占位符中添加格式字符串,然后重新上传模板。
返回的Get items为空。Filter Query会精确比较文本,因此请检查拼写和大小写是否与Status选项一致,并确保查询使用列的内部名称。运行流程,将单个事项设置为Ready for Demand Letter以进行确认。
状态从未改变。请检查Update item是否使用了当前案件的ID,以及其Status Value是否与不符合筛选条件的选项匹配。如果状态始终Ready for Demand Letter,则每次运行都会重新处理该案件。
后续步骤
同样的 11 步模式(按状态筛选列表、每行填写Word模板、归档 PDF、更改状态、报告计数)可以处理列表行可以驱动的任何文档:委托书、通知、续约提醒和和解提议。