网上找了好多资料,发现有些问题根本就没有指出来,对于第一次接触的人来说,处理起来比较吃力。现在我把一些自己遇到的问题在本文中提出来。
一、PD4ML
官网:http://pd4ml.com/downloads.htm
jar包:pd4ml.jar、ss_css2.jar
package pd4ml;
import java.awt.Insets;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.InvalidParameterException;
import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;
public class pd4ml{
protected int topValue = 0;
protected int leftValue = 0;
protected int rightValue = 0;
protected int bottomValue = 0;
protected int userSpaceWidth = 1300;
public static void main(String[] args) {
try {
pd4ml pdf = new pd4ml();
String path = "D:/test/Level up.html";
pdf.doConversion("file:///"+path, "D:/test/pd4ml.pdf");
} catch (Exception e) {
e.printStackTrace();
}
}
public void doConversion( String url, String outputPath )
throws InvalidParameterException, MalformedURLException, IOException {
File output = new File(outputPath);
java.io.FileOutputStream fos = new java.io.FileOutputStream(output);
PD4ML pd4ml = new PD4ML();
//页面高度
pd4ml.setHtmlWidth(userSpaceWidth);
//PDF纸张类型A4
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
//PDF上下左右大小
pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));
pd4ml.addStyle("BODY {margin: 0}", true);
//控制台输出信息
pd4ml.enableDebugInfo();
//获取计算机字体格式
pd4ml.useTTF("c:/windows/fonts", true);
//从URL到文件的实际文档转换
pd4ml.render(new URL(url), fos);
fos.close();
System.out.println( outputPath + "\ndone." );
}
}
问题1:
pdf.doConversion("file:///"+path, "D:/test/pd4ml.pdf");
如果你想要转换的是本地的html,那么就需要在前面加入file:///,为什么要3个斜杠呢?主要是为了转义。
问题2:
有些样式不能显示,比如:颜色。
二、wkhtmltopdf
官网下载:https://wkhtmltopdf.org/downloads.html
jar:无
package webTest.pd4ml;
import java.io.File;
public class HtmlToPdf {
//官网下载地址:https://wkhtmltopdf.org/downloads.html
//获取执行下载好的.exe保存在服务器地址
private static final String toPdfTool = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe";
/**
* html转pdf
* @param srcPath html路径,可以是硬盘上的路径(file:///),也可以是网络路径
* @param destPath pdf保存路径
* @return 转换成功返回true
*/
public static 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();
cmd.append(toPdfTool);
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;
}
public static void main(String[] args){
HtmlToPdf pdf = new HtmlToPdf();
pdf.convert("file:///D:/test/Levelup.html", "D:/test/Levelup.pdf");
}
}
package webTest.pd4ml;
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:
wkhtmltopdf.exe这个文件下载安装后才会出现,下载地址上面有写。按照自己的电脑下载即可。下载完成后名字不是wkhtmltopdf.exe这个需要注意。之后运行这个下载好的exe
安装成功后,找到自己的安装路径里面的bin文件下的wkhtmltopdf.exe。我的路径是C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe
问题2:复制自己的文件路径时,记得修改斜杠,下面代码这样即可
private static final String toPdfTool = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe";
问题3:如果是本地的html,需要加入file:///
pdf.convert("file:///D:/test/Levelup.html", "D:/test/Levelup.pdf");
jar包下载地址:http://download.youkuaiyun.com/download/k905904/10024472