An Mkdocs plugin to generate a PDF file for each MkDocs page using pyppeteer
(chrome headless)
and add a download button.
Install the package with pip:
pip install mkdocs-page-pdf
Enable the plugin in your mkdocs.yml:
plugins:
# - ...
- page-to-pdf # should be last
To set different options use the following syntax.
plugins:
# - ...
- page-to-pdf :
# Options here
disable
(bool): Disable pdf rendering useful to quickly disable it without removing the plugin config. Defaults toFalse
.disableOnServe
(bool): Disable pdf rendering when usingmkdocs serve
. Defaults toFalse
.
The following options are directly induced from pyppeteer options :
scale
(float): Scale of the webpage rendering, defaults to1.0
.displayHeaderFooter
(bool): Display header and footer. Defaults toFalse
.headerTemplate
(str): HTML template for the print header. Should be valid HTML markup with following classes.date
: formatted print datetitle
: document titleurl
: document locationpageNumber
: current page numbertotalPages
: total pages in the document
footerTemplate
(str): HTML template for the print footer. Should be valid HTML markup with the same classes asheaderTemplate
.printBackground
(bool): Print background graphics. Defaults toFalse
.landscape
(bool): Paper orientation. Defaults toFalse
.pageRanges
(string): Paper ranges to print, e.g., '1-5,8,11-13'. Defaults to empty string, which means all pages.format
(str): Paper format. Defaults toA4
.margin
(dict): Paper margins.top
(str): Top margin, accepts values labeled with units, defaults to20px
.right
(str): Right margin, accepts values labeled with units, defaults to20px
.bottom
(str): Bottom margin, accepts values labeled with units, defaults to20px
.left
(str): Left margin, accepts values labeled with units, defaults to20px
.
pageLoadOptions
(dict): Page load options (see this).timeout
(int): Maximum time in milliseconds, defaults to30000
.waitUntil
(str): When to consider navigation succeeded, defaults toload
.
exclude
(list) : List of glob pattern to exclude
Depending on what image you are using you may encounter some issue running pyppeteer
: Browser closed unexpectedly
This is due to some missing shared librairies used by Chrome Headless.
Related issue : pyppeteer/pyppeteer#194
See this article
and this guide
Ready-to-use docker image : https://github.com/brospars/docker-mkdocs
You can use disable
or disableOnServe
options to disable the pdf rendering (entirely or on serve) but you can also
use the mkdocs serve --dirtyreload
flag to only rebuild modified files on the fly.
Due to a chrome bug a blank page can appear at the end of the PDF you can remove it by addin the following to you extra.css :
body {
contain: strict;
}
This plugin was inspired by mkdocs-with-pdf
and mkdocs-pdf-export-plugin
but without using weasyprint
and instead pyppeteer
(chrome headless) to have a render
closer to what you have in your chrome browser.