前言
如果你有 Markdown 或者 HTML 转到 PDF 的需求, 有非常大的可能你选了一圈方案, 最后找到了大名鼎鼎的wkhtmltopdf. 但找到它之后并没有解决所有问题, 相反, 它会带来更多的问题.
首先说一下它的优点:
由于是基于 WebKit, 所以渲染结果和 Chrome( 包括其他基于 Chromium的浏览器几乎完全一致)
可以和前端公用一套 CSS 样式, 结果还是体验的一致性
支持大量的定制, 包括页头页脚, 页码, 目录等等, 后面会详细说
再来说一下缺点:
对特别长的表格支持有问题. 其实原因还是来自 WebKit 引擎, 因为WebKit本身是用来渲染网页的, 而网页是不需要上下分页的, 所以引擎本身并不支持表格跨页显示, 需要做一些特殊处理, 划重点了.
对于特别宽的表格, 如果不做处理, 它会被横向截断,同时会在表格下方出现一个 scrollbar, 但尴尬的是这个 scrollbar 不能拖动, 因此也就无法解决完整显示的问题.
所以, 优点很明显, 缺点也很明显. 而且通常如果你有需求生成 PDF, 那多数情况下是有表格的, 不解决这个问题, 这个方案就无法实施。
实践
下面让我们通过实验一步步解决上面的两个大问题.
长表格
这里我简单写了一长段表格, 然后用 MacDown 编辑器把它导出为 html, 这里只是用来说明问题, 所以就没有用我实际在生产环境使用的 Parsedown.写着写着觉得还是用代码能说的更清晰一些,
原始 markdown 文件和 html 文件就不贴在这里了, 可以查看phpwkhtmltopdf.
在 article 目录里执行
wkhtmltopdf longtable.html longtable-01.pdf
生成的 PDF 在分页处如下的效果