最近公司里面有一个任务,在线题卡,就是把客户在线编辑的题卡样式保存下来,然后可以导出为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输入以下命令验证
1 2
| wkhtmltopdf HTML路径 保存路径 如: wkhtmltopdf www.baidu.com d:\test.pdf
|
生成完成后会出现Done。
代码实现
JAVA代码中调用wkhtmltopdf生成PDF文件,以下为代码片段
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
|
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
1 2 3 4 5 6 7 8 9
| itext可实现 1.可以进行块的创建 2.表格的使用 3.设置页面的事件 4.字体的设置 5.图片的设置(包含水印) 6.HTML转化成PDF(支持css,javascript) 7.表单创建 8.PDF之间的操作等详细的内容可以查看网站的说明。
|
Maven配置
1 2 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>
|
代码片段
1 2 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页面。页面的顶上必须是这样的格式:
1 2
| <!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
1 2 3
| 1. java生成PDF大部分都是用itext,itext的确是java开源组件的第一选择。不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出模版不现实。 2. 并且itext中文适配不是很好和换行问题。 3. 且对HTML格式要求严格。
|
wkhtmltopdf
1 2 3
| 1. 生成PDF时会自动根据你在HTML页面中H标签生成树形目录结构。 2. 小巧方便,转换速度快。 3. 跨平台,在Liunx下用,在win下也可以用。
|
总结
综上比较,wkhtmltopdf是将HTML转为图片或是PDF最好的选择。