资讯专栏INFORMATION COLUMN

爬取html生成pdf

light / 2388人阅读

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

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

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

针对网页生成pdf

使用puppeteer爬取网页并生成pdf

puppeteer中文文档

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

pdf-merge:合并pdf

依赖于pdftk

如何给pdf加上书签

pdftk:一个处理pdf的工具

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

利用update_info_utf8给pdf增加书签:

pdftk "d:OpenSourceMygenpfdforrsbReact 小书(无书签).pdf" update_info_utf8 "d:OpenSourceMygenpfdforrsbookmarks.txt" output "d:OpenSourceMygenpfdforrsbReact 小书.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
BookmarkTitle: ${titleArr[index]}
BookmarkLevel: 1
BookmarkPageNumber: ${pageIndex}
`
    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!")
    })
})

文件路径需要用双引号

源码:genpfdforrsb

问题

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100781.html

相关文章

  • Puppeteer初探--爬取生成《ES6标准入门》PDF

    摘要:首先介绍是一个库,他提供了一组用来操纵的默认也就是无的,也可以配置为有有点类似于,但是官方团队进行维护的,前景更好。使用,相当于同时具有和的能力,应用场景会非常多。 首先介绍Puppeteer Puppeteer是一个node库,他提供了一组用来操纵Chrome的API(默认headless也就是无UI的chrome,也可以配置为有UI) 有点类似于PhantomJS,但Puppet...

    JerryWangSAP 评论0 收藏0
  • 使用Node.js爬取任意网页资源并输出高质量PDF文件到本地~

    摘要:上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有标签对应的跳转网页中的所有的文字内容,最后放到一个数组中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文适合无论是否有爬虫以及Node.js基础的朋友观看~ 需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的...

    seasonley 评论0 收藏0
  • 使用Node.js爬取任意网页资源并输出高质量PDF文件到本地~

    摘要:上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有标签对应的跳转网页中的所有的文字内容,最后放到一个数组中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文适合无论是否有爬虫以及Node.js基础的朋友观看~ 需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的...

    xiaoxiaozi 评论0 收藏0
  • 使用Node.js爬取任意网页资源并输出高质量PDF文件到本地~

    摘要:上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有标签对应的跳转网页中的所有的文字内容,最后放到一个数组中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文适合无论是否有爬虫以及Node.js基础的朋友观看~ 需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的...

    wangym 评论0 收藏0

发表评论

0条评论

light

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<