📝

MarkdownファイルをPDFに変換するCLIを作った【Deno】

2024/12/07に公開

Deno Advent Calendar 2024 7日目の記事です。
https://qiita.com/advent-calendar/2024/deno

動機

エンジニアなら履歴書や職務経歴書、あるいは仕様書などをMarkdownで書き、PDFに変換したいという需要が多々あると思います。MarkdownファイルをPDFに変換する方法は千差万別ありますが、個人的にはCLIで行なえると便利です。

Node.js製のmd-to-pdfはコマンド1つで簡単にPDFに変換できて便利だったので使っていましたが、残念ながらDenoでは互換性の問題で動きませんでした。そのため、自分でMarkdownファイルをPDFに変換するCLIをDenoで作ってみました。

成果物

md2pdf

https://github.com/ryuapp/md2pdf
https://jsr.io/@ryu/md2pdf

使用しているライブラリ

  • 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をお待ちしております。
https://github.com/ryuapp/md2pdf

Discussion