MarkdownファイルをPDFに変換するCLIを作った【Deno】
Deno Advent Calendar 2024 7日目の記事です。
動機
エンジニアなら履歴書や職務経歴書、あるいは仕様書などをMarkdownで書き、PDFに変換したいという需要が多々あると思います。MarkdownファイルをPDFに変換する方法は千差万別ありますが、個人的にはCLIで行なえると便利です。
Node.js製のmd-to-pdfはコマンド1つで簡単にPDFに変換できて便利だったので使っていましたが、残念ながらDenoでは互換性の問題で動きませんでした。そのため、自分でMarkdownファイルをPDFに変換するCLIをDenoで作ってみました。
成果物
使用しているライブラリ
- Denoの標準ライブラリ
- CLIの作成やファイルパス周りの処理で使用
-
md4w
- MarkdownファイルをHTMLに変換するライブラリ
- markedやmarkdown-itなどが主流ですが、Zig製だったので一旦採用
-
Astral
- Deno向けのpuppeteerライクなブラウザ操作ライブラリ
- HTMLにしたMarkdownファイルをPDFに変換する際に使用
仕組み
ローカルでHTTPサーバーを構築しMarkdownファイルをHTMLに変換して一時的に配信します。そして、Astralを使ってヘッドレスブラウザでWebページとしてレンダリングした後にPDFに変換しています。
MarkdownからPDFに直接変換するライブラリもありますが、その場合見た目をコントロールするのが面倒になるため、この手法を採用しています。
使い方
Denoがインストールされている環境で、jsrから下記のコマンドでインストールできます。
deno install -grA jsr:@ryu/md2pdf/cli
MarkdownファイルをPDFに変換するには、下記のコマンドを実行するだけです。
md2pdf README.md
CSSの使用
記事作成時点ではデフォルトのCSSが何も適用されていないため、見た目があまりよくありません。
md2pdfではCSSファイルを指定することでHTMLの見た目を変更できます。
md2pdf README.md --stylesheet=style.css
コマンドの引数以外にMarkdownファイルのフロントマターでCSSファイルを指定することもできます。
---
stylesheet: style.css
---
# Hello World
watch機能
Markdownファイルを書いた後にCLIを都度実行するのは面倒なので、ファイルの変更を検知して自動でPDFに変換するwatch機能もあります。
md2pdf README.md --watch
最後に
最低限の機能は揃えましたが、デフォルトのCSSがなかったり、PDFの細かい設定が出来なかったりで足りていない機能があるので、今後も改善していきたいと思います。
もし、興味があればStarやIssue、Pull Requestをお待ちしております。
Discussion