Skip to content

Commit 02b0e9b

Browse files
authored
Merge branch 'main' into blog/kaki-adventcalender
2 parents c382f01 + a78cb45 commit 02b0e9b

23 files changed

+598
-0
lines changed

src/content/authors/Rui.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"name": "Rui",
3+
"github": "Rui-32"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"postDate": "2024-12-22T08:18:17.106Z",
3+
"updateDate": "2024-12-23T13:24:42.943Z"
4+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"postDate": "2024-12-23T05:20:00.630Z"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"postDate": "2024-12-22T15:04:11.245Z"
3+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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>
12 KB
Loading
14.9 KB
Loading
45.6 KB
Loading
12 KB
Loading
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)