在实际也无需求中,需要用到网页快照功能,并能够查看历史网页快照功能,因此需要实现网页格式的固化保存,保存为图片或PDF文件的形式。

1. 技术研究

  做这样研究了网上许多技术,大都存在各种各样的缺陷。

1.1. html2canvas&jsPDF

  感兴趣的读者,可以参考: https://github.com/linwalker/render-html-to-pdf
  该种方法,主要是通过JS调用实现,无法通过脚本,或者Java API的方法调用来实现转化工作。

1.2. iTextRender&pdfWriter

  这种方式能够实现简单的Html2PDF功能,但存在以下缺点

  1. 对网页格式要求较高;
  2. 无法对图片等复杂元素进行处理。
    主要参考博文:
    Itext的PDF生成方案
    freemarker+ITextRenderer 生成html转pdf
    iTextRenderer(Flying Saucer) HTML转PDF

1.3. pdf-kit

  pdf-kit主要通过JS生成PDF文件,在HTML截图方面比较欠缺,作者没有发现能够用于截图功能。
PDF-KIT官网

1.4. cssbox

  cssbox主要用作前段css渲染功能,但没有提供输出为图片或PDF接口。
CSSBOX源码文件与说明

1.5. Phantomjs

  爬虫或自动化测试重量级程序,能够实现爬虫功能与自动化测试任务。并能够使用代理服务器,或输出HTML为图片或DPF文件的形式。能够输出单个网页控件的图片或DPF文件,实现精准输出。

  但Phantomjs存在如下问题:

  1. 相应速度较慢;
  2. 调用繁琐,需要自己写JS脚本。

1.6. Headless Chrome or other browser

  使用无头浏览器,调用snapshot接口,能够实现截图功能。

1.7. HtmlUnitDriver调用浏览器API

使用HtmlUnitDriver调用浏览器API,如Chrome、Firefox、IE等主浏览器,均能实现截图功能。

缺点:

  1. 需要编写程序,调用API;
  2. 无法直接调用脚本实现截图功能。

2. wkhtmltopdf

  该程序能够实现将Html转化为图片,或PDF文件的功能,具体下载地址为:wkhtmltopdf官网下载

2.1. 安装流程

## Download from Org website
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz

## uncompress
 tar xvJf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz

## install font : chinese : 宋体
## /usr/share/fonts/XXX

  安装中文字体,主要是考虑到网页内容为中文会出现中文乱码问题。

2.2. 调用

## to pdf
wkhtmltopdf http://www.baidu.com ~/baidu.pdf

## to image
wkhtmltopdf http://www.baidu.com ~/baidu.png

具体详情,可以参考wkhtml2pdf的帮助信息。

2.3. 选择原因

  1. 可以通过shell直接调用;
  2. 支持多线程并发操作;
  3. 调用简单、方便。

2.4. 存在缺点

  1. 存在TimeoutError;
  2. 偶尔存在加载阻塞,无法正常加载网页内容。这些网页通常是信息量较大、存在高清图片等问题。

3. 总结

  1. 如果需要HTML全文转化,那么wkHtml2PDF可以作为首要选项;
  2. 如果需要获取HTML中部分元素进行转化为图片、PDF,那么phtomjs是一个很好的选择。