背景

公司项目涉及到不少PDF导出的需求,其中不乏列表数据、复杂报表的导出,而用户往往希望在PDF中保留页面中看到的布局和图表样式。因此,我初步考虑通过截图的形式保留页面效果,然后基于flying-saucer-pdf这个Java库去生成PDF。

技术选型

在这个功能规划初期我做了不少开源组件的调研,首先我放弃了前端方案,因为不少数据是需要翻页或者页面滚动的,如果在前端去做,交互体验会很迷惑。

那么就只有考虑后端方案,大概有几种思路:

  1. Java原生的页面渲染生成图片

    这个方案首先被我放弃了,首先目前市面上大部分的浏览器都是基于Chrome的(咱们先不谈火狐和Safari哈),渲染效果如果需要和浏览器保持一致,Java原生的库几乎就不可能达到要求。

    此外,样式的渲染和一些脚本的执行,通过Java原生库也不太可能做到,毕竟不少页面不都是单纯的静态数据。

  2. 基于ChromeDriver的自动测试工具

    其实如果需求简单,这是一个不错的选择,selenium很强大,而且接口也做了优秀的封装。不过本身过于笨重了,启动周期也相对较长。

  3. CEF

    这个其实和ChromeDriver的方式类似,不过大部分功能都需要自己实现handler去处理,不过启动快,资源占用也更少,有官方的 JCEF 库可以用。

实现方案