一切福田,不離方寸,從心而覓,感無不通。

通过freemarker与itext实现html转pdf

因果

因一些合同、发票等单据需要生成pdf文档,并且审核通过后需给该pdf文档盖章,所以需要生成pdf的解决方案。

实践中遇到的问题

  1. 其实单独使用itext也可以实现pdf的生成,但通过文本域进行实现数据的动态替换存在局限性,如动态表格就不能友好的进行动态生成,生成了也是个绝对定位,假如文档后面还存在其它内容就会出现文本重合问题。

单独通过itext实现生成pdf遇到的动态表格问题
2.参考文章https://blog.csdn.net/u014331138/article/details/108361728生成的pdf文档,中文不显示,这个问题我找了很多文档,很多方法,最后只有微软雅黑'Microsoft YaHei'才生效;因需求必须用宋体'SimSum',所以只能另找方法解决;

生成的pdf文档中文不显示问题
经过一系列的bug与困难,最后终于通过freemarker+html2pdf+font-asian实现了pdf文档的生成,也满足了业务的需求,让我们继续往下看吧。

成功结果

思路

itext通过文本域进行替换值的局限性,所以通过freemarker进行值的替换。

  1. 设计好ftl模板,然后通过freemarker进行数据的写入,生成一个替换好值的html文档,并保存到指定位置;
  2. 再通过读取已经写好数据的html文档进行转换成pdf;
  3. 没了;

实现

  1. 准备工作 – 模版设计,先设计html模板,通过[freemarker](http://freemarker.foofun.cn/ref_directives.html)的指令语法进行配置,配置好后将html改为ftl模板(与el表达式类似),在resources目录下建一个templates将你所设计的ftl模板放入进去;

freemarker模板

  1. 准备工作 – 语言存放,在resources目录下建一个fonts将你所需的字体放入进去;

freemarker模板

  1. 引入依赖

 

  1. 水印

 

  1. 页码

 

  1. FreeMarkerUtils工具类
    用来填充ftl的数据并生成html文件;

 

  1. HtmlToPdfUtils工具类
    用于将已经填充好数据的html文件转换成pdf文档;

 

  1. 测试

 

结果

执行

生成的html

from:https://www.cnblogs.com/lin02/p/itext.html