-
Notifications
You must be signed in to change notification settings - Fork 5
/
pdf.js
70 lines (58 loc) · 1.97 KB
/
pdf.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
const path = require('path'),
fs = require('fs'),
assign = require('object-assign'),
pdfParser = require('../pdfParser');
module.exports = function(log, settings, browserWindow, done) {
let pdfDefaults = {
marginsType: 0,
pageSize: 'A4',
printBackground: false,
landscape: false
};
// TODO: support headerHeight, footerHeight when electron support rendering PDF's header/footer
let pdfSettings = settings.pdf,
pdfOptions = assign({}, pdfDefaults, pdfSettings, { printSelectionOnly: false });
log('before printing..');
log('pdf options:', pdfOptions);
browserWindow.webContents.printToPDF(pdfOptions, (err, pdfBuf) => {
let dist = path.join(settings.output.tmpDir, `${settings.output.id}.pdf`);
if (err) {
return done(err);
}
// don't know why the electron process hangs up if i don't log anything here
// (probably pdf.js?)
// anyway this log prevent the conversion to stop
log('after printing..');
log('parsing pdf..');
pdfParser(pdfBuf, (pdfParseErr, pdfDoc) => {
log('pdf parsing complete..');
if (pdfParseErr) {
return done(pdfParseErr);
}
// when running in IISNODE electron hangs when using fs.readFile, fs.createReadStream
// or any async API for read a file.. on normal windows + node electron consumes 100% CPU when
// using any async file API, so the only/best option is to read the file in a synchronous way
if (process.platform === 'win32') {
try {
fs.writeFileSync(dist, pdfBuf);
done(null, {
numberOfPages: pdfDoc.numPages,
output: dist
});
} catch (saveErr) {
done(saveErr);
}
} else {
fs.writeFile(dist, pdfBuf, (saveErr) => {
if (saveErr) {
return done(saveErr);
}
done(null, {
numberOfPages: pdfDoc.numPages,
output: dist
});
});
}
});
});
};