Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
markdown-pdf
Advanced tools
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 -g markdown-pdf --ignore-scripts
Note: elevated (sudo) permissions may be needed for npm install -g
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:
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: 2cm
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.
Type: object
Default value: { breaks: true }
A config object that is passed to remarkable, the underlying markdown parser.
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
Type: Array
of remarkable-plugin Function
s
Default value: []
An array of Remarkable plugin functions, that extend the markdown parser functionality.
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.
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 concatenate readable streams from paths
and pipe to markdown-pdf.
Create and concatenate 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") })
Example using remarkable-classy plugin:
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") })
Feel free to dive in! Open an issue or submit PRs.
MIT © Alan Shaw
FAQs
Markdown to PDF converter
The npm package markdown-pdf receives a total of 5,117 weekly downloads. As such, markdown-pdf popularity was classified as popular.
We found that markdown-pdf demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.