markdown-pdf

Markdown to PDF converter

markdown-pdf

Node module that converts Markdown files to PDFs.

The PDF looks great because it is styled by HTML5 Boilerplate. What? - Yes! Your Markdown is first converted to HTML, 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.

npm install markdown-pdf
var markdownpdf = require("markdown-pdf")
  , fs = require("fs")
 
fs.createReadStream("/path/to/document.md")
  .pipe(markdownpdf())
  .pipe(fs.createWriteStream("/path/to/document.pdf"))
 
// --- OR --- 
 
markdownpdf().from("/path/to/document.md").to("/path/to/document.pdf", function () {
  console.log("Done")
})

Pass an options object (markdownpdf({/* options */})) to configure the output.

Type: String
Default value: process.cwd()

Current working directory.

Type: String
Default value: Path provided by phantomjs module

Path to the phantomjs binary.

Type: String
Default value: [module path]/markdown-pdf/css/pdf.css

Path to custom CSS file, relative to the current directory.

Type: String
Default value: [module path]/markdown-pdf/css/highlight.css

Path to custom highlight CSS file (for code highlighting with highlight.js), relative to the current directory.

Type: String
Default value: A4

'A3', 'A4', 'A5', 'Legal', 'Letter' or 'Tabloid'.

Type: String
Default value: portrait

'portrait' or 'landscape'.

Type: String
Default value: 1cm

Supported dimension units are: 'mm', 'cm', 'in', 'px'

Type: String
Default value: runnings.js

Path to CommonJS module which sets the page header and footer (see runnings.js).

Type: Number
Default value: Time until page.onLoadFinished event fired

Delay (in ms) before the PDF is rendered.

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.

Type: Function
Default value: function () { return through() }

A function that returns a through2 stream that transforms the markdown before it is converted to HTML.

Type: Function
Default value: function () { return through() }

A function that returns a through2 stream that transforms the HTML before it is converted to PDF.

Create a readable stream from path and pipe to markdown-pdf. path can be a single path or array of paths.

Create a readable stream from string and pipe to markdown-pdf. string can be a single string or array of strings.

Create and concatinate readable streams from paths and pipe to markdown-pdf.

Create and concatinate readable streams from strings and pipe to markdown-pdf.

Create a writeable stream to path and pipe output from markdown-pdf to it. path can be a single path, or array of output paths if you specified an array of inputs. The callback function cb will be invoked when data has finished being written.

Create a concat-stream and pipe output from markdown-pdf to it. The callback function cb will be invoked when the buffer has been created.

Create a concat-stream and pipe output from markdown-pdf to it. The callback function cb will be invoked when the string has been created.

var markdownpdf = require("markdown-pdf")
 
var md = "foo===\n* bar\n* baz\n\nLorem ipsum dolor sit"
  , outputPath = "/path/to/doc.pdf"
 
markdownpdf().from.string(md).to(outputPath, function () {
  console.log("Created", outputPath)
})
var markdownpdf = require("markdown-pdf")
 
var mdDocs = ["home.md", "about.md", "contact.md"]
  , pdfDocs = mdDocs.map(function (d) { return "out/" + d.replace(".md", ".pdf") })
 
markdownpdf().from(mdDocs).to(pdfDocs, function () {
  pdfDocs.forEach(function (d) { console.log("Created", d) })
})
var markdownpdf = require("markdown-pdf")
 
var mdDocs = ["chapter1.md", "chapter2.md", "chapter3.md"]
  , bookPath = "/path/to/book.pdf"
 
markdownpdf().concat.from(mdDocs).to(bookPath, function () {
  console.log("Created", bookPath)
})
var markdownpdf = require("markdown-pdf")
  , 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)
}
 
markdownpdf({preProcessMd: preProcessMd})
  .from("/path/to/document.md")
  .to("/path/to/document.pdf", function () { console.log("Done") })

To use markdown-pdf as a standalone program from the terminal run

npm install -g markdown-pdf
Usage: markdown-pdf [options] <markdown-file-path>
 
Options:
 
  -h, --help                             output usage information
  -V, --version                          output the version number
  <markdown-file-path>                   Path of the markdown file to convert
  -c, --cwd [path]                       Current working directory
  -p, --phantom-path [path]              Path to phantom binary
  -h, --runnings-path [path]             Path to runnings (header, footer)
  -s, --css-path [path]                  Path to custom CSS file
  -z, --highlight-css-path [path]        Path to custom highlight-CSS file
  -f, --paper-format [format]            'A3', 'A4', 'A5', 'Legal', 'Letter' or 'Tabloid'
  -r, --paper-orientation [orientation]  'portrait' or 'landscape'
  -b, --paper-border [measurement]       Supported dimension units are: 'mm', 'cm', 'in', 'px'
  -d, --render-delay [millis]            Delay before rendering the PDF
  -t, --load-timeout [millis]            Timeout before the page is rendered in case `page.onLoadFinished` isn't fired
  -o, --out [path]                       Path of where to save the PDF