java完成HTML转PDF wkhtmltopdf
为什么使用wkhtmltopdf
HTML转PDF的实现方式有很多,但是转换出来的PDF的质量又好有坏。之前试过IText和一些其他的工具,但是不是格式乱了就是由于标签书写不规范(没有结尾标签)导致转换出来的效果都不太满意,最后发现wkhtmltopdf转换格式什么基本没有问题而且使用也是比较简单就使用wkhtmltopdf。
第一步 下载安装
官网地址:https://wkhtmltopdf.org/downloads.html
根据自己的系统来选择安装包。
第二步 配置环境变量
安装完成之后找到安装路径,将其配置到环境变量中,方便使用。
配置完成环境变量之后就可以测试一下了。
看看转换效果。
可以看到转换效果是非常不错的。
第三步 代码调用wkhtmltopdf进行转换
辅助代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package fangrong.com.cn.common.utils;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;
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.out.println(line.toString()); } } catch (IOException e) { e.printStackTrace(); } } }
|
转换代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| package fangrong.com.cn.common.utils;
import java.io.File;
public class HtmlToPdf {
public static boolean convert(String srcPath, File file) {
File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } StringBuilder cmd = new StringBuilder(); String toPdfTool; if (System.getProperty("os.name").indexOf("Windows") == -1) { toPdfTool = "/usr/local/bin/wkhtmltopdf"; } else { toPdfTool = "D:/htmlTopdf/wkhtmltopdf/bin/wkhtmltopdf.exe"; } cmd.append(toPdfTool); cmd.append(" "); cmd.append(srcPath); cmd.append(" "); cmd.append(file.getAbsolutePath());
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; } }
|
到此集成完成。
使用过程中碰到的的一些坑
这些坑主要是出现在Linux环境下的
一般乱码的主要原因就是因为Linux中没有simsun的字体,将C:\Windows\Fonts中的simsun.ttc拷贝到linux服务器/usr/share/fonts/目录下,下次再生成pdf就正常了
- Docker容器中的java程序无法调用到Linux本地的wkhtmltopdf脚本
需要将本地的文件挂载映射到dockers容器当中