将 HTML
渲染成 PDF
文件,此项目用 Golang
开发,提供一个 HTTP 接口将本地或者远程 HTML 页面输出成为 PDF
文件格式。
使用 HTML
作为模板的原因是因为 HTML 的表达能力最好,而且 wkhtmltopdf
使用 webkit
作为渲染内核,可以使用一些现代的 CSS
方案,尽量降低模板复杂度。
提供 4 个接口,分别对应不同的使用场景:
htmlpdf
:将 HTML 源码渲染成 PDF
文件格式。linkpdf
:将在线的链接渲染成为 PDF
文件格式。combine
:将若干个 PDF URL 合并成一个 PDF 文件。link/combine
:将若干个 PDF/网页 URL 合并成一个 PDF 文件。go get -v
签出所有的依赖库go build -o html2pdf .
编译成二进制可执行文件html2pdf -c ./config.json
使用 Phantomjs
渲染:
{
"listen": "127.0.0.1:4444", // HTTP 服务绑定地址
"tmp_path": "", // 生成 PDF 文件中间的所有过渡临时文件存放路径
"web_root": "", // HTTP 服务自带了一个示例 sample 存放路径
"webkit_bin": "", // Phantomjs 执行文件的存放路径
"webkit_args": ["./render/phantomjs/pdf.js"], // Phantomjs CLI 默认的参数,执行 JS 渲染的具体脚本
"pdftk_bin": "pdftk.exe", // pdftk 渲染器位置
"cache_ttl": 3600, // 静态 PDF 缓存时间(秒)
"worker": 4, // 生成 PDF 的工作进程数
"timeout": 40 // 生成 PDF 的进程的超时时间
}
注意: 由于
Phantomjs
依赖fontconfig
,而不同环境下fontconfig
配置会有不一样的情况,需要从两方面入手解决在不同系统下渲染差别的问题:
- 尽量使用
embed font
处理渲染的字体,包括默认的字体。- 同步
fontconfig
的一些公用配置,一般放在/etc/fonts/conf.d
下,修改完后执行fc-cache -fv
重置fontconfig
。
经过测试发现,如果需要 A4
规格的 PDF
文件铺满需要使用 1240px x 1754px
这个尺寸,但这也只是参考值;因为我们发现不同系统上 wkhtmltopdf
渲染网页的页面尺寸是不一样的,这需要控制 --zoom
参数进行预匹配。
各种纸张的打印尺寸规格可以参考这里。
请参考用于生成支持 HTML2PDF
的 HTML 模板项目 html2pdf-template。
此项目已经打包成 Docker 镜像。
docker pull mmhk/html2pdf
config.json
的说明。
127.0.0.1:4444
/usr/local/html2pdf/web_root
docker run --name html2pdf -p 4444:4444 mmhk/html2pdf:latest
你也可以使用 docker-compose
来运行此项目。以下是一个示例 docker-compose.yml
文件:
version: "3.7"
services:
app:
image: mmhk/html2pdf
restart: always
environment:
- HOST=0.0.0.0:4444
- ROOT=/app/web_root
- TIMEOUT=60
- WORKER=4
- TTL=3600
- LOG_LEVEL=INFO
- TZ=Asia/Hong_Kong
ports:
- 4444:4444
使用以下命令启动服务:
docker-compose up -d
此项目使用 Apache 2.0 许可证。 ```
希望这些信息对你有帮助!如果有任何问题或需要进一步的信息,请随时联系我。