PDF功能实现1——Java实现动态页面在后台生成PDF文件

# 项目描述:

1.项目功能需求:增加证明打印功能,打印时,需将内容生成pdf文件并保存,然后数据库增加一笔打印记录
2.功能分析:由于不单单只是页面打印,所以比较常用的window.print()首先排除,按照这功能的描述,我大概列一下功能步骤(jsp页面加载信息——》后台将生成的完整页面转成PDF文件存储到服务器,并且将生成的文件路径等信息存到数据库——》文件生成成功,数据保存成功后——》前台开始执行打印操作)

3.难点分析:(1)第一个问题,如何在后台把动态页面转成PDF文件

                     (2)第二个问题,如何在前台打印后台生成的PDf文件

4.使用jar包core-renderer-R8.jar,itext-2.0.8.jar

问题1,解决:

    百度上看到很多动态页面转PDF文件的方法,不管是用itext、PD4ML还是XMLWorkerHelper等方法,反正不管哪种方法都是需要把通过URL url = new URL(url);请求页面加载完整的整个html页面,或者通过ajax把整个页面的代码传到后台处理,总之就是要得到加载完的HTML页面,然后在用各种方法去处理html页面,生成PDF文件。

    1.由于项目访问页面有登录拦截,所以直接用URL去请求页面是行不通了,所以就有两个方法,一个是使用ajax传加载完的页面代码到后台处理或者直接在后台,写HTML代码拼接字符串.

     (1)使用ajax传代码:由于我前台是jsp页面,所以整个页面传到后台,会有问题,所以我仅把需要打印内容放在一个div里面,提交时,把内容传到后台,

在后台再使用html页面所需要的样式等,进行一下拼接,这样一个完整的html页面就出来了,

但是有两个问题需要注意

1)不知道是不是我用的框架比较旧,ajax传代码到后台的时候,所有的标签的各种符号都会被转义掉,感觉其他使用这个方法的人都没有遇到,虽然网上有一些反转义的方法可以在后台转义回来,但是感觉不是很可靠,所以直接在前台使用字符串处理进行替换,后台再替换回来

2)需要注意IE的低版本里面,js进行获取HTML代码时,标签里面的一些属性的引号会自动丢失,所以代码传到后台,转PDF的时候回报错,目前没找到解决办法,但是高版本还有其他浏览器(谷歌,其他未测试)没发现问题


(2)第二个方法就是直接在后台写HTML代码拼接,就是调试会比较麻烦

2.获取到HTML代码之后,就是要转成PDF文件了,网上的例子特别多,但是由于各种情况,大部分的例子都遇到问题,最后总算找到一个 可用的,这是网上用的比较多的一直方式,那个SimSun.ttc文件要注意,弄错了,生成的pdf文件一片空白甚至就无法成功转pdf文件,之前就是自己去下载,一直没弄成功,后面看到有人直接引用系统的,试了一下,成功了,还有HTML的body的style样式里面也要去引用font-family:SimSun,这样语言包才会生效

//创建PDf文件
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();

//C:/WINDOWS/Fonts/SimSun.ttc 系统自带的语言包,直接引用
fontResolver.addFont("C:/WINDOWS/Fonts/SimSun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont("C:/WINDOWS/Fonts/Arial.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 宋体字

//wholePath生成的路径+文件名(C:/test/iTextPDF.pdf)
OutputStream os = new FileOutputStream(wholePath);
String htmlstr = html;//HTML代码字符串

//使用有setDocumentFromString()方法的jar包,不要用//使用有setDocument()方法代替,会出错
renderer.setDocumentFromString(printHtml);
renderer.layout();
renderer.createPDF(os);

参考文档:https://blog.csdn.net/ck457897564/article/details/78429182

https://blog.csdn.net/huxiangen/article/details/80626122

。。。。。。。。。。。。。。。。。。。。。。很多很多的参考

 

                   
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值