PandocとPythonで画像付きWord文書をMarkdownに変換する

  • このエントリーをはてなブックマークに追加

MS-Wordは多くの企業で使われている文書ファイル作成ソフトですが、様々なプラットフォーム間で文書のやり取りをする場合に不便です。対してMarkdownはフリーでわかりやすく、多くのエンジニアに愛されています。ここではPandocとPythonを使って.docxをMarkdownに変換する方法を紹介します。

こんにちは。wat(@watlablog)です。ここではwordの.docxをMarkdown(.md)に変換する方法を学びます

PandocとPythonを使ってファイル変換する意味

Pandocとは?

Pandocはフリーかつオープンソースのドキュメントコンバータです。実は今回実施する.docxを.mdに変換する大部分はこのPandocによってなされます。
公式ページはこちら。
https://pandoc.org/

Advertisements

なんと日本語のユーザーガイドもありました。
https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html

Pythonはどこで使う?

Pandocで.docxから.mdへ変換するのは簡単にできますが、今回はPythonも使います。

Pandocだけで十分では?

…と思うかも知れませんが、ちょっと細かい変換を行いたい時にPythonを使って一連の変換処理ができると便利です。この記事ではそんな例の一つである「画像付き文書」の変換について紹介します。

画像付き文書を変換するのにひと手間加える

画像付きの.docxを変換しても、.mdには画像が表示されません。
しかしPandocは画像のある場所に画像URLを残してくれています。Wordの.docxは画像ファイルのリストを内部に保有しているので、その情報をPythonで抽出するだけです。

WordはExcelやPowerPointと同様に、その本質はZIPファイルです。
手動で.docxを.zipに変換し、中身のmediaフォルダをコピーしてくれば良いのですが…ファイルがたくさんあったらかなり大変な作業になります。

面倒なことはPythonにやらせましょう!

動作環境

本記事のコードは以下の環境で動作を確認しました。Pythonは全て標準ライブラリで書いています。

Windows OS Windows10 64bit
CPU Intel 11th Core i7-11800H:2.3[GHz]
メモリ 16[GB]
Python Python 3.9.6
PyCharm (IDE) PyCharm CE 2020.1

まずはPandocと手動操作で画像付き.docxを.mdにする

サンプルの.docxファイル

今回はこちらのdocxファイルをサンプルに使います。是非自分の環境にダウンロードして使ってください。

こちらがファイルの中身を示した図です。Wordの「見出し」を使ったり、画像(当ブログのロゴ)が貼ってあります。

.docxの内容

Pandocをインストールする

Pandocのインストールはこちらのインストーラをダウンロードして使うのが最も簡単です。
https://github.com/jgm/pandoc/releases/tag/3.1.11.1

色々なインストール方法についてはこちらのQiita記事がわかりやすいです(先ほどの日本語ユーザーガイドの方かな?)。
Pandocの比較的簡単なインストール方法

Pandocで.docxを.mdに変換する

文書ファイルのあるフォルダで、Windowsであればコマンドプロンプト、macOSであればターミナルを起動して以下のコマンドを打ち込みます。
このコマンドでsample.docxをsample.mdというMarkdown形式のファイルに変換します。

こちらが変換結果です。まずはテキストファイルをそのまま見てみましょう。MarkdownではH1、H2の見出しを「#」や「##」で表現します。また、画像は画像URLの記載がされていることも確認できますね。改ページは特に何もないようです。これは仕様ですかね。

変換結果(テキスト)

.mdファイルをで表示させてみましょう。表示にはJupyterLabを使いました。.mdファイルをそのまま表示させ、右クリックで「Show Markdown Preview」をクリックすれば表示がされます。このままでは画像が表示されないことを確認できたと思います。

.mdファイル(Notebook)

手動でmediaフォルダをコピーする

WordはZIPファイルなので、sample.docxをコピーし、拡張子を.zipにすれば中身を確認できます。
wordフォルダの中にmediaフォルダがあるので、このmediaフォルダをコピーしましょう。

ZIPファイルの中身

sample.mdファイルのある場所に貼り付けます。

mediaフォルダのコピー

これで.mdファイルを開くと画像が表示されます(画像でかすぎた)。

.mdファイル(画像付き)

あとはこれを手動ではなくPythonでやれば全自動変換器ができますね!

PythonでPandocと.docxを操作して画像付き.mdを作成する

Pandocを操作する

PandocをPythonから操作するにはsubprocessを使います。次のコードで先ほどのコマンドと同じ動作をさせましょう。

これで先ほどと全く同じ動作(.mdファイルが作成される)が実行されるはずです。

ZIPファイルを操作する

Pandocはsubprocessで簡単に扱うことができました。次は画像をリンクさせるために、先ほど手動で.docxを.zipに変換してmediaフォルダをコピぺした内容をPythonで書いていきましょう。
次のコードを書きます。

このコードを実行すると、先ほど手動で実行した内容が自動でできることを確認できると思います。

shutilというライブラリでファイル操作を行い、zipfileというライブラリでZIPファイルの操作を行っています。

まとめ

PandocとPythonを使って.docxから.mdへのファイル変換が簡単にできました。Pythonを使うことでPandoc単体ではできなかった画像付き文書の変換も問題なくできたようです。
次は特定のブロックを任意の形式に変換するような処理を書いていく予定です。

最近Markdownを書く機会が増えてきたので、生産性を上げるプログラムがかけてよかったです!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*