176

I have recently started learning Markdown for use with documentation, and need to print out a few of my Markdown pages. I would like to use a command-line, Terminal, etc. utility that allows me to convert Github-flavored Markdown to PDF. It needs to have proper syntax highlighting and should not look horrible. Thanks for any help.

  • 1
    The syntax coloring on GitHub is not part of GitHub Flavored Markdown. At least as far as I know. – Der Hochstapler Dec 16 '13 at 12:51
  • @OliverSalzburg Github uses Linguist to provide syntax highlighting. – DanteTheEgregore Dec 16 '13 at 13:37
  • 1
    @dillmo, Convert to HTML first, then use Chrome to print-to-pdf. – Pacerier Feb 18 '16 at 20:30

13 Answers 13

175

I've had success using grip to display markdown in Chrome and then use Chrome's "Save as PDF" option in the Print dialog.

pip install grip  
grip your_markdown.md

grip will render the markdown on localhost:5000 - just edit away and refresh the browser. Print when ready.

This gave a more reliable representation than pandoc and was lighter weight than installing latex (required by pandoc for pdf generation).

The print is not command line in this answer, but still found this easier/more reliable (looked 100% like Github for a long document including relatively linked images and code highlighting).

| improve this answer | |
  • 2
    this is easy enough. – s2t2 Sep 5 '15 at 0:21
  • 26
    grip your_markdown.md --export your_markdown.html is useful option here. Exports it to the html file, which can then be printed from the command line using something like wkhtmltopdf. – Luke Exton Sep 12 '15 at 1:27
  • 8
    Alternatively you can download (free!) Atom (atom.io), open your file in Atom, use control + shift+ M to view it in preview, save as html, then open the html in your Chrome browser and save as pdf. – Andrew Carter Jan 4 '16 at 19:54
  • 6
    This does come with the Github-like frame around it. Is there a way to print to PDF, removing the borders / title bar (i.e. printing everything inside the frame)? – Joost Mar 7 '16 at 14:05
  • 3
    You can use Pandoc with the light-weight wkhtmltopdf instead of latex like this: pandoc README-Template.md --from=gfm --pdf-engine=wkhtmltopdf --output README.pdf – Asme Just Apr 13 '18 at 19:15
65

You can also use Node.js based markdown-pdf

npm install -g markdown-pdf
markdown-pdf /path/to/markdown
| improve this answer | |
  • 2
    This is pretty awesome and really easy. The link issue comes from the html5 boilerplate's print css which you can just comment out or override in your own stylesheet. – Robert Went Nov 8 '15 at 3:14
  • Would like to add that this has out-of-the-box Unicode support, which is very nice. – Niek Mar 13 '17 at 19:00
  • You can also install github-markdown-css to if you want to use GitHub's CSS file. – jpmc26 Jun 9 '17 at 23:07
  • @jpmc26 how can you use it, I am no knowledge of javascript or npm? – Abhishek Bhatia Aug 16 '17 at 18:16
  • 1
    @AbhishekBhatia This is the first result when I Googled "npm introduction": smalljs.org/package-managers/npm. It's just a file buried in node_modules once you install it. – jpmc26 Aug 16 '17 at 18:51
48

Take a look at pandoc. It does have syntax highlighting. It might require you making (minor) changes to your document since it has its own flavour of markdown and I don't know how closely it matches the GitHub flavour.

| improve this answer | |
  • 4
    Thanks. Running pandoc -h did return support for GitHub Flavored Markdown, so I'm marking this question as resolved. – dillmo Feb 11 '14 at 23:49
  • 2
    I attempted to install pandoc on Fedora Linux and ran into a dependency nightmare - mainly LaTex related. My advice would be to skip pandoc and try other options first – IanB Aug 13 '15 at 1:13
  • For those who use non-ASCII letters and get them missing: add font options to pandoc, like these: --variable mainfont="Liberation Serif" --variable sansfont="Liberation Sans" – gluk47 Sep 13 '16 at 20:18
  • 6
    If someone is looking for just the commands: sudo apt install pandoc texlive-latex-recommended texlive-xetex texlive-luatex pandoc-citeproc etoolbox wkhtmltopdf (on Ubuntu, probably not all necessary), then pandoc --variable urlcolor=cyan myfile.md -o myfile.pdf – Tor Klingberg Jun 5 '17 at 15:31
  • 1
    This is the only thing that worked fully with anchors intact and other extra features: pandoc -f markdown -t html5 on-premise-admin-guide.md -o test.pdf worked after installing via homebrew and installing wkhtml2pdf. – James Campbell Oct 30 '19 at 3:10
13

If the markdown file was hosted on github repository, gitprint is an interesting option to create pdf / print.

All you need to do is to replace github.com by gitprint.com in the URL. Here is an example from gitprint's homepage.

Unfortunately, it does not work on markdown gists, and works only with markdown files at the repository.

| improve this answer | |
  • 5
    It does not work with images either. :( – Adam Arold Sep 2 '14 at 13:12
  • ...and is poorly formated :( – Moebius Apr 22 '16 at 19:20
  • Interesting option. Pros: external links are maintained and accessible from the output. Cons: output is black and white, anchor links are removed, external links are not visually indicated because they are b&w. – rodey Jan 10 '18 at 14:49
10

There's an online converter available at http://www.markdowntopdf.com
This provides syntax highlighting out of the box and is the simplest solution I've seen so far. It also correctly handles other features specific to GFM e.g. tables.

| improve this answer | |
  • 5
    Doesn't handle images in separate files. – Larry K Oct 16 '17 at 19:11
  • works beautifully – shadi Oct 20 '17 at 15:22
8

For those with Linux, use pandoc.

Install:

sudo apt install pandoc texlive-latex-extra

Yes, you need -extra package because of fonts.

Convert:

pandoc --from markdown -o output.pdf my-file.md
| improve this answer | |
  • 1
    Didn't include any images, links and ignored things like <font color="red"> though – derHugo Jan 11 '19 at 13:08
6

As I stated in my comment, Github uses Linguist to provide syntax highlighting. On Github, you can use this to specify syntax highlighting like so:

```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```

Unfortunately, there's no good way to convert Markdown directly to a PDF file with syntax highlighting.

Alternatives:

Vim:

If you have vim, you can easily achieve syntax highlighting by running the following from a terminal:

vim -c hardcopy -c quit /path/to/file.ps

Or inside of vim:

:hardcopy >/path/to/file.ps

This will produce a PostScript file that can be converted to pdf using, for example, ps2pdf:

ps2pdf /path/to/file.ps

Source-highlight:

If you'd like instead to go the route of HTML or LaTeX, you could try Source-highlight instead. A list of all languages supported by Source-highlight can be found here.

A few example Source-highlight commands include:

source-highlight -s java -f html -i Hello.java -o Hello1.html
source-highlight -s java -f html --input Hello.java --output Hello2.html --doc
source-highlight -s java -f html -i Hello.java -o Hello3.html --title "Happy Java with java2html :-)" --tab 3

Using this input file

And each outputting their own respective HTML file:

Hello1.html
Hello2.html
Hello3.html

Further examples of Source-highlight usage can be found here

Windows:

Vim, ps2pdf (provided by Ghostscript) and Source-highlight are all available via Cygwin.

| improve this answer | |
3

I have recently created a service to convert markdown documents to PDF. It supports Github flavoured markdown as well as syntax highlighting. The service is located at: http://markdown2pdf.com

| improve this answer | |
  • doesn't work with zip file : couldn't find the markdown file in the archive while there is one. – Moebius Apr 22 '16 at 19:26
  • got "error in conversion to pdf". Using markdowntopdf.com instead from kevgathuku – shadi Oct 20 '17 at 15:22
1

Mine solution: convert markdown with pandoc to html (don't forget to use css for pandoc to show table borders), then open it with libreoffice, choose an option export as pdf.

NB: neither of mentioned here and on the Internet solutions worked for me: 1) browser-based solutions (i.e. grip) are adding excess info, like page numbers, which I didn't manage to remove, 2) pandoc convertage to pdf is broken, for me it generates an empty table (perhaps because of unicode, and yes, I configured it to use xetex), 3) site based solutions (i.e. gitprint.com) are also adding redundant things, like github-like margins, whereas I need just a simple table I generated with awk!

| improve this answer | |
  • 1
    pandoc should work for you with options like --variable mainfont="Liberation Serif" --variable sansfont="Liberation Sans" – gluk47 Sep 13 '16 at 20:17
  • @gluk47 cool, that works! – Hi-Angel Sep 19 '16 at 14:10
  • I can recommend this page for converting markdown to PDF (or for printing) markdownprint.com. – Johan O Apr 21 '18 at 13:56
  • @JohanO markdownprint.com seems to be down – derHugo Jan 11 '19 at 13:10
1

I have tried several chrome plugins and online converters.
MDtr2PDF is the best one. It supports Github-flavoured-markdown and unicode.

| improve this answer | |
  • 1
    Does it support images stored in other files? – Larry K Oct 16 '17 at 19:12
  • No longer seems to be working, and is not TLS-secured. – David Oliver May 16 '19 at 14:47
  • This link is dead – Adam Lassek Jan 30 at 17:24
1

I refined this snippet for my personal needs:

# sudo apt install grip wkhtmltopdf

MD=${1:-README.md}
PDF=${2:-"$MD".pdf}
PORT=8971
DELAY=10

printf "Converting $MD to $PDF on port $PORT\n"
printf "Waiting $DELAY seconds for server to start...\n"

grip "$MD" localhost:$PORT &
sleep $DELAY
wkhtmltopdf http://localhost:$PORT "$PDF"
kill $(ps -eo pid,command | grep grip | grep -v grep | awk '{print $1}')

Save as /usr/local/bin/md2pdf and sudo chmod +x /usr/local/bin/md2pdf afterwards.

Usage:

  • md2pdf converts README.md to README.md.pdf

  • md2pdf foo.md converts foo.md to foo.md.pdf

  • md2pdf foo.md bar.pdf converts foo.md to bar.pdf

| improve this answer | |
1

I had the most luck with VSCode and the Markdown PDF extension. The online converters screwed up the encoding for my files or inserted watermarks in the header.

Usage:

  1. Install the extension
  2. Open your MD file with VSCode, make sure Markdown highlighting is enabled
  3. Open the command palette (F1), type export and select markdown-pdf: Export (pdf)

NB: The extension installs and uses a local version of Chromium in the background.

There are several options to control formatting, they are all explained on the website linked above

| improve this answer | |
0

I just convert from HTML instead. This works for my needs:

https://github.com/dompdf/dompdf

I found that in general Markdown is not a good format to convert to PDF, as it doesnt have native CSS support. Here is the script I use:

<?php
require 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;

$dompdf = new Dompdf();
$dompdf->getOptions()->setIsFontSubsettingEnabled(true);
$s_in = file_get_contents('index.html');
$dompdf->loadHtml($s_in);

$dompdf->render();
$s_out = $dompdf->output();
file_put_contents('index.pdf', $s_out);

This solution just needs PHP (25 MB) and DomPdf (4 MB), so quite lightweight compared to other options.

| improve this answer | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.