• 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:softwarewkhtmltopdf

    首先测试一下:

    [转载请注明原文出处]:http://www.cnblogs.com/jstarseven/p/7251711.html,这么多字,博主码的也挺累的,谢谢合作。

    进入cmd,cd E:softwarewkhtmltopdfin

    执行wkhtmltopdf.exe http://www.jstarseven.com/  E:datapdfjstarseven.pdf

    打开E:datapdfjstarseven.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 }
    View Code

    效果测试图:

    最后达成的效果,其实就和采用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:Windowsfontssimsun.ttc拷贝到linux服务器/usr/share/fonts/目录下,再次生成pdf中文显示正常

     -END-

  • 相关阅读:
    普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用
    z
    EF架构~XMLRepository仓储的实现~续(XAttribute方式)
    缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
    爱上MVC系列~带扩展名的路由失效问题
    开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
    缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续
    一分钟对我们的重要意义
    VS2010添加默认路径,库以及Lib
    Android中振动器(Vibrator)的使用
  • 原文地址:https://www.cnblogs.com/jstarseven/p/7251711.html
Copyright © 2020-2023  润新知