专栏首页大道七哥java调用wkhtmltopdf生成pdf文件,美观,省事

java调用wkhtmltopdf生成pdf文件,美观,省事

最近项目需要导出企业风险报告,文件格式为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-

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tampermonkey,采用js解析自定义脚本,实现网页列表数据采集分析

    最近一直在做数据采集的事情,目的是使用java开发一套分析指定采集规则,模拟用户动作做数据提取。 因此定义了一套动作脚本,open,click,get,list...

    大道七哥
  • Hibernate缓存配置

    一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveo...

    大道七哥
  • Hadoop(十三)分析MapReduce程序

      刚才发生了悲伤的一幕,本来这篇博客马上就要写好的,花了我一晚上的时间。但是刚才电脑没有插电源就没有了。很难受!想哭,但是没有办法继续站起来。

    大道七哥
  • SpringBoot入门建站全系列(十二)Spring Security使用token做认证

    Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决...

    品茗IT
  • Spring Boot & ES 实战,值得参考!

    Spring Boot 2.0.5默认的elasticsearch版本很低,这里我们用最新版本6.4.1

    Java技术栈
  • 如果伦敦地铁图是数据科学家画的……

    伦敦的地铁路线图图可谓是地铁路线图的鼻祖。多年来,它形成的配色与排版方案,造就了它独特的外观和风格,但最令人惊叹的,还是其神来之笔的设计思路。

    大数据文摘
  • [日常] Go语言圣经--复合数据类型,数组习题

    3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结构体则是由异构的元素组成的

    陶士涵
  • 中文编码问题详解

    ASCII,ISO-8859-1,GB2312,GNBK,UTF-8,UTF-16等

    匠心Java
  • 最受欢迎开源深度学习框架榜单:这个排名让人想起~~

    Keras作者Fran?ois Chollet刚刚在Twitter贴出一张图片,是近三个月来arXiv上提到的深度学习开源框架排行: ? TensorFlow排...

    机器人网
  • Python爬虫从入门到放弃(十八)之 Scrapy爬取所有知乎用户信息(上)

    爬取的思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关...

    coders

扫码关注云+社区

领取腾讯云代金券