根据PDF模板生成PDF文件(基于iTextSharp)
根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成。场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议。原理很简单,但是每个技术人员解决问题的思路不太一样。也有朋友直接通过Canvas来实现,过程是把内容排版好,然后生成图片,然后根据图片生成PDF文件,这种方式有个问题,如果要是要求兼容移动端的话,在移动设备上排版出来的效果肯定不太一样,导致最终生成的电子协议和期望的相差太大。下面我们就利用PDF中的表单元素,来完成PDF内容的替换。
过程是这样的!
我这边收到一份word版的文档,首先,我们将其另存为PDF文件。
其次,在https://www.pdfescape.com/open/这个网站,将PDF文件上传上去,进行在线编辑。

也可以通过PDF软件工具,进行编辑。这里,我把需要填写部分的内容,全画上表单元素,设置元素的name,后面根据name 属性对其进行赋值。具体操作,将text放置指定处,然后鼠标右键,看到如下界面:

这里Name属性就是后面我们要用到的。目前它支持的元素有:

下面,我们新建一个控制台程序,通过nuget获取itextSharp。
控制台代码如下:
/// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
string tempFilePath = "D:\\a.tmp.pdf";
iTextSharp.text.pdf.PdfDocument document = new iTextSharp.text.pdf.PdfDocument(); iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"D:\d.pdf");
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(tempFilePath, FileMode.OpenOrCreate));
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfStamper.FormFlattening = true; //BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); //添加图片
//Image image = Image.GetInstance("");
//pdfStamper.Writer.Add(image); pdfFormFields.AddSubstitutionFont(simheiBase);
pdfStamper.AcroFields.SetField("Names", "李朝强");
pdfStamper.AcroFields.SetField("chk", "yes", true);
pdfStamper.Close();
pdfReader.Close(); ////解析文本
//PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader); //PdfWriter pdfWriter; //ITextExtractionStrategy strategy;
//strategy = parser.ProcessContent<SimpleTextExtractionStrategy>(1, new SimpleTextExtractionStrategy());
//string ss = strategy.GetResultantText(); //byte[] buffer = pdfReader.GetPageContent(1); //string strBody = System.Text.Encoding.Default.GetString(buffer);
}
上面代码,根据D盘的d.pdf模板,来生成最终的PDF文件。这里通过给AcroFields中的字段赋值,来达到替换内容的目的。
上面还有一种复选框(checkbox)的内容,pdf也支持,这里直接给其赋值yes或no,来控制是否选中。
最后一步就是将生成的PDF进行展示了。这里借助于pdf.js(微信也支持)。看看效果吧!

看看手机微信效果吧!

根据PDF模板生成PDF文件(基于iTextSharp)的更多相关文章
- Android根据pdf模板生成pdf文件
我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar iTextAsian.jar ,怎样jar包导入工程 ...
- Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...
- 使用word模板生成pdf文件
使用word模板生成pdf文件 源码:UserWord
- java根据模板生成pdf
原文链接:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支 ...
- Java利用模板生成pdf并导出
1.准备工作 (1)Adobe Acrobat pro软件:用来制作导出模板 (2)itext的jar包 2.开始制作pdf模板 (1)先用word做出模板界面 (2)文件另存为pdf格式文件 (3) ...
- Itextpdf + Adobe Acrobat DC填充模板生成pdf快速入门
Itextpdf + Adobe Acrobat DC填充模板生成pdf快速入门 生成pdf有很多种方法,如通过freemarker,或 使用itextpdf.本文将使用itextpdf生成pdf 1 ...
- Word模板生成PDF文件目录出现“错误!未定义书签!”的解决办法
通过程序读取Word文档模板生成PDF时,所有目录的页码全部变为“错误!未定义书签!”,后来经过仔细研究,发现是“域”的问题. 解决办法:全选(Crtl+A),按下Crtl+F11,再打印或者另存为P ...
- Java根据Freemarker模板生成Word文件
1. 准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...
- 利用html模板生成Word文件(服务器端不需要安装Word)
利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...
随机推荐
- 网络文件系统NFS
NFS介绍 什么是NFS? NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用 ...
- java基础 ------- 多重循环 and break与continue
----- 什么是多重循环 ---- 打印数列 public class ForEx { public static void main(String[] args){ for(int i = ...
- Entity Framework - PostgresQL CodeFirst
经过几年的更新及业界对Entity Framework 的认同. 现在 EF 可以支持的数据库越来越多了.而PostgresQL 数据库现在也可以使用code first的方式来创建数据库了. 不多说 ...
- ORM常用操作
一般操作 专业官网文档 必会13条查询 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> get ...
- 我的java学习之旅--一些基础
(因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...
- Luogu1613 跑路-倍增+Floyd
Solution 挺有趣的一道题, 仔细想想才想出来 先用$mp[i][j][dis]$ 是否存在一条 $i$ 到 $j$ 的长度为 $2^{dis}$ 的路径. 转移 : ; dis < ba ...
- Python:每日一题007
题目: 输出 9*9 乘法口诀表. 程序分析: 分行与列考虑,共9行9列,i控制行,j控制列. 个人思路及代码: 第一版: for i in range(1,10): for j in range(1 ...
- Available Captures for Rook LT999
On an 8 x 8 chessboard, there is one white rook. There also may be empty squares, white bishops, an ...
- Matching Networks for One Shot Learning
1. Introduction In this work, inspired by metric learning based on deep neural features and memory a ...
- C#sealed和final
sealed用于类时,该类被称为密封类,密封类不能被继承: C#提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载.对方法可以使用sealed 修饰符,这 ...