最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果,
需要自己调整好多东西,样式,字体等等,好麻烦,毕竟博主这么懒的人,哈哈。-------jstarseven
言归正传:
java生成pdf文件,方式很多,以上提到的哪几种方式具体可以参考这篇文章<讲解很详细>:http://blog.csdn.net/ouyhong123/article/details/26401967
本文说一下博主认为比较好用一个工具:wkhtmltopdf
wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档,好用还方便,至少我的pdf没有超级复杂,哈哈
下载地址:https://wkhtmltopdf.org/downloads.html
下载之后安装一下,博主的安装目录:E:\software\wkhtmltopdf
首先测试一下:
[转载请注明原文出处]:http://www.cnblogs.com/jstarseven/p/7251711.html,这么多字,博主码的也挺累的,谢谢合作。
进入cmd,cd E:\software\wkhtmltopdf\bin
执行wkhtmltopdf.exe http://www.jstarseven.com/ E:\data\pdf\jstarseven.pdf
打开E:\data\pdf\jstarseven.pdf 看一下效果还可以,至少没有很麻烦。
然后就是写个小程序,封装一下,调一下dos命令就可以了。
博主的思路是:事先准备好一个需要生成pdf的html模板,数据全用占位符占位,等到需要生成pdf的时候,首先向文件里面写入数据,然后调用wkhtmltopdf生成pdf文件。
文件那部分就不说了,直接看pdf这部分吧,代码很简单。
代码: HtmlToPdf.java
1 package com.server.wkhtmltopdf;
2
3 import java.io.*;
4
5 /**
6 * Created by jstarseven on 2017/7/25.
7 */
8 public class HtmlToPdf {
9 //wkhtmltopdf在系统中的路径
10 private static final String toPdfTool = "D:\\software-dev\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
11
12 /**
13 * html转pdf
14 *
15 * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径
16 * @param destPath pdf保存路径
17 * @return 转换成功返回true
18 */
19 public static boolean convert(String srcPath, String destPath) {
20 File file = new File(destPath);
21 File parent = file.getParentFile();
22 //如果pdf保存路径不存在,则创建路径
23 if (!parent.exists())
24 parent.mkdirs();
25 StringBuilder cmd = new StringBuilder();
26 cmd.append(toPdfTool);
27 cmd.append(" ");
28 cmd.append(srcPath);
29 cmd.append(" ");
30 cmd.append(destPath);
31
32 boolean result = true;
33 try {
34 Process proc = Runtime.getRuntime().exec(cmd.toString());
35 HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
36 HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
37 error.start();
38 output.start();
39 proc.waitFor();
40 } catch (Exception e) {
41 result = false;
42 e.printStackTrace();
43 }
44
45 return result;
46 }
47
48 public static void main(String[] args) {
49 convert("http://www.jstarseven.com/", "E:\\data\\pdf\\jstarseven.pdf");
50 }
51 }
52
53 class HtmlToPdfInterceptor extends Thread {
54 private InputStream is;
55
56 public HtmlToPdfInterceptor(InputStream is) {
57 this.is = is;
58 }
59
60 public void run() {
61 try {
62 InputStreamReader isr = new InputStreamReader(is, "utf-8");
63 BufferedReader br = new BufferedReader(isr);
64 String line;
65 while ((line = br.readLine()) != null) {
66 System.out.println(line); //输出内容
67 }
68 } catch (IOException e) {
69 e.printStackTrace();
70 }
71 }
72 }
效果测试图:
最后达成的效果,其实就和采用phantomjs截了图差不多,个人感觉还不错,不知道会不会有其他的问题,尚待发现。。。
[转载请注明原文出处]:http://www.cnblogs.com/jstarseven/p/7251711.html,这么多字,博主码的也挺累的,谢谢合作。
注意事项:
执行./wkhtmltoimage 出现如下错误:
./wkhtmltoimage: error while loading shared libraries: libXext.so.6: cannot open shared object file
安装:
yum -y install libXrender*
yum -y install libXext*
yum -y install libX11*
yum -y install freetype*
yum -y install fontconfig*
yum -y install zlib*
使用:./wkhtmltopdf html_path pdf_path
中文乱码或者空白解决方法(如果wkhtmltopdf中文显示空白或者乱码方框):
打开windows c:\Windows\fonts\simsun.ttc拷贝到linux服务器/usr/share/fonts/目录下,再次生成pdf中文显示正常
-END-