最近公司里面有一个任务,在线题卡,就是把客户在线编辑的题卡样式保存下来,然后可以导出为PDF格式。于是上网找了一系列的资料,找到了以下两种方法:
- 使用wkhtmltox
- 使用iText+Flying Saucer
但是还是强烈推荐用第一种方法。
使用wkhtmltox(推荐)
wkhtmltox实现网页转换成图片或PDF
命令实现
- 进入wkhtmltox官网软件下载  :https://wkhtmltopdf.org/downloads.html
- 安装完成后进入${home}/bin目录下有两个exe文件,通过名称就可以辨别wkhtmltoimage.exe是将HTML转化为image,wkhtmltopdf.exe是将HTML转化为PDF文件,这正是我们想要的。

- 进入${home}/bin目录下打开cmd输入以下命令验证 
| 12
 
 | wkhtmltopdf HTML路径 保存路径如: wkhtmltopdf www.baidu.com d:\test.pdf
 
 | 

生成完成后会出现Done。
代码实现
JAVA代码中调用wkhtmltopdf生成PDF文件,以下为代码片段
| 12
 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
 
 | 
 
 
 public class HtmlToPDF {
 
 public static final String toPdfTool = "E:\\SmallTools\\wkhtmltox\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
 
 public static final String srcPath = "http://www.jianshu.com/p/4d65857ffe5e";
 
 public static void main(String[] args) throws Exception{
 
 String pageSize = "A4";
 
 String destPath = "E:\\PDF生成教程及讲解.pdf";
 convert(pageSize, destPath);
 }
 
 public static void convert(String pageSize, 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();
 }
 }
 }
 
 | 
详细参数说明可参考:http://www.jianshu.com/p/4d65857ffe5e
使用iText+Flying Saucer
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | itext可实现 1.可以进行块的创建
 2.表格的使用
 3.设置页面的事件
 4.字体的设置
 5.图片的设置(包含水印)
 6.HTML转化成PDF(支持css,javascript)
 7.表单创建
 8.PDF之间的操作等详细的内容可以查看网站的说明。
 
 | 
Maven配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <dependency><groupId>com.itextpdf</groupId>
 <artifactId>itextpdf</artifactId>
 <version>5.8.8</version>
 </dependency>
 <dependency>
 <groupId>org.xhtmlrenderer</groupId>
 <artifactId>flying-saucer-pdf</artifactId>
 <version>9.1.6</version>
 </dependency>
 
 | 
代码片段
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | 
 
 public class HtmlToPDF {
 public static void main(String[] args) throws Exception{
 
 Document document = new Document(PageSize.A4.rotate());
 
 ITextRenderer renderer = new ITextRenderer();
 ITextFontResolver fontResolver = renderer.getFontResolver();
 fontResolver.addFont("D:/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
 
 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\\pdf.pdf"));
 
 document.open();
 
 XMLWorkerHelper.getInstance().parseXHtml(writer, document,
 new FileInputStream("D:/a.html"));
 
 document.close();
 System.out.println( "PDF Created!" );
 }
 }
 
 | 
注意事项
- .输入的HTML页面必须是标准的XHTML页面。页面的顶上必须是这样的格式: | 12
 
 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">
 
 |  
 
- 生成PDF,添加生成PDF所使用的字符集.注:这里字符集要和模板中使用的字符集一一致。 比如:java中使用宋体 renderer.getFontResolver().addFont(“C:/Windows/Fonts/simsun.ttc”, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 那么HTML的body中样式必须加上 style=’font-family:SimSun’,要是使用其他字符生成pdf时候,中文就会不显示生成PDF
- 设置PDF的页面大小模板页面中添加该样式:@page { size: 8.5in 11in; }这时候生成PDF页面正好是A4纸大小
- 所需的jar包,下载点我。核心jar是修改后的
比较和总结
比较
itext
| 12
 3
 
 | 1. java生成PDF大部分都是用itext,itext的确是java开源组件的第一选择。不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出模版不现实。2. 并且itext中文适配不是很好和换行问题。
 3. 且对HTML格式要求严格。
 
 | 
wkhtmltopdf
| 12
 3
 
 | 1. 生成PDF时会自动根据你在HTML页面中H标签生成树形目录结构。2. 小巧方便,转换速度快。
 3. 跨平台,在Liunx下用,在win下也可以用。
 
 | 
总结
    综上比较,wkhtmltopdf是将HTML转为图片或是PDF最好的选择。