nodepdf-series
v1.2.0
Published
Convert files or urls to PDF.
Downloads
17
Maintainers
Readme
nodepdf-series
Render a list of pages to PDF:
var PDF = require('nodepdf-series');
PDF(['http://httpbin.org', 'http://httpbin.org/get'], function (err) {
if (err) {
throw err;
} else {
console.log('httpbin.org.pdf and httpbin.org/get.pdf created');
}
});
Render to a specified path and/or file names:
var PDF = require('nodepdf-series');
PDF(['http://httpbin.org', 'http://httpbin.org/get'],
{ outPath: 'testPath', fileNames: ['file1', 'file2'] },
function (err) {
if (err) throw err;
// testPath/file1.pdf and testPath/file2.pdf created
});
Works with local files too. This renders all HTML-files in subdirectories of current path:
var glob = require('glob');
var path = require('path');
var PDF = require('nodepdf-series');
glob('**/*.html', function (error, files) {
if (error) {
throw error;
}
// append file:// and resolve path to files
files = files.map(file => 'file://' + path.resolve(file));
// render them
PDF(files, function (err) {
if (err) {
throw err;
} else {
// now PDF-files should live beside HTML-files, for example:
// path/to/file1.html and path/to/file1.pdf
console.log('done');
}
});
});
Installation
npm install nodepdf-series
API
Signature:
PDF(pages, callback);
PDF(pages, options, callback);
pages
is an array of urls.
options
is an object with properties:
outPath
- Which directory to store PDFs. If not set, the current directory and the URL path will be used.fileNames
- An array of filenames to use. If not set, last part of URL will be used.args
- Arguments for the PhantomJS process.- Properties the PhantomJS page accept, like
viewportSize
.
callback
is called when the rendering is done.
Default options
var defaults = {
viewportSize: {
// this should be equal to paper size
width: 1050,
height: 1485
},
paperSize: {
/**
* A4 ratio in millimeters: 210 x 297
* DPI is hardcoded 72 in phantomJS.
* A resolution of 1050px will give 1050 / 72 * 25.4 ~ 370 mm width,
* which is way much larger than A4. Most printers will handle this,
* and scale correctly to given paper source.
*/
width: 1050,
height: 1485,
orientation: 'portrait',
margin: '1cm'
},
args: '',
captureDelay: 100
};
Performance
nodepdf-series spawns only one child of phantomjs, giving some extra performance compared to nodepdf. Here is a test on 95 local html files:
$ time node nodepdf.js
real 9m32.928s
user 5m56.769s
sys 0m56.142s
$ time node nodepdf-series.js
real 2m47.053s
user 1m55.567s
sys 0m5.104s
You may also want to spread load on all CPU-cores:
var cpus = require('os').cpus().length;
var chunk = require('lodash.chunk');
var each = require('async-each');
var files = [
'path/to/file1.html', 'path/to/file5.html', 'path/to/file9.html',
'path/to/file2.html', 'path/to/file6.html', 'path/to/file10.html',
'path/to/file3.html', 'path/to/file7.html', 'path/to/file11.html',
'path/to/file4.html', 'path/to/file8.html', 'path/to/file12.html',
];
var chunkSize = Math.round(files.length / cpus);
var chunks = chunk(files, chunkSize);
each(chunks, function (chunk, cb) {
PDF(chunk, cb);
}, function (err) {
if (err) {
console.error('Something went wrong.');
console.error(err);
} else {
// now PDF-files should live beside HTML-files, for example:
// path/to/file1.html and path/to/file1.pdf
console.log('done');
}
});