如题,想请教 V 友们有什么办法可以将网页转换为 PDF 吗?
经过调研,我目前发现的方法如下(使用 Node ):
利用 phantom.js 的 render
phantomjs-node,对 phantom.js 进行了一层封装
这是我尝试的目前效果最好的方法,可以直接自行封装一个脚本,由前端调用 API 后触发。但渲染速度不尽人意,不过也应该有一些优化的空间。
// demo
const phantom = require('phantom');
(async function() {
const instance = await phantom.create();
const page = await instance.createPage();
await page.property('viewportSize', {width: 1024, height: 600});
const status = await page.open('https://stackoverflow.com/');
console.log(`Page opened with status [${status}].`);
await page.render('stackoverflow.pdf');
console.log(`File created at [./stackoverflow.pdf]`);
await instance.exit();
}());
生成网页截屏。但只能是 png 、 jpg 、 jpeg 形式,且无法滚屏截图,只能指定图片高度或者按照窗口大小截取(目前没有找到合适的方式)
// demo
var webshot = require('webshot');
webshot('google.com', 'google.png', function(err) {
// screenshot now saved to google.png
});
暂时还没有尝试,看见在 stackoverflow 上有人推荐,也有人反馈说该库有很奇怪的 bug
相对于上面的方法,该库是在前端调用,将一个指定的 DOM 转为 base64 格式的图片,并可以保留其样式。但缺点很明显,由于是前端使用,在 DOM 数目较多时会有明显的卡顿,体验不好。
// demo
domtoimage.toJpeg(document.getElementById('my-node'))
.then(function (dataUrl) {
var link = document.createElement('a');
link.download = 'my-image-name.jpeg';
link.href = dataUrl;
link.click();
});
stackoverflow 上的讨论 - HTML to PDF with Node.js
目前为止,还没有发现什么用起来非常爽的方法,所以求广大 V 友共同讨论 Orz
有很多 chrome 插件可以将页面转为 PDF,但无法完成自动化。我目前用的最好的插件是这个:FireShot,但是它是在自己的 server 上生成的 PDF ,无法查看具体实现,而官方的 API 的话使用是要收费的。
1
woshilala1988 2017-02-13 11:32:08 +08:00
php 有个类可以调用,我们公司一直在用,很稳定
|
2
helloccav 2017-02-13 11:34:28 +08:00 via Android
@woshilala1988 求下载地址。对中文的支持好吗?
|
3
shoaly 2017-02-13 11:36:07 +08:00
composer require barryvdh/laravel-dompdf:^0.6.0
|
4
qooweds 2017-02-13 11:51:49 +08:00 2
自己用的话
chrome 的话可以在打印里面另存为 PDF,或者找找插件 |
5
chloerei 2017-02-13 12:03:16 +08:00 via iPhone
|
6
mmzer 2017-02-13 13:07:47 +08:00
chorme 的打印挺好用的
|
7
irainsoft 2017-02-13 13:11:49 +08:00
Chrome 各种网页截屏插件不行吗?
|
8
LucasW 2017-02-13 13:18:38 +08:00
|
9
ecmadao OP @qooweds chrome 的打印对于以文本为主的页面来说挺好的,不过如果自定义的 DOM 很多页面偏复杂的话,布局会乱
|
11
ecmadao OP @irainsoft 可以啊,但是插件无法完成自动化,也不能嵌入到自己的网站上,让别人来生产 PDF 。我目前用的最好的插件是这个:[FireShot]( https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg),但是它是在自己的 server 上生成的 PDF ,无法查看具体实现,官方的 API 的话使用是要收费的
|
14
lzjun 2017-02-13 14:36:39 +08:00
|
15
lxrmido 2017-02-13 15:24:14 +08:00
mark
|
16
ecmadao OP @lzjun 看了你的文章,我觉得如果你的需求主要是获取 http 请求的 body 的话,就没必要用 BS4 了(因为匹配 DOM 的逻辑并不复杂),太重。不过我主要困惑的是,不知道 wkhtmltopdf 保存的结果能否保留页面上较复杂的 CSS 样式?
|
17
wellsc 2017-02-13 17:26:38 +08:00
f12 打开 dev tools , console 里面输入 print();
done |
18
hehe00 2017-02-13 17:32:11 +08:00
@woshilala1988 请问 word(.doc .docx)转 PDF 或 HTML,有什么办法吗
|
19
ecmadao OP @LucasW
看了下文档,它是将静态的 HTML 文件转为 PDF ,而且允许往 HTML 里面插入一个 CSS 和一个 JS 文件? 但是有一个 issue 说它不能够插入多个资源文件,而且作者也表示确实不支持也没时间做 Orz |
21
LucasW 2017-02-14 12:16:51 +08:00
@ecmadao 你的需求是什么样的?
看我这边的项目, https://github.com/Lucassssss/Writer , 是直接转换 html 内容为 pdf ,而且可以给转换的内容自己定义不同的样式。 |
22
boxz 2017-02-14 23:36:10 +08:00
wkhtmltopdf 你可以试试
|
24
dphdjy 2017-02-15 18:35:52 +08:00 via Android
DOM 乱可以手动改啊,改完了再打印
|
25
marsLeo 2017-02-16 01:37:05 +08:00
刚好看到阮老师的微博,有相关内容
http://weibo.com/1400854834/EvGeSvGFM |
26
hehe00 2017-02-17 09:27:14 +08:00
倒是有 word 转 PDF 的
|
29
xiaoluoboding 2017-02-20 14:03:48 +08:00
不应该是 pdf.js 吗、。? https://github.com/mozilla/pdf.js
|
30
ctftemp 2017-02-20 19:30:49 +08:00 via Android
你直接用 node 调用 phantomjs 不就可以吗? phantomjs-node 的原理也是启动了一个 phantomjs 子进程与之交互。至于速度问题,你用别的浏览器不见得效率能更高。
|
31
ctftemp 2017-02-20 19:33:07 +08:00 via Android
@ecmadao wkhtmltopdf 的话,和 phantomjs 一样用的是 webkit 内核,按理说不会更快。我没对比过,你可以试试。
|
32
oldj 2017-02-21 13:35:09 +08:00
wkhtmltopdf 应该是一个很好的选择。
和 phantomjs 相比,它的优点之一是输出的 PDF 支持目录( TOC )。 |
33
20015jjw 2017-02-21 18:45:27 +08:00 via Android
cmd + p ?
|
34
Khlieb 2017-02-21 20:55:01 +08:00 via Android
有些虚拟打印机也能把网页做成 PDF ,就是通过浏览器的打印功能来调用的,比如 CutePDF 、 doPDF 、 PDFCreator
|
35
spice630 2017-02-23 17:13:08 +08:00
|