官网地址: https://wkhtmltopdf.org/downloads.html
直接下载对应版本即可
linux 安装命令
yum install xorg-x11-fonts-75dpi.noarch
yum install xorg-x11-fonts-Type1.noarch
yum install icu.x86_64
yum install libjpeg
yum install libpng
yum install libXrender
yum install libXext
rpm -ivh /opt/wkhtmltox-0.12.5-1.centos7.x86_64.rpm
linux需要额外安装的插件
yum install xorg-x11-fonts-75dpi.noarch
yum install xorg-x11-fonts-Type1.noarch
yum install icu.x86_64
yum install libjpeg
yum install libpng
yum install libXrender
yum install libXext
linux 默认会安装到 /usr/local/bin/wkhtmltopdf
安装完成后默认还有个 wkhtmltopng的工具
linux 测试命令
wkhtmltopdf ‘html文件地址或者网址’ '生成文件保存地址'
windows 测试命令
- cmd 切换到安装目录下
- wkhtmltopdf.exe ‘html文件地址或者网址’ ‘生成文件保存地址’
不得不说 效果相当的惊艳,样式比某些浏览器的打印功能都好
下面直接上硬货
package com.itender.ms.util;
import com.itender.ms.config.WkhtmltopdfConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
/**
* @author ah
* @date 2019/5/14 16:15
*/
@Component
public class HtmlToPdf {
private Logger logger = LoggerFactory.getLogger(HtmlToPdf.class);
// wkhtmltopdf在系统中的路径
private String toPdfTool ="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
@Autowired
private WkhtmltopdfConfig config;
/**
* html转pdf
*
* @param srcPath
* html路径,可以是硬盘上的路径,也可以是网络路径
* @param destPath
* pdf保存路径
* @return 转换成功返回true
*/
public boolean convert(String srcPath, String destPath) {
File file = new File(destPath);
File parent = file.getParentFile();
// 如果pdf保存路径不存在,则创建路径
if (!parent.exists()) {
parent.mkdirs();
}
StringBuilder cmd = new StringBuilder();
if (System.getProperty("os.name").indexOf("Windows") == -1) {
cmd.append(config.getPath());//.exe文件路径
}else {
cmd.append(toPdfTool);
}
cmd.append(" ");
//cmd.append(" \"");
cmd.append(srcPath);
// cmd.append("\" ");
cmd.append(" ");
cmd.append(destPath);
//logger.info(cmd.toString());
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;
}
public static void main(String[] args) {
// HtmlToPdf.convert("C:\\Users\\dell\\Desktop\\aaa.html", "D:\\11111111.pdf");
}
}
package com.itender.ms.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author ah
* @date 2019/5/14 16:25
*/
public class HtmlToPdfInterceptor extends Thread {
private InputStream is;
public HtmlToPdfInterceptor(InputStream is){
this.is = is;
}
@Override
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.out.println(line.toString()); //输出内容
}
}catch (IOException e){
e.printStackTrace();
}
}
}
注意:html文件一定要注明编码,不然会乱码 如
<meta http-equiv=“Content-Type” content=“text/html;charset=utf-8” ></meta>
表格分页问题
需要添加样式 :
能够在最大程度上处理分页时表格问题,但如果一个单元格内容整页都无法放下时同样会出现分页后没有边框问题
/* 样式具体加在哪需要更具实际情况来,有的表格可能是用div而不是table做的 */
ttable, tr, td, th, tbody, thead {
tpage-break-inside: avoid !important;
}
java:
org.jsoup.nodes.Document documentHtml = Jsoup.parse(html);
documentHtml.head().append("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" ></meta>");//后台处理乱码
documentHtml.head().after("<style type=\"text/css\">\n" +
"\ttable, tr, td, th, tbody, thead {\n" +
"\tpage-break-inside: avoid !important;\n" +
"\n" +
"\t}\n" +
"\t</style>");//处理表格分页