PDF 技术-Java 实现Html 转PDF ⽂件
html 转换为pdf 的关键技术是如何处理⽹页中复杂的css 样式、以及中⽂乱码处理。
各实现对⽐表
于Windows 平台进⾏测试: 基于IText 基于FlyingSaucer 基于WKHtmlToPdf 基于pd4ml 跨平台性跨平台跨平台跨平台
跨平台是否安装软件否否需安装WKHtmlToPdf 否是否收费免费
免费免费
收费
转换Html
速度快未测
速度慢。相⽐URL 来说,效率较慢。能忽略⼀些html 语法或资源是否存在问题。速度快。部分CSS 样式不⽀持。
效果存在样式失真问题。对html 语法有⼀定要求存在样式失真问题。对html 语法有较⾼要求。失真情况较⼩⼤部分⽹页能按Chome 浏览器显⽰的页⾯转部分CSS 样式有问题。转换
URL 效
率未测未测效率不是特别⾼
未测效
未测未测
部分⽹页由于其限制,或将出现html ⽹页不完整。未测
优点
不需安装软件、转换速度快
不需安装软件、转换速度快
⽣成PDF 质量⾼
不需要安装软件、转换速
度快
缺点
对html 标签严格,少⼀个结束标签就会报错;服务器需要安装字体
对html 标签严格,少⼀个结束标签就
会报错;服务器需要安装字体
需要安装软件、时间效率不⾼
对部分CSS 样式不⽀持。
评价
综合:使⽤WKHtmlToPdf 效果(样式)最好。但速度较慢(对于⽂件来说)。其余均有⼤⼤⼩⼩的失真问题。
分页图⽚表格链接中⽂特殊字符整体样式速度IText ⽀持⽀持⽀持⽀持⽀持⽀持失真问题快FlyingSaucer 未知未知未知未知未知未知未知快WKHtmlToPdf ⽀持⽀持⽀持⽀持⽀持⽀持很好慢pd4ml ⽀持⽀持⽀持⽀持⽀持⽀持失真问题快html ⽹页完整转换为pdf ,所有的⽅案均有不⾜。
itext 有时并不能满⾜需求,不能兼容html 的样式,且从html 页⾯导出的图⽚到pdf 中也并不好处理。
Flying Sauser 实现html2pdf ,纠错能⼒差,⽀持多种中⽂字体(部分样式不能识别),且对html 的格式也是⼗分的严格,如果⽤⼀种模版的话⽤Flying Sauser 技术倒是不错的选择,但对于不规则的html 导出pdf 就并不是那么的适⽤。
PD4ML 实现html2pdf ,速度快,纠错能⼒强可以过滤不规则的html 标记,⽀持多种中⽂字体,⽀持css 。WKHtmlToPdf 效果最好,但转换速度慢。
1. wkhtmltopdf (速度慢、需要安装软件)
技术特点:
Wkhtmltopdf 可直接把浏览器中浏览的⽹页转换成⼀个pdf ,他是⼀个把html 页⾯转换成pdf 的软件(需要安装在服务器上)。使⽤时可通过java 代码调⽤cmd 指令完成⽹页转换为pdf 的功能。
功能测试:
直接在cmd
⾥输⼊测试指令,可查看处理进度。
原理:
使⽤wkhtmltopdf ⼯具对url 或html 进⾏转换
使⽤命令:
Wkhtmltopdf  https:baidu  /usr/local/temp/baidu.pdf
安装
wkhtmltopdf 安装⽅法
1.解压wkhtmltox.tar 到某个⽂件夹$DIR
2.设置环境变量vim /etc/profile
在最后⼀⾏加 export PATH=DIR /wkhtmltox /bin :PATH 保存退出、
source /etc/profile
3.运⾏ wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory这个错,请运⾏ apt-get/yum install libXrender*
运⾏ wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory这个错,请运⾏apt-get/yum install libfontconfig*
运⾏ wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libXext.so.6: cannot open shared object file: No such file or directory这个错,请运⾏ apt-get/yum install libXext*
运⾏ wkhtmltopdf
yum arch
yum arch
yum install icu.x86_64
yum install libjpeg
yum install libpng
优点:
⽀持中⽂、图⽚、CSS等
缺点:
有时对于html⽂件的转化可能⽐较慢,对于url的转化速度较快。存在失真情况
具体实现:
Java调⽤命令。
1public class HtmlToPdf {
2
3// wkhtmltopdf在系统中的路径
4private static String toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_WINDOW;
5
6/**
7    * html转pdf
8    *
9    * @param srcPath
10    *            html路径,可以是硬盘上的路径,也可以是⽹络路径
11    * @param destPath
12    *            pdf保存路径
13    * @return转换成功返回true
14*/
15public static boolean convert(String srcPath, String destPath) {
16        File file = new File(destPath);
17        File parent = ParentFile();
18// 如果pdf保存路径不存在,则创建路径
19if (!ists()) {
20            parent.mkdirs();
21        }
22        StringBuilder cmd = new StringBuilder();
23if (Property("os.name").indexOf("Windows") == -1) {
24// ⾮windows 系统
25            toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_LINUX;
26        }
27        cmd.append(toPdfTool);
28        cmd.append(" ");
29        cmd.append(" \"");
30        cmd.append(srcPath);
31        cmd.append("\" ");
32        cmd.append(" ");
33        cmd.append(destPath);
34
35        System.out.String());
36boolean result = true;
37try {
38            Process proc = Runtime().String());
39            HtmlToPdfInterceptor error = new ErrorStream());
40            HtmlToPdfInterceptor output = new InputStream());
41            error.start();
42            output.start();
43            proc.waitFor();
44        } catch (Exception e) {java修改html文件
45            result = false;
46            e.printStackTrace();
47        }
48
49return result;
50    }
51
52public static void main(String[] args) {
53//        vert("www.baidu", "F:/pdf/baidu.pdf");
54        String filename = "JAVA将图⽚转换成pdf⽂件-CSDN博客";
55        vert("F:/pdf/"+filename+".html", "F:/pdf/"+filename+".pdf");
56//        vert("ingyuan/", "F:/pdf/"+ UUID.randomUUID().toString()+".pdf");
57//        vert("www.aliyun/jiaocheng/285649.html", "F:/pdf/baidu.pdf");
58    }
59 }
1public class HtmlToPdfInterceptor extends Thread {
2private InputStream is;
3
4public HtmlToPdfInterceptor(InputStream is){
5this.is = is;
6    }
7
8    @Override
9public void run(){
10try{
11            InputStreamReader isr = new InputStreamReader(is, "utf-8");
12            BufferedReader br = new BufferedReader(isr);
13            String line = null;
14while ((line = br.readLine()) != null) {
15                System.out.String()); //输出内容
16            }
17        }catch (IOException e){
18            e.printStackTrace();
19        }
20    }
21 }
效果:
URL转换
对于url转会遇到⼀些⽹站限制的问题。
如果转为html则效率较慢,但能很⼤程度⽐较完美地转换
⽂件转换:速度较慢,失真情况⽐较⼩
68.225s
2. PhantomJS(样式有问题,需要安装软件)
PhantomJS可做⽹页分析,功能很多,本次仅调⽤⽹页的截图功能。在cmd中的测试如下:
测试效果并没有wkhtmltopdf好。
html2pdf.js
1 var page = require('webpage').create();
2 var system = require('system');
3
4读取命令⾏参数,也就是js⽂件路径。
5if (system.args.length === 1) {
6  console.log('Usage: loadspeed.js <some URL>');
7//这⾏代码很重要。凡是结束必须调⽤。否则phantomjs不会停⽌
8  it();
9 }
10 page.settings.loadImages = true;  //加载图⽚
11 sourceTimeout = 30000;//超过10秒放弃加载
12//截图设置,
13//page.viewportSize = {
14//  width: 1000,
15//  height: 3000
16//};
17 var address = system.args[1];
18 page.open(address, function(status) {
19
20    function checkReadyState() {//等待加载完成将页⾯⽣成pdf
21        setTimeout(function () {
22            var readyState = page.evaluate(function () {
adyState;
24            });
25
26if ("complete" === readyState) {
27
28                page.paperSize = { width:'297mm',height:'500mm',orientation: 'portrait',border: '1cm' };
29                var timestamp = Date.parse(new Date());
30                var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000);
31                var outpathstr = "E:/POMFiles/HTPDF/"+pdfname+".pdf";
32                der(outpathstr);
33//der("c://test.png");
34//console.log就是传输回去的内容。
35                console.log("⽣成成功");
36                console.log("$"+outpathstr+"$");
37                it();
38
39            } else {
40                checkReadyState();
41            }
42        },1000);
43    }
44    checkReadyState();
45 });
PhantomJS对bootstap的样式⽀持较好。对css3的新特性如圆形图⽚样式⽀持⾏不好。部分页⾯样式会失效。对于echart图表展⽰,也可直接导出
3. IText(技术⽼旧,对样式不⽀持)
iText是⼀个第三⽅报表java插件,可以在后端利⽤java随意⽣成、转化pdf⽂件,提供了很多api,⽐较灵活
IText实现html2pdf,速度快,纠错能⼒差,⽀持中⽂(要求HTML使⽤unicode编码),但中⽀持⼀种中⽂字体,开源。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。