MS-Wordは多くの企業で使われている文書ファイル作成ソフトですが、様々なプラットフォーム間で文書のやり取りをする場合に不便です。対してMarkdownはフリーでわかりやすく、多くのエンジニアに愛されています。ここではPandocとPythonを使って.docxをMarkdownに変換する方法を紹介します。
こんにちは。wat(@watlablog)です。ここではwordの.docxをMarkdown(.md)に変換する方法を学びます!
PandocとPythonを使ってファイル変換する意味
Pandocとは?
Pandocはフリーかつオープンソースのドキュメントコンバータです。実は今回実施する.docxを.mdに変換する大部分はこのPandocによってなされます。
公式ページはこちら。
https://pandoc.org/
なんと日本語のユーザーガイドもありました。
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の「見出し」を使ったり、画像(当ブログのロゴ)が貼ってあります。
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形式のファイルに変換します。
1 |
pandoc -s sample.docx -o sample.md |
こちらが変換結果です。まずはテキストファイルをそのまま見てみましょう。MarkdownではH1、H2の見出しを「#」や「##」で表現します。また、画像は画像URLの記載がされていることも確認できますね。改ページは特に何もないようです。これは仕様ですかね。
.mdファイルをで表示させてみましょう。表示にはJupyterLabを使いました。.mdファイルをそのまま表示させ、右クリックで「Show Markdown Preview」をクリックすれば表示がされます。このままでは画像が表示されないことを確認できたと思います。
手動でmediaフォルダをコピーする
WordはZIPファイルなので、sample.docxをコピーし、拡張子を.zipにすれば中身を確認できます。
wordフォルダの中にmediaフォルダがあるので、このmediaフォルダをコピーしましょう。
sample.mdファイルのある場所に貼り付けます。
これで.mdファイルを開くと画像が表示されます(画像でかすぎた)。
あとはこれを手動ではなくPythonでやれば全自動変換器ができますね!
PythonでPandocと.docxを操作して画像付き.mdを作成する
Pandocを操作する
PandocをPythonから操作するにはsubprocessを使います。次のコードで先ほどのコマンドと同じ動作をさせましょう。
1 2 3 |
import subprocess subprocess.run(['pandoc', '-s', 'sample.docx', '-o', 'sample.md']) |
これで先ほどと全く同じ動作(.mdファイルが作成される)が実行されるはずです。
ZIPファイルを操作する
Pandocはsubprocessで簡単に扱うことができました。次は画像をリンクさせるために、先ほど手動で.docxを.zipに変換してmediaフォルダをコピぺした内容をPythonで書いていきましょう。
次のコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import subprocess import zipfile import shutil import os # ファイル名 docx_file = 'sample.docx' md_file = 'sample.md' zip_file = 'temp.zip' # フォルダ extract_dir = 'extracted' media_dir = 'media' # docxファイルをzipファイルとしてコピー shutil.copy(docx_file, zip_file) with zipfile.ZipFile(zip_file, 'r') as zip_ref: if not os.path.exists(extract_dir): os.makedirs(extract_dir) zip_ref.extractall(extract_dir) # Pathをjoin extracted_media_path = os.path.join(extract_dir, 'word', 'media') if os.path.exists(extracted_media_path): # 最終的なmediaディレクトリが存在しなければ作成 if not os.path.exists(media_dir): os.makedirs(media_dir) # mediaフォルダ内のファイルをコピー for filename in os.listdir(extracted_media_path): shutil.copy(os.path.join(extracted_media_path, filename), media_dir) # 一時ファイルをクリーンアップ os.remove(zip_file) shutil.rmtree(extract_dir) # Pandocのコマンドを実行し.docxを.mdへ変換する subprocess.run(['pandoc', '-s', docx_file, '-o', md_file]) |
このコードを実行すると、先ほど手動で実行した内容が自動でできることを確認できると思います。
shutilというライブラリでファイル操作を行い、zipfileというライブラリでZIPファイルの操作を行っています。
まとめ
PandocとPythonを使って.docxから.mdへのファイル変換が簡単にできました。Pythonを使うことでPandoc単体ではできなかった画像付き文書の変換も問題なくできたようです。
次は特定のブロックを任意の形式に変換するような処理を書いていく予定です。
最近Markdownを書く機会が増えてきたので、生産性を上げるプログラムがかけてよかったです!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!