-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
152 lines (141 loc) · 4.82 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
const puppeteer = require("puppeteer");
const PDFMerge = require("pdf-merge");
const runshell = require('./runshell')
const pdfjsLib = require('pdfjs-dist');
const fs = require("fs");
let titleArr = [];
let promiseAllArr = [];
async function genpdf(browser, url, path, isRemove) {
console.log('......' + path)
// 打开一个标签页
const page = await browser.newPage();
await page.goto(url, {
waitUntil: "load"
});
// 删除左侧导航,便于生成pdf
let wh = await page.evaluate((isRemove) => {
if (isRemove) {
let leftNavNode = document.querySelector("#table-of-content");
if (leftNavNode) {
leftNavNode.remove();
}
}
return {
width: 1920,
height: document.documentElement.clientHeight,
//deviceScaleFactor: window.devicePixelRatio
};
}, isRemove);
await page.setViewport(wh);
// path 路径, format 生成pdf页面格式
const filepath = "dist/" + path + ".pdf"
await page.pdf({
path: filepath,
margin: {
top: "60px",
right: "0px",
bottom: "60px",
left: "0px"
},
// 生成pdf时是否显示页眉页脚
displayHeaderFooter: true,
format: "A4"
});
titleArr.push(path)
promiseAllArr.push(pdfjsLib.getDocument(filepath));
}
async function otherpage(browser) {
let page = await browser.newPage();
await page.goto("http://huziketang.mangojuice.top/books/react/lesson1");
//await page.waitFor(2000);
let aLinkArr = await page.evaluate(() => {
console.log(document.body.clientHeight)
// 隐藏左侧导航,便于生成pdf
let leftNavNode = document.querySelector("#table-of-content");
if (leftNavNode) {
leftNavNode.style.display = "none";
}
let aLinks = [...document.querySelectorAll("#table-of-content a")];
aLinks.splice(0, 1);
return aLinks.map(a => {
return {
href: a.href.trim(),
text: a.innerText.trim()
};
});
});
//
for (let index = 0; index < aLinkArr.length; index++) {
const element = aLinkArr[index];
await genpdf(browser, element.href, element.text, true);
}
}
function mergepdf(filename) {
const filenameArr = fs.readdirSync("dist/");
const sortedFilenameArr = filenameArr.sort((str1, str2) => {
let regex = /^(\d{1,2})\./;
let a = +str1.match(regex)[1];
let b = +str2.match(regex)[1];
return a - b;
});
const files = sortedFilenameArr.map(el => {
return `${__dirname}/dist/${el}`;
});
return PDFMerge(files, {
output: filename
}).then(buffer => {
console.log("merge success!");
//删除文件
filenameArr.forEach(function (file, index) {
//var curPath = path + "/" + file;
fs.unlinkSync(`${__dirname}/dist/${file}`);
});
console.log("delete success!");
});
}
(async () => {
if (!fs.existsSync("dist")) {
fs.mkdirSync("dist")
}
// 启动浏览器
const browser = await puppeteer.launch({
// 无界面 默认为true,改成false,则可以看到浏览器操作,目前生成pdf只支持无界面的操作。
// headless: false,
// 开启开发者调试模式,默认false, 也就是平时F12打开的面版
// devtools: true,
});
await genpdf(
browser,
"http://huziketang.mangojuice.top/books/react/",
"0. React 小书",
false
);
await otherpage(browser);
// 关闭浏览器
await browser.close();
let pageIndex = 1
Promise.all(promiseAllArr).then(result => {
console.log('starting gen bookmarks!')
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);
console.log('completed gen bookmarks!')
//
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!')
})
})
})
})();