java wkhtmltoimage linux,wkhtmltopdf-实现Html转pdf

一、什么是wkhtmltopdf?

wkhtmltopdf和wkhtmltoimage是开源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎将HTML呈现为PDF和各种图像格式。

一、如何安装和使用wkhtmltopdf?

(一)下载

java wkhtmltoimage linux,wkhtmltopdf-实现Html转pdf_第1张图片

(二)window安装和使用示例

1、window安装  (示例使用系统版本:window10)

这里下载最新版本 wkhtmltox-0.12.5-1.msvc2015-win64.exe 安装

2、使用 进入到文件安装bin目录下,打开cmd命令行窗口,输入以下内容

java wkhtmltoimage linux,wkhtmltopdf-实现Html转pdf_第2张图片

3、查看文件,这里虽然将百度首页转换成功,但并没有完全展示百度首页,具体情况还需探索

java wkhtmltoimage linux,wkhtmltopdf-实现Html转pdf_第3张图片

4、在 java 中使用代码实现转换

public class HtmlToPDF {

//wkhtmltopdf安装路径

public static final String toPdfTool = "D:/wkhtmltopdf/bin/wkhtmltopdf.exe";

public static void convert(String pageSize,String srcPath, String destPath){

File file = new File(destPath);

File parent = file.getParentFile();

if (!parent.exists()){

parent.mkdirs();

}

StringBuilder cmd = new StringBuilder();

cmd.append(toPdfTool).append(" ");

cmd.append("--page-size ");

cmd.append(pageSize).append(" ");

cmd.append(srcPath).append(" ");

cmd.append(destPath);

try {

Runtime.getRuntime().exec(cmd.toString());

}catch (IOException e){

e.printStackTrace();

}

}

public static void main(String[] args) throws Exception{

//设置纸张大小: A4, Letter, etc.

String pageSize = "A4";

//需要生成PDF的URL,这样也可以是页面的本地地址

String srcPath = "http://www.baidu.com";

//String srcPath = "D:/index.html";

//生成后存放路径

String destPath = "D:/wkhtmltopdf/bin/baidu.pdf";

convert(pageSize, srcPath, destPath);

}

}

(二)Linux安装和使用示例

1、Linux 安装 (示例使用系统版本:CentOS7)

这里下载 wkhtmltox-0.12.5-1.centos7.x86_64.rpm 最新版本

2、将rpm包上传至服务器,将包移动到opt目录下

[root@localhost ~]# mv wkhtmltox-0.12.5-1.centos7.x86_64.rpm /opt/

3、安装

注意:安装过程中可能会出现openssl版本过低安装失败问题,只需安装或升级openssl即可

#安装

[root@localhost opt]# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm

错误:依赖检测失败:

xorg-x11-fonts-75dpi 被 wkhtmltox-1:0.12.5-1.centos7.x86_64 需要

#安装需要的依赖

[root@localhost opt]# yum install xorg-x11-fonts-75dpi

#安装完成继续执行上一条命令

[root@localhost opt]# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm

准备中... ################################# [100%]

正在升级/安装...

1:wkhtmltox-1:0.12.5-1.centos7 ################################# [100%]

#安装完成

4、测试

[root@localhost opt]# wkhtmltopdf http://www.baidu.com /home/baidu.pdf

Loading pages (1/6)

Counting pages (2/6)

Resolving links (4/6)

Loading headers and footers (5/6)

Printing pages (6/6)

Done

5、查看

[root@localhost home]# ll

总用量 32

-rw-r--r--. 1 root root 26739 12月 27 12:04 baidu.pdf

6、在Linux 环境下使用 java 代码实现

linux 环境下,只需要将安装路径替换windows的软件安装路径,请求参数根据实际文件或地址路径填写即可,这里还可以将安装路径配置在配置文件里方便维护,下面代码可以作为一个工具类对外提供服务。

public class HtmlToPDFUtils {

//wkhtmltopdf Linux安装路径

public static final String toPdfTool = "/usr/local/bin/wkhtmltopdf";

/**

* html转pdf

* @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径

* @param destPath pdf保存路径

* @return 转换成功返回true

*/

public static boolean convert(String pageSize, String srcPath, String destPath){

File file = new File(destPath);

File parent = file.getParentFile();

//如果pdf保存路径不存在,则创建路径

if(!parent.exists()){

parent.mkdirs();

}

StringBuilder cmd = new StringBuilder();

cmd.append(toPdfTool);

cmd.append(" ");

cmd.append("--page-size ");

cmd.append(pageSize);

cmd.append(" ");

cmd.append(srcPath);

cmd.append(" ");

cmd.append(destPath);

boolean result = true;

try{

Process proc = Runtime.getRuntime().exec(cmd.toString());

HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());

HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());

error.start();

output.start();

proc.waitFor();

}catch(Exception e){

result = false;

e.printStackTrace();

}

return result;

}

}

接收Process的输入和错误信息时,需要创建另外的线程,否则当前线程会一直等待

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

/**

* 当java调用wkhtmltopdf时,用于获取wkhtmltopdf返回的内容

*/

public class HtmlToPdfInterceptor extends Thread {

private InputStream is;

public HtmlToPdfInterceptor(InputStream is){

this.is = is;

}

public void run(){

try{

InputStreamReader isr = new InputStreamReader(is, "utf-8");

BufferedReader br = new BufferedReader(isr);

String line = null;

while ((line = br.readLine()) != null) {

System.outlprintln(line.toString()); //输出内容

}

}catch (IOException e){

e.printStackTrace();

}

}

}

你可能感兴趣的:(java,wkhtmltoimage,linux)