使用PdfSharp从模板生成Pdf文件
最近在做一个生成文档的需求。通过先制作一个包含各字段占位符的文档模板,导入这个模板并填写内容替换掉占位符,再输出成最终文件。
由于版式固定,安全性更好,业务上常用Pdf作为最终标准化的格式, 在.Net平台下,可以使用PdfSharp导入,,导出Pdf文档。这次做一个生成电子处方Pdf的小示例:
制作模板
使用一个Pdf器(如福昕PDF器)创建模板RecipeTemplate
用[形状]绘制表格框体,用[文本]工具,先插入好固定的内容,比如标题、和各栏目冒号之前的内容。
绘制完成如下图
再用[表单 - 文本域] 工具,在各个需要生成内容的地方插入表单项。
文本域名称中,填入占位符
假定占位符规则为:
- 图片占位符: #{字段名称}#
- 文字占位符: ${字段名称}$
那么“医院名称”展位符则设置如下:
完成所有字段的占位符,如下图:
编写代码
用visual studio新建一个PdfGenerator的项目,保存RecipeTemplate.pdf至Assets目录并设置复制输出目录方式为“始终复制”
项目引用PdfSharp库
创建模型类RecipeDocInfo,此类用于承载业务数据
Exporter.cs中,创建ExportDocxByObject方法,使用PdfReader.Open()可以获取PdfDocument对象
PdfDocument.AcroForm()方法可以拿到Pdf文档中的表单对象,该对象中的Fields存储表单项目集合,遍历Key值获取每个表单项
表单项的Name属性为我们设置的表单名称,即占位符。
接下来处理数据对象,通过反射方式获取对象成员名称,并与占位符作匹配,若占位符包含(string.Contains())该成员名称,则将值写入这个表单项的Value中,这里注意一个多行处理的情况。
readOnly设置为true,以防止Pdf表单中的值被随意修改。
同理我们处理图片:
首先数据对象中的内容,应为图片的本地路径或者网络Url
然后读取,绘制图片,注意图片的大小以及位置坐标显示,与表单所对应的框架(/Rect)一致
详细的绘图方式,请参考官方文档:
完成Exporter.cs之后,在Main函数中使用
测试
至此完成了所有工作,运行程序,待程序执行完毕后,打开output目录下生成的文档,看看最后效果:
项目地址:
结束语
根据这一思想,我们可以直观地我们想要的最终文件,无论这个文档多么复杂,我们只用关心占位符和最终的值。
同样,这一思想也可以应用到NPOI库来生成Word文档。
使用PdfSharp从模板生成Pdf文件