爬虫html转换成pdf,爬取html生成pdf

首先看了这篇文章前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并,发现最后的pdf没有书签,很难受,所以主要在此基础上加了加书签的功能。

爬去的示例网站为React.js 小书,仅做学习交流

针对网页生成pdf

使用puppeteer爬取网页并生成pdf

const puppeteer = require('puppeteer');

(async () => {

const browser = await puppeteer.launch();

const page = await browser.newPage();

await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});

await page.pdf({path: 'hn.pdf', format: 'A4'});

await browser.close();

})();

合成pdf

依赖于pdftk

如何给pdf加上书签

pdftk:一个处理pdf的工具

安装后将bin目录添加到环境变量

利用update_info_utf8给pdf增加书签:

pdftk 'd:\OpenSource\My\genpfdforrsb\React 小书(无书签).pdf' update_info_utf8 'd:\OpenSource\My\genpfdforrsb\bookmarks.txt' output 'd:\OpenSource\My\genpfdforrsb\React 小书.pdf'

书签是什么

也就是bookmarks.txt

书签格式:

BookmarkBegin

BookmarkTitle: PDF Reference (Version 1.5)

BookmarkLevel: 1

BookmarkPageNumber: 1

BookmarkBegin

BookmarkTitle: Contents

BookmarkLevel: 2

BookmarkPageNumber: 3

确定书签页码

pdfjs-dist:获取单个pdf页数,用于bookmarks.txt中指定页码

生成书签

const pageArr = result.map(c => c.numPages);

let txt = ''

for (let index = 0; index < pageArr.length; index++) {

let temp = `BookmarkBegin\r\nBookmarkTitle: ${titleArr[index]}\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: ${pageIndex}\r\n`

txt += temp

pageIndex += pageArr[index]

}

fs.writeFileSync('bookmarks.txt', txt);

加上书签

参考pdf-merge源码,增加runshell.js用于在node中执行pdftk的命令

runshell.js如下:

'use strict';

const child = require('child_process');

const Promise = require('bluebird');

const exec = Promise.promisify(child.exec);

module.exports = (scripts) => new Promise((resolve, reject) => {

exec(scripts)

.then(resolve)

.catch(reject);

});

执行pdftk update_info_utf8

const nobkname = 'React 小书(无书签).pdf'

const hasbkname = 'React 小书.pdf'

mergepdf(nobkname).then(buffer => {

console.log('starting add bookmarks!')

runshell(`pdftk "${__dirname}/${nobkname}" update_info_utf8 "${__dirname}/bookmarks.txt" output "${__dirname}/${hasbkname}"`).then(() => {

console.log('completed add bookmarks!')

fs.unlinkSync(`${__dirname}/${nobkname}`);

fs.unlinkSync(`${__dirname}/bookmarks.txt`);

console.log('all completed!')

})

})

文件路径需要用双引号

问题

合并后的pdf页码不是连续的,还是单个pdf的页码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值