2016/10/06

Markdown→PDF変換ツールの入れ方、使い方

こんにちは、製品開発部の清水です。

業務でGitHubを使いドキュメントの作成・管理を行っているため、Makrdownを最近よく使用しています。
Markdownはフォーマットがシンプルなので、文書が書きやすく、保守管理も楽です。
ただし、他人にMarkdown文書を共有する際には、PDFなどの一般的なフォーマットに変換する方が無難です。
MarkdownからPDFへ変換できれば、納品物としても耐えうる文書も作成できます。

そこで、MarkdownをPDFに変換するツールをいくつか導入してみましたが、その過程で色々とつまづきポイントがありました。
そこで今回は、Markdownの普及のためにも、つまづきポイントも含め、ツールの導入手順を書き留めておこうと思います。
なお、使用したOSはWindows10です。

試した変換ツールは以下の2つです。

  1. markdown-pdf
  2. Pandoc

1. markdown-pdf

 

Markdown→PDFの変換を直接してくれます。
Node.jsで作られており、javascriptで変換設定を書くことができます。

 

1.1 markdown-pdfのインストール

markdown-pdfのインストールにはNode.jsのパッケージ管理ツールnpmが必要です。
Node.jsサイトからインストールしてください。

markdown-pdfのインストール

インストールが完了したら、変換を実行

1.2 CSSの適用

しかし、markdown-pdfにはバグがあって、そのままではWindows環境だとCSSが適用されません。
Issue:CSS doesn’t load on windows – fix

Issueを見ると、render.jsのパス指定を書き換えれば良さそうです。
render.jsは、自分の環境では C:\Users\[UserName]\AppData\Roaming\npm\node_modules\markdown-pdf\phantom 配下に入っていました。

render.jsの15行目を変更します。
変更前)

変更後)

これでCSSを適用できます。

今回はこちらのgithub.cssをお借りしました。

 

github.cssを適用したPDF出力例:

2. Pandoc

 

MarkdownやPDFに限らず、様々なフォーマット間の変換ができます。Haskell製。
ドキュメントが充実しているのに加え、有名なツールなので、困ったときの検索結果が豊富です。
日本語のユーザーズガイドもあります。

 

2.1 Pandocのインストール

Windowsの場合、Pandocのインストーラがあります。
インストールページ:Pandoc – Installing

PandocはPDF変換の際にLaTeXを中継します。
Pandoc標準のLaTeXは日本語に非対応なため、日本語に対応しているLuaLaTeXが必要です。
LuaLaTeXが含まれているTeXLiveというパッケージをインストールします。
インストール方法は下記のWikiを参照してください。
参考:TeX Live/Windows – TeX Wiki

インストールが完了したら、変換します。

PDF出力例:

LaTeXを挟むと<img>タグは無効になってしまうようです。

2.2 CSSの適用

自分で色々試したところ、PandocではPDFへの変換にLaTeXを使用するため、CSSの適用はできないようです。
LaTeXには、スタイルを整える手段としてテンプレートという機能があるようですが、自分がLaTeXに強くないのでここでは紹介しません。
今回は、MarkdownをHTML化して、Chromeブラウザの印刷機能でPDFへ変換する方法を紹介します。

まずMarkdownをHTMLに変換します。

出力されたHTMLファイルをChromeで「PDFに保存」をします。

これでCSSが適用されたPDFが生成されます。

github.cssを適用したPDF出力例:


所感

 

実用的には、色々なフォーマットをサポートしていて、ドキュメントが豊富なPandocの方が良さそうに思いました。

しかしながら、PDF出力にはLaTeXが必要なため、環境構築やスタイル設定が難しいというデメリットもあります。
ちょっとしたメモやテキストをPDF化したい場合は、markdown-pdfの方が便利そうです。

個人的には、Markdown→HTML→PDFのルートが一番きれいにスタイル設定が出て良いと思いました。
HTMLからPDFの変換に別のツールを使えば、変換の自動化もできそうです。

今後は細かいルール設定やスタイル設定も使ってみて、詳しく有用性を検討していきたいです。