元木Java编程笔记 java java调用wkhtmltopdf实现转换html页面为pdf文档

java调用wkhtmltopdf实现转换html页面为pdf文档

1     前言 在项目开发过程中很经常遇到需要自定义生成pdf的需求,在一番查找后找到了三个比较合适的工具:…

1     前言

在项目开发过程中很经常遇到需要自定义生成pdf的需求,在一番查找后找到了三个比较合适的工具:itext、spire和wkhtmltopdf,其中itext和spire功能强大,但商业用途需收费,wkhtmltopdf开源免费,功能也完全够用,于是果断盘它!

2     wkhtmltopdf简介

wkhtmltopdf是一个独立安装、通过命令行交互、开源免费的将html内容转为pdf或图片的工具,命令行交互意味着只要能够调用本地命令(cmd或shell等)的开发语言均可使用,比如Java。其本质是使用内置浏览器内核渲染目标网页,然后再将网页渲染结果转换为PDF文档或图片。本文以在java里调用wkhtmltopdf来生成pdf进行说明。

2.1 使用方式

  • 创建待转换的目标HTML页面,可用任何熟悉的技术栈,要注意的一点是尽量保存页面为静态,尽量减少动态效果、交互。wkhtmltopdf也可支持直接转换html文件,不过还是建议以url方式来转换,更简便。
  • 部署运行html web服务,运行命令行进行转换:

WK_BIN_PATH/wkhtmltopdf http://yourdomain/target.html SAVE_PATH/target.pdf

4、完成,在存储目录下可找到下载的pdf文件。

2.2 wkhtmltopdf配置

wkhtmltopdf命令结构为:

wkhtmltopdf [GLOBAL OPTION]… [OBJECT]… <output file>

在命令行上可通过 wkhtmltopdf –H 来查看所有的配置说明。

官网文档:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

3     本文实现功能

【注】html需规范。

3.1 自定义页面边距

  -B, –margin-bottom <unitreal>      下边距,单位毫米,默认10毫米

  -L, –margin-left <unitreal>         左边距,单位毫米,默认10毫米

  -R, –margin-right <unitreal>        右边距,单位毫米,默认10毫米

  -T, –margin-top <unitreal>         上边距,单位毫米,默认10毫米

3.2 自定义页眉页脚

  –header-html <url>              页眉内容,通过html自定义

  –footer-html <url>               页脚内容,通过html自定义

wkhtmltopdf 将自动带上一些参数供页面使用:’page’, ‘frompage’, ‘topage’, ‘webpage’, ‘section’, ‘subsection’, ‘date’, ‘isodate’, ‘time’, ‘title’, ‘doctitle’, ‘sitepage’, ‘sitepages’。

3.3 自定义pdf内容

    此处即为需要生成的pdf内容,可将该html页面视为pdf生成模板,使用自个熟悉的web页面开发技术栈即可,尽量使页面静态化,一些有动态效果的插件尽量禁用动态效果(如echarts可以通过配置项禁止动画效果)。

3.4 页面加载完成判断

由于页面加载完成需要一定时间,wkhtml提供了两种方式来等待页面加载完成:延时和页面状态判断。两者使用一种即可,都配置的话页面状态判断方式生效。

  • 延时

通过配置项:–javascript-delay <msec> 实现,msec单位为毫秒。

  • 页面状态

通过配置项:–window-status <windowStatus> 实现,其中 windowStatus 为html页面上的 window.status 值。

3.5 实例代码

我是元木,多年互联网软件研发老兵,在『元木Java编程笔记』上记录自己码农生涯中的一些Java编程笔记,欢迎交流。
转载请注明出处:https://www.javanote.net/1.html

作者: 元木

发表评论