开源了一个 html 转 pdf 的 js 库,这应该是 html 转 pdf 最正确的思路了

1 月 20 日
 lmq1919

大概的实现步骤:

1.解析 html 页面,生成一个包含节点位置信息,样式,层级,内容等信息的 DOM 树。

2.递归 DOM 树,根据节点据顶部的高度和生成页面规格的高度,将节点分配到不同的页面。

3.调用 jspdf.js 的 api,将节点绘制到 PDF 文件上。

优点:

1.生成的是矢量的 PDF ,可以对 PDF 的文本进行搜索,选中,编辑。

2.生成的文件体积很小

3.使用简单,一行代码即可将 html 页面转成 pdf

4.精准的分页,避免元素被切割。

5.如果文件体积不大,而且电脑性能支持,可以生成几千页的 PDF

  1. 具体的说明

https://juejin.cn/post/7583912637470769203

  1. 在线体验

https://dompdfjs.lisky.com.cn

  1. Git 仓库地址 (欢迎 Star⭐⭐⭐)

https://github.com/lmn1919/dompdf.js

5609 次点击
所在节点    程序员
47 条回复
yangxiaopeipei
1 月 20 日
打印不是更快吗
cpstar
1 月 20 日
@yangxiaopeipei #1 服务器上后台服务咋打印
kuxuan
1 月 20 日
收藏了。
evan1
1 月 20 日
@cpstar #2 无头浏览器
herbloo
1 月 20 日
@evan1 正解吧,不内嵌一个 chrome 进去,很难做到全兼容
spark
1 月 20 日
@cpstar puppeteer, playwright
jifengg
1 月 20 日
之前关注过,先说一下网站证书过期了。
另外,demo 导出的 pdf ,没有最后的 line chart 。不知道是不是个例。UA:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36'
evan1
1 月 20 日
@herbloo #5 是的,我做过这个。当时做了很久,各种方案都尝试了,最后发现还是得无头浏览器。其它 js 方式生成的多多少少都会有转换的问题。比如 table 的高度、边框宽度、二维码清晰度之类的。

无头浏览器缺点就是占内存,不过用线程池+队列轮换处理也还好。
cirzear
1 月 20 日
lmq1919
1 月 20 日
@jifengg 感谢关注😄,证书已经更新
lmq1919
1 月 20 日
@yangxiaopeipei 打印有的需求满足不了😭
dbit
1 月 20 日
兼容好像有问题, ubuntu 下载下来, 用 Xreader 打开全部是空白页
avenger
1 月 20 日
这个支持 serverless 环境吗?
在线体验打不开了,正好有这个需求
目前用的是 @sparticuz/chromium-min
webszy
1 月 20 日
点了 star,支持
lmq1919
1 月 20 日
@webszy 感恩
lmq1919
1 月 20 日
@avenger serverless 还是用其他方案吧,我这个库推荐在前端浏览器使用
xz410236056
1 月 20 日
我之前简历是 HTML 的,但是 BOSS 只让传 PDF ,找了很多都找不到合适的。因为 HTML 并不是纯静态页面,需要加载部分 JS 渲染,这种时候转的 PDF 就有点问题
zhangyunlu80
1 月 20 日
支持 简单 echart 图表,饼图,柱状图么,支持 一些小的 icon 嘛
lmq1919
1 月 20 日
@zhangyunlu80 必须支持的
lmq1919
1 月 20 日
@xz410236056 我的库支持你这个需求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1186972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX