markdowntopdfjs
v1.0.0
Published
Markdown to PDF converter
Downloads
16
Maintainers
Readme
markdowntopdfjs
Node module that converts Markdown files to PDFs.
Your markdown will first be converted into HTML through the parsing of remarkable
, then pushed into the HTML5 Boilerplate index.html
. Phantomjs renders the page and saves it to a PDF. You can even customise the style of the PDF by passing an optional path to your CSS and you can pre-process your markdown file before it is converted to a PDF by passing in a pre-processing function, for templating.
Install
npm install markdowntopdfjs
Options
Pass an options object (mdtopdf({/* options */})
) to configure the output.
options.cwd
Type: String
Default value: process.cwd()
Current working directory.
options.phantomPath
Type: String
required
Path to the phantomjs binary.
options.cssPath
Type: String
Default value: [module path]/markdowntopdf/css/pdf.css
Path to custom CSS file, relative to the current directory.
options.highlightCssPath
Type: String
Default value: [module path]/markdowntopdf/css/highlight.css
Path to custom highlight CSS file (for code highlighting with highlight.js), relative to the current directory.
options.paperFormat
Type: String
Default value: A4
'A3', 'A4', 'A5', 'Legal', 'Letter' or 'Tabloid'.
options.paperOrientation
Type: String
Default value: portrait
'portrait' or 'landscape'.
options.paperBorder
Type: String
Default value: 2cm
Supported dimension units are: 'mm', 'cm', 'in', 'px'
options.runningsPath
Type: String
Default value: runnings.js
Path to CommonJS module which sets the page header and footer (see runnings.js).
options.renderDelay
Type: Number
Default value: Time until page.onLoadFinished
event fired
Delay (in ms) before the PDF is rendered.
options.loadTimeout
Type: Number
Default value: 10000
If renderDelay
option isn't set, this is the timeout (in ms) before the page is rendered in case the page.onLoadFinished
event doesn't fire.
options.preProcessMd
Type: Function
Default value: function () { return through() }
A function that returns a through2 stream that transforms the markdown before it is converted to HTML.
options.preProcessHtml
Type: Function
Default value: function () { return through() }
A function that returns a through2 stream that transforms the HTML before it is converted to PDF.
options.remarkable
Type: object
Default value: { breaks: true }
A config object that is passed to remarkable, the underlying markdown parser.
options.remarkable.preset
Type: String
Default value: default
Use remarkable presets as a convenience to quickly enable/disable active syntax rules and options for common use cases.
Supported values are default
, commonmark
and full
options.remarkable.plugins
Type: Array
of remarkable-plugin Function
s
Default value: []
An array of Remarkable plugin functions, that extend the markdown parser functionality.
options.remarkable.syntax
Type: Array
of optional remarkable syntax Strings
s
Default value: []
An array of optional Remarkable syntax extensions, disabled by default, that extend the markdown parser functionality.
More examples
From string to path
const mdtopdf = require('markdowntopdfjs')
let md = '# First level title',
outputPdfPath = '/path/to/doc.pdf'
mdtopdf({
phantomPath: path.resolve(__dirname, './bin/phantomjs.exe')
// or linux
// phantomPath: path.resolve(__dirname, './bin/phantomjs')
})
.from.string(md)
.to(outputPdfPath, function () {
console.log('Created', outputPdfPath)
})
From multiple paths to multiple paths
const mdtopdf = require('markdowntopdfjs')
let mdDocs = ['home.md', 'order.md', 'about.md'],
pdfDocs = mdDocs.map(function (d) {
return 'out/' + d.replace('.md', '.pdf')
})
mdtopdf({
phantomPath: path.resolve(__dirname, './bin/phantomjs.exe')
// or linux
// phantomPath: path.resolve(__dirname, './bin/phantomjs')
})
.from(mdDocs)
.to(pdfDocs, function () {
pdfDocs.forEach(function (d) {
console.log('Created', d)
})
})
Concat from multiple paths to single path
const mdtopdf = require('markdowntopdfjs')
let mdDocs = ['header.md', 'content.md', 'footer.md'],
bookPath = '/path/to/book.pdf'
mdtopdf({
phantomPath: path.resolve(__dirname, './bin/phantomjs.exe')
// or linux
// phantomPath: path.resolve(__dirname, './bin/phantomjs')
})
.concat.from(mdDocs)
.to(bookPath, function () {
console.log('Created', bookPath)
})
Transform markdown before conversion
const mdtopdf = require('markdowntopdfjs'),
split = require('split'),
through = require('through'),
duplexer = require('duplexer')
function preProcessMd() {
// Split the input stream by lines
var splitter = split()
// Replace occurences of "foo" with "bar"
var replacer = through(function (data) {
this.queue(data.replace(/foo/g, 'bar') + '\n')
})
splitter.pipe(replacer)
return duplexer(splitter, replacer)
}
mdtopdf({
preProcessMd: preProcessMd,
phantomPath: path.resolve(__dirname, './bin/phantomjs.exe')
// or linux
// phantomPath: path.resolve(__dirname, './bin/phantomjs')
})
.from('/path/to/document.md')
.to('/path/to/document.pdf', function () {
console.log('Done')
})
Remarkable options and plugins
Example using remarkable-classy plugin:
const mdtopdf = require('markdowntopdfjs')
const options = {
remarkable: {
html: true,
breaks: true,
plugins: [require('remarkable-classy')],
syntax: ['footnote', 'sup', 'sub']
},
phantomPath: path.resolve(__dirname, './bin/phantomjs.exe')
// or linux
// phantomPath: path.resolve(__dirname, './bin/phantomjs')
}
mdtopdf(options)
.from('/path/to/document.md')
.to('/path/to/document.pdf', function () {
console.log('Done')
})
Contribute
Feel free to dive in! Open an issue or submit PRs.
License
MIT © xin