根据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)的更多相关文章

  1. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

  2. Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

    Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...

  3. 使用word模板生成pdf文件

    使用word模板生成pdf文件 源码:UserWord

  4. java根据模板生成pdf

    原文链接:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支 ...

  5. Java利用模板生成pdf并导出

    1.准备工作 (1)Adobe Acrobat pro软件:用来制作导出模板 (2)itext的jar包 2.开始制作pdf模板 (1)先用word做出模板界面 (2)文件另存为pdf格式文件 (3) ...

  6. Itextpdf + Adobe Acrobat DC填充模板生成pdf快速入门

    Itextpdf + Adobe Acrobat DC填充模板生成pdf快速入门 生成pdf有很多种方法,如通过freemarker,或 使用itextpdf.本文将使用itextpdf生成pdf 1 ...

  7. Word模板生成PDF文件目录出现“错误!未定义书签!”的解决办法

    通过程序读取Word文档模板生成PDF时,所有目录的页码全部变为“错误!未定义书签!”,后来经过仔细研究,发现是“域”的问题. 解决办法:全选(Crtl+A),按下Crtl+F11,再打印或者另存为P ...

  8. Java根据Freemarker模板生成Word文件

    1.  准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...

  9. 利用html模板生成Word文件(服务器端不需要安装Word)

    利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...

随机推荐

  1. 网络文件系统NFS

    NFS介绍 什么是NFS? NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用 ...

  2. java基础 ------- 多重循环 and break与continue

    -----  什么是多重循环 ----   打印数列 public class ForEx { public static void main(String[] args){ for(int i = ...

  3. Entity Framework - PostgresQL CodeFirst

    经过几年的更新及业界对Entity Framework 的认同. 现在 EF 可以支持的数据库越来越多了.而PostgresQL 数据库现在也可以使用code first的方式来创建数据库了. 不多说 ...

  4. ORM常用操作

    一般操作 专业官网文档 必会13条查询 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> get ...

  5. 我的java学习之旅--一些基础

    (因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...

  6. Luogu1613 跑路-倍增+Floyd

    Solution 挺有趣的一道题, 仔细想想才想出来 先用$mp[i][j][dis]$ 是否存在一条 $i$ 到 $j$ 的长度为 $2^{dis}$ 的路径. 转移 : ; dis < ba ...

  7. Python:每日一题007

    题目: 输出 9*9 乘法口诀表. 程序分析: 分行与列考虑,共9行9列,i控制行,j控制列. 个人思路及代码: 第一版: for i in range(1,10): for j in range(1 ...

  8. 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 ...

  9. Matching Networks for One Shot Learning

    1. Introduction In this work, inspired by metric learning based on deep neural features and memory a ...

  10. C#sealed和final

    sealed用于类时,该类被称为密封类,密封类不能被继承: C#提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载.对方法可以使用sealed 修饰符,这 ...