|
| 1 | +--- |
| 2 | +title: Mermaidのグラフをpdfにする |
| 3 | +description: Mermaidで作成した図表のみのpdfを作成する。 |
| 4 | +category: tech |
| 5 | +author: TaPet |
| 6 | +tags: [advent-calendar, markdown] |
| 7 | +--- |
| 8 | + |
| 9 | +import {Image} from 'astro:assets'; |
| 10 | +import mdToPdf from './2024-12-21-Mermaid-to-pdf/md-to-pdf.png'; |
| 11 | +import Inkscape from '2024-12-21-Mermaid-to-pdf/Inkscape.png'; |
| 12 | +import rsvgConvert from '2024-12-21-Mermaid-to-pdf/rsvg-convert.png'; |
| 13 | +import Cairosvg from '2024-12-21-Mermaid-to-pdf/Cairosvg.png'; |
| 14 | +import headless1 from '2024-12-21-Mermaid-to-pdf/sample_1.png'; |
| 15 | +import headless2 from '2024-12-21-Mermaid-to-pdf/sample_2.png'; |
| 16 | +import svg from '2024-12-21-Mermaid-to-pdf/sample.svg' |
| 17 | + |
| 18 | + |
| 19 | +この記事は[OUCC Advent Calendar 2024](https://adventar.org/calendars/10655)の21日目の記事です。 |
| 20 | + |
| 21 | +## 追記 |
| 22 | +[mermaid-cli](https://github.com/mermaid-js/mermaid-cli)を使って、 |
| 23 | +```bash |
| 24 | +mmdc --pdfFit -i input.mmd -o output.pdf |
| 25 | +``` |
| 26 | +で行けました。 |
| 27 | +[みやじ](https://oucc.org/blog/authors/miyaji/)さんに教えていただきました。ありがとうございます。 |
| 28 | + |
| 29 | +## 記事作成後の気づき |
| 30 | +[SVGからPDFへの変換はHeadless Chromeでやろう(と思ったけどやっぱりrsvg-convertでやろう)](https://qiita.com/s417-lama/items/747be70c35204d4e1b39#headless-chrome)の最後にも書いてありましたが、Headless Chromeを使うと、ラスタ画像になっていました。~~(ちゃんと読んでないのが悪い)~~ これでは、この記事の目的は達成できていません。(ラスター画像なら、[mermaid-cli](https://github.com/mermaid-js/mermaid-cli)で作成できる。) |
| 31 | +→svgファイルをいじって、ほかの方法で文字が表示されるようにするしかない? |
| 32 | + |
| 33 | +--- |
| 34 | + |
| 35 | +試した手法とその結果も載せています。 |
| 36 | +最終的な方法だけ見たい方は、[結論](#結論)を見てください。 |
| 37 | + |
| 38 | +## やりたかったこと |
| 39 | +学校の課題で、 LaTeXでレポートを書く必要がありました。 |
| 40 | +その際、状態遷移図を乗せる必要があったので、Mermaidで簡単に作ってしまおうと思いましたが、作った画像をどう表示させようか悩みました。 |
| 41 | +LaTeXにsvgを張るのは面倒 (LaTeXのことをよくわかってない) ので、pdfにして表示しようと思いましたが、うまく変換できませんでした。 |
| 42 | +~~なお、ベクター画像でなければならない理由はない。やりたかっただけ~~ |
| 43 | + |
| 44 | +## 試した方法 |
| 45 | +pdfは載せられないので、pngに変換して載せます。 |
| 46 | +### Markdown内に書いて、pdfで出力 |
| 47 | +いくつかの変換方法を試しましたが、文書として出力されるため、画像のみのpdfは出力できませんでした。 |
| 48 | +pdf内にグラフが小さく表示されてしまいます。 |
| 49 | + |
| 50 | +<Image src={mdToPdf} alt="" width="600px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/> |
| 51 | + |
| 52 | +### Mermaid → svg → pdf |
| 53 | +[mermaid-cli](https://github.com/mermaid-js/mermaid-cli) というMermaidをsvg/png/pdfに変換できる、cliアプリケーションが見つかりました。これで、Mermaidをsvgに変換し、それをpdfに変換する方法を試しました。 |
| 54 | +#### Inkscape |
| 55 | +Inkscapeで、`inkscape --export-type="pdf" sample.svg`などとして、pdfに変換しようと思いましたが、うまくいかず、黒塗りの画像が出てきてしまいました。mermaid-cliで生成されるsvgには、Inkscapeが想定していない情報も書いてあるようで、そのために処理がうまくいかないようでした。 |
| 56 | + |
| 57 | +<Image src={Inkscape} alt="" width="600px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/> |
| 58 | + |
| 59 | +#### 別の方法 |
| 60 | +[SVGからPDFへの変換はHeadless Chromeでやろう(と思ったけどやっぱりrsvg-convertでやろう)](https://qiita.com/s417-lama/items/747be70c35204d4e1b39#headless-chrome)を見つけ、そこで紹介されていた、rsvg-convert、Cairosvgは、文字が描画されませんでした。 |
| 61 | + |
| 62 | +<ul style="display: flex;"> |
| 63 | +<il><figure><Image src={rsvgConvert} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>rsvg-convert</figcaption></figure></il> |
| 64 | +<il><figure><Image src={Cairosvg} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>Cairosvg</figcaption></figure></il> |
| 65 | +</ul> |
| 66 | + |
| 67 | +Headless Chromeでは、ページいっぱいの大きさのグラフが載ったpdfを作成できました。 |
| 68 | +<ul style="display: flex;"> |
| 69 | +<il><figure><Image src={headless1} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>1ページ目</figcaption></figure></il> |
| 70 | +<il><figure><Image src={headless2} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>2ページ目</figcaption></figure></il> |
| 71 | +</ul> |
| 72 | + |
| 73 | +## 結論 |
| 74 | +Mermaidのみを、ファイルに書き、[mermaid-cli](https://github.com/mermaid-js/mermaid-cli)で、svgに変換し、[SVGからPDFへの変換はHeadless Chromeでやろう(と思ったけどやっぱりrsvg-convertでやろう)](https://qiita.com/s417-lama/items/747be70c35204d4e1b39#headless-chrome)で紹介されている、[svg2pdf.bash](https://gist.github.com/s417-lama/84bf66de1096c4587e8187092fb41684)を使って、pdfに変換する。 |
| 75 | +ただし、このpdfには、謎の2ページ目が存在するので、1ページ目のみを使用する。(1ページ目のみを参照するなり、別ファイルに1ページ目のみを書き出すなりしてください。) |
| 76 | + |
| 77 | +<details> |
| 78 | +<summary>サンプル</summary> |
| 79 | + |
| 80 | +Mermaidファイル(sample.mmd)の記述 |
| 81 | + |
| 82 | +```mermaid |
| 83 | +graph TD |
| 84 | +a-->b |
| 85 | +a-->c |
| 86 | +b-->d |
| 87 | +c-->e |
| 88 | +d-->e |
| 89 | +``` |
| 90 | + |
| 91 | +sample.mmdの出力内容 |
| 92 | +<Image src={svg} alt=""/> |
| 93 | + |
| 94 | +PDF |
| 95 | +<ul style="display: flex;"> |
| 96 | +<il><figure><Image src={headless1} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>1ページ目</figcaption></figure></il> |
| 97 | +<il><figure><Image src={headless2} alt="" width="300px" style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"/><figcaption>2ページ目</figcaption></figure></il> |
| 98 | +</ul> |
| 99 | + |
| 100 | +</details> |
0 commit comments