Site cover image

@recording117’s blog

@recording117のastro-notion-blogです。

⌨️ Notion → Wordへの変換

💡
Notionのページをmdファイルで書き出し,wordファイルに変換する試みのログです。
This is the log of an attempt to export a Notion page as an md file and convert it to a word file.

NotionをWordファイルに変換したい!

今回は,少しマニアックな内容です。

突然ですが,私は授業準備をするとき,Notionのデータベースを使っています。Notionは無駄な情報が少なく,とてもシンプルなUIが特徴です。そのシンプルさゆえ,Wordよりも文書作成が捗るような気がしています。

また,Youtubeや画像の貼り付け等がしやすく,学校のChromebookからもブラウザで閲覧できる点もお気に入りです。

Notionの授業準備画面

しかし,Notionには欠点があります。それは,印刷には向いていないという点です。一応Notionのページはpdfにエクスポートして,印刷することはできます。ですが,細かいレイアウトの設定はできません。

授業の流れや板書計画を考える際は,黒板のアスペクト比に近い方が好みです。Wordなら,A4の2段組レイアウトで対応できるのですが,Notionでそれを実現しようとすると難易度が高いです。

このような欠点があるため,Notionのページを手作業でWordにコピペし,体裁を整えてから印刷していました。

先ほどのNotionの内容をWordファイルにコピペし,体裁を整えたもの。

コピペしてそのまま体裁が整えばいいのですが,微妙に崩れてしまうことが多いです。授業準備をするたびにこれをやるのは大変。ということで,

👓
NotionからWordファイルにうまく変換したい…!

と思っていました。

ステップ1 Notionのページをmdファイルにエクスポートする

Notionのページは,他のファイル形式にエクスポートすることができます。ページ右上のメニュー(…)から「Export」を選択するとこのようなメニューが出てきます。

「Export format」を「Markdown & CSV」に設定してエクスポートします。

エクスポートしたmdファイル

エクスポートしたmdファイルをVScodeなどのテキストエディタで開きます。上部には,データベースのプロパティが表示されています。Notionのページで2段レイアウトを設定していると,htmlの<aside>タグが追加されるようです。

後にwordファイルに変換するときに邪魔になってしまうので,2段レイアウトは設定しないほうが良さそう。

また,calloutブロックの中に改行があると,太字設定の「**」がうまく機能しないようです。mdファイルを少しいじって,次のようにしました。

エクスポートしたmdファイル(改良ver.)

mdファイルの上部にoutputなどのメタデータを追加しました。このあたりはあまり詳しくなかったので,色々と調べながらやってみました。

ステップ2 mdファイルをwordファイル(.docx)に変換する準備

続いて,mdファイルをwordファイルに変換します。この操作のため,Pandocというツールを使いました。フリーのドキュメント・コンバーターツールです。mdファイルをwordファイルに変換してくれます。

上記のサイトでも触れられているのですが,mdファイルをそのままwordファイルに変換すると,wordデフォルトの設定が反映され,少しダサくなります。しかも,A4の横書き2段組になっていない…。

そこで,自分で作成したwordのテンプレートを適用して変換します。通常,wordのテンプレートといえば(.dotx)ですが,(.docx)でも構いません。少し設定の方法がややこしいので,下記のサイトを参考にしてください。

日本語サイトは情報が限られているので,必要であれば公式ドキュメント(英語版)も参考に。

(※日本語に翻訳されたユーザーズガイドもありますが,英語のほうがわかりやすい)

変換前のmdファイルを「input.md」,wordのテンプレートを「reference.docx」,変換後のwordファイルを「output.docx」として,VScodeのPowerShellに以下のコマンドを実行します。

$ pandoc input.md --reference-doc=reference.docx -o output.docx
PowerShellに入力するコマンド

これで変換できますが,オプションをたくさん付けたいとき,コードが長くなってしまいます。そこで,「default.yml」に設定を書き込み,コマンドを実行するときに読み込ませるようにしました。

from: markdown+emoji
to: docx
reference-doc: 【reference.docxのフルパス】
default.yml

$ pandoc input.md -d default.yml -o output.docx
PowerShellに入力するコマンド(改良ver.)

他にも色々と設定できるらしいです。

番外編 VScodeのスニペット設定(Markdown)

ちなみに,ステップ1の後半でmdファイルの上部にメタデータを追加していますが,これを毎回入力するのは面倒です。どうにかならないかと検索すると,VScodeにはスニペット機能があるらしい。

こちらのサイトを参考に,スニペットを設定しました。Markdownのスニペットは,デフォルトで無効になっているらしく,有効にするための設定が必要でした。

{
	"jugyou": {
		"prefix": "jugyou",
		"body": [
			"---",
			"output: word_document",
			"date:  $CURRENT_YEAR/$CURRENT_MONTH/$CURRENT_DATE",
			"subject: \"授業準備\"",
			"description: \"授業準備\"",
			"fig_caption: True",
			"#toc: True",
			"#toc_float: True",
			"---",
		],
		"description": ""
	},
}
markdown.json

jsonとスニペットの記法が分からず,少し苦労しました。tocとtoc_floatは,目次を作るときだけ#を外して使います。

ステップ3 いよいよ変換

いよいよ変換です。ステップ2で記載したコードをPowerShellで実行します。

$ pandoc input.md -d default.yml -o output.docx
PowerShellに入力するコマンド(改良ver.)

output.docx

できました!

word側の設定を頑張ったので,これまで通り(これまで以上に)きれいなレイアウトで出力することができました。

複数ファイルを一括で変換するときには,先ほどのコードの「input.md」と「output.docx」の名前を逐一変えて…といった面倒なことはやりません。

chat GPTくんにご教示いただきながら,.batファイルを作成しました。

@echo off
FOR %%F IN (*.md) DO (
    set "input=%%F.md"
    set "output=%%~nF.docx"
    pandoc -d default.yml -s %%F -o %%~nF.docx
)
md2word.bat

これを実行すると,同じディレクトリ配下にある「*.md」ファイルが全て「*.docx」に変換されます。

(途中の「set ~」の2行はいらないかも?)

まとめ

よく分からない部分もありながら,なんとか1日で動くものを作ることができました。まだ画像を含んだファイルを変換していないので,どうなるのか動かしながら確認してみたいと思います。