# markdown-pdf

> Markdown to PDF converter

Latest version **11.0.0** (published 2022-07-12) · MIT license · 0 weekly downloads

## Install

```sh
npm install markdown-pdf
pnpm add markdown-pdf
yarn add markdown-pdf
bun add markdown-pdf
```

Provides the command `markdown-pdf`.

## Health

**Score 13/100 (F)** — status: abandoned.

Positive: has types package; high quality score.

Warnings: low downloads; no esm support; has vulnerabilities.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 11.0.0 |
| Published | 2022-07-12 |
| First published | 2013-05-17 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | separate (@types/markdown-pdf) |
| Module format | CommonJS |
| Node | >=0.10.0 |
| Dependencies | 9 |
| Unpacked size | 247.1 KB |
| Known vulnerabilities | 1 (+2 in 1 direct dependencies) |
| Install scripts | no |
| GitHub stars | 2876 |
| Author | Alan Shaw |
| Maintainers | alanshaw |
| Keywords | markdown, pdf, convert, template |

## Links

- npm: https://www.npmjs.com/package/markdown-pdf
- Repository: https://github.com/alanshaw/markdown-pdf
- Issues: https://github.com/alanshaw/markdown-pdf/issues
- npm.io page: https://npm.io/package/markdown-pdf

## Dependencies (9)

- [tmp](https://npm.io/package/tmp.md) ^0.1.0
- [extend](https://npm.io/package/extend.md) ^3.0.2
- [duplexer](https://npm.io/package/duplexer.md) ^0.1.1
- [through2](https://npm.io/package/through2.md) ^3.0.1
- [commander](https://npm.io/package/commander.md) ^3.0.0
- [remarkable](https://npm.io/package/remarkable.md) ^2.0.0
- [highlight.js](https://npm.io/package/highlight.js.md) ^10.0.0
- [stream-from-to](https://npm.io/package/stream-from-to.md) ^1.4.2
- [phantomjs-prebuilt](https://npm.io/package/phantomjs-prebuilt.md) ^2.1.3

## Alternatives

- [@cantoo/pdf-lib](https://npm.io/package/@cantoo/pdf-lib.md) — 297.9K weekly downloads
- [datatables.net-buttons](https://npm.io/package/datatables.net-buttons.md) — 200.1K weekly downloads
- [@ckeditor/ckeditor5-export-pdf](https://npm.io/package/@ckeditor/ckeditor5-export-pdf.md) — 167.0K weekly downloads
- [scanbot-web-sdk](https://npm.io/package/scanbot-web-sdk.md) — 15.0K weekly downloads
- [@syncfusion/ej2-angular-pdfviewer](https://npm.io/package/@syncfusion/ej2-angular-pdfviewer.md) — 8.8K weekly downloads

## Recent versions

- 11.0.0 (latest) — 2022-07-12
- 10.0.0 — 2019-08-19
- 9.0.0 — 2018-07-16
- 8.1.1 — 2018-01-27
- 8.1.0 — 2017-12-11
- 8.0.0 — 2017-05-25
- 7.0.0 — 2016-01-28
- 6.0.0 — 2015-11-24
- 5.3.0 — 2015-05-18
- 5.2.0 — 2015-03-21
- 5.1.1 — 2015-03-16
- 5.1.0 — 2015-01-26
- 5.0.0 — 2015-01-25
- 4.0.1 — 2015-01-25
- 4.0.0 — 2015-01-10
- … 23 more at https://npm.io/package/markdown-pdf/versions

## README

markdown-pdf [![Build Status](https://travis-ci.org/alanshaw/markdown-pdf.svg)](https://travis-ci.org/alanshaw/markdown-pdf) [![Dependency Status](https://david-dm.org/alanshaw/markdown-pdf.svg)](https://david-dm.org/alanshaw/markdown-pdf) [![Coverage Status](https://img.shields.io/coveralls/alanshaw/markdown-pdf.svg?style=flat)](https://coveralls.io/r/alanshaw/markdown-pdf?branch=master)
===

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.

## Install

```sh
npm install -g markdown-pdf --ignore-scripts
```

Note: elevated (sudo) permissions may be needed for `npm install -g`

## Usage

```
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
  -m, --remarkable-options [json]        Options to pass to Remarkable
  -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
```

`markdown-pdf` can also be used programmatically:

```javascript
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")
})
```

### Options

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

#### options.cwd
Type: `String`
Default value: `process.cwd()`

Current working directory.

#### options.phantomPath
Type: `String`
Default value: Path provided by phantomjs module

Path to the phantomjs binary.

#### options.cssPath
Type: `String`
Default value: `[module path]/markdown-pdf/css/pdf.css`

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

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

Path to custom highlight CSS file (for code highlighting with [highlight.js](https://highlightjs.org)), 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](runnings.js)).

#### options.renderDelay
Type: `Number`
Default value: Time until [`page.onLoadFinished`](http://phantomjs.org/api/webpage/handler/on-load-finished.html) 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](https://npmjs.org/package/through2) 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](https://npmjs.org/package/through2) 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](https://www.npmjs.com/package/remarkable#options), the underlying markdown parser.

##### options.remarkable.preset
Type: `String`
Default value: `default`

Use remarkable [presets](https://www.npmjs.com/package/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](https://github.com/jonschlinkert/remarkable#syntax-extensions), disabled by default, that extend the markdown parser functionality.

## API

### from.path(path, opts) / from(path, opts)

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

### from.string(string)

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

### concat.from.paths(paths, opts)

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

### concat.from.strings(strings, opts)

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

### to.path(path, cb) / to(path, cb)

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.

### to.buffer(opts, cb)

Create a [concat-stream](https://npmjs.org/package/concat-stream) and pipe output from markdown-pdf to it. The callback function `cb` will be invoked when the buffer has been created.

### to.string(opts, cb)

Create a [concat-stream](https://npmjs.org/package/concat-stream) and pipe output from markdown-pdf to it. The callback function `cb` will be invoked when the string has been created.

## More examples

### From string to path

```javascript
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)
})
```

### From multiple paths to multiple paths

```javascript
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) })
})
```

### Concat from multiple paths to single path

```javascript
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)
})
```

### Transform markdown before conversion

```javascript
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") })
```

### Remarkable options and plugins

Example using [remarkable-classy](https://www.npmjs.com/package/remarkable-classy) plugin:

```javascript
var markdownpdf = require("markdown-pdf")

var options = {
    remarkable: {
        html: true,
        breaks: true,
        plugins: [ require('remarkable-classy') ],
		syntax: [ 'footnote', 'sup', 'sub' ]
    }
}

markdownpdf(options)
  .from("/path/to/document.md")
  .to("/path/to/document.pdf", function () { console.log("Done") })
```

## Contribute

Feel free to dive in! [Open an issue](https://github.com/alanshaw/markdown-pdf/issues/new) or submit PRs.

## License

[MIT](LICENCE) © Alan Shaw

---
_Source: https://npm.io/package/markdown-pdf · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
