2018.12.28 斎藤

python-docxを使って、Wordの書体を調べてみた(失敗編)

python-docxを使ってwordの書体を調べてみた。

TL;DR(長くて読めない!3行で!)
● Wordの書体情報を調べるのが面倒
● pythonスクリプトの、python-docxライブラリで楽に調べられないか?
● 作ってみた。でもなんかダメでした。
失敗しています!ですが、同じことを考えている方の参考になれば、と思い公開します)
実行ファイルはこちらから。

とかくWordはややこしい

はじめまして、営業部の斎藤です。
営業部内ではシステム寄りの案件を担当することが多いです。

 

さて、印刷会社の営業職を悩ませるものに、
Officeファイルがあります。

 

MicrosoftはOfficeファイルの”見た目の”絶対性より、
(自社製品群内の)様々な環境で、とりあえずデータを開いて扱えること(可搬性)を重視しています。そのためかフォントが不足していても気に留めてはくれません。

画面画像、フォントが見つからない警告
AppleやAdobeの製品では、ファイルを開くだけで
フォント不足の警告がでてきますが、

 

 

画面イメージ、警告もなくフォントの無いファイルが開く一方のWordでは警告もなくファイルを開き、
そのまま編集までできてしまいます。

 

弊社は、お客さまの希望どおりに制作・印刷することを大切にしています。
頂いたWordファイルに使われているフォントが弊社に無い場合、
印刷物の見た目が変わってしまうため大問題です。
不足するフォントは、以下の手順で調べています。

メニューからオプションをクリックメニューから【オプション】を選択

 

手順2.詳細設定をクリック【詳細設定】を選択

 

手順3.フォントの置換【フォントの置換】ボタンをクリック

 

いや、、、あらためて、これわけわからん。
特に【詳細設定】からフォントを調べる流れが、つながりません。
なんかこう、もっと手軽にできないだろうか、と思うのです。

 

スクリプトを作って、楽になってしまいたい。

1つ2つのチェックならよいのですが、
大量のwordファイルをチェックすることもあり、
スクリプトを自作して省力化したいと思っていました。

 

しかし、公式のdocxファイル仕様書は、
仕事の片手間で読みこなすには厳しい内容です。
そこで今回は、先人の知恵をお借りして、
pythonとpython-docxライブラリで楽をしようと思います。

 

(以下のサイトを参考にさせてもらいました。)
技術メモ集ーPythonでword,docxファイルを操作・置換する(python-docx)
Python-docx公式ドキュメント
公式ドキュメントは、前半のチュートリアルが冗長なので、後半のAPI解説から読むほうがわかりやすかったです。

Pythonについて

pythonは手軽に利用できるプログラム言語(スクリプト)です。
ライブラリ(先人の知恵)がとても充実しているので
私のようなノンプログラマーが仕事で楽をするのにも、向いています。
python-docx は、Wordのdocxを扱うためのライブラリです。
オープンソースで開発・公開されています。

 

とりあえず書いてみた。

python-docxで読み込んだWordファイルは、以下のような構造になります。

Documentオブジェクトは、Paragraphsリスト、Tablesリストを持つTableオブジェクトは、Row、Cellオブジェクトを介して、Paragraphを持つ

読み込んだファイル自体を示すDocumentから、
Paragraph(段落)Table(表組み)のリストを取得でき、
Paragraphオブジェクトは、Runオブジェクトを持つ。

ParagraphからはRun(同じ書式の文字の並び)を取得できます。
Documentから順に総当たりでRunをたどり、
フォント情報を参照すれば楽勝そうですね。
(ヘッダー/フッダー、Wordアートに含まれる
フォントが取得できなさそうですが、目をつぶりましょう!;))

 

さくっとスクリプト(プログラム)を書いて実行します。
python checkdocxfonts.1.py cover.docx

 

あれれ、『None: font名が無い』の連発です。
コマンドプロンプトに、Noneが並んでいる

 

python-docxは、Word標準スタイル(テーマ)のフォントを扱わない

ドキュメントを読み返すと、チュートリアルに書かれていました。
フォント情報は、テーマに設定されたフォントがそのまま使われている場合、None(無い)とされます。

 

そのテーマで設定されているフォント情報を調べようにも、Word標準テーマの場合は、
python-docからは情報を参照できないようです。
おそらくdocxがどんな環境(MacやLinux)で扱われるか判らないための、意図的な設計なのでしょう(工学的には間違っていないと思います)。

 

また、ユーザが作成した埋め込みテーマでは、フォント名にアクセスできるものの、アジア圏のフォントが考慮されていないようでした。
python-docxだけで、完全にフォントを調べるのは難しそうですね。
(長々と書いたのにゴメンナサイ)

 

ですがpython-docxを糸口にして、
docxファイルの仕様に踏み込んでいける気がします。
日をあらためて、再挑戦したいです。

 

今回作成したスクリプトとプログラム

以上のようにガバガバな内容ですが、スクリプトを掲載しておきます。
テーマで設定されている書体名は取得できません。
また、ヘッダー/フッター、図形に含まれる書体名も取得できません。

お約束です。
下記のプログラムについて、弊社は一切の権利を放棄いたします。(独自部分は無いようなものですが)
自由に改変していただいて構いません。
ただし下記プログラムによって発生したいかなるトラブル・損失・損害も弊社は責任を負わず補償もいたしません。
予めご了承ください。

windows用の実行ファイルにしたもの

こちらより実行ファイルをダウンロードしてください。
docxファイルをドロップして実行します。
(一度に複数のファイルをドロップできます)
https://www.gentie.com/download/checkdocxfonts.zip

macOSなど、pythonの実行間環境がある場合

下記スクリプトを保存し、
python    [保存したスクリプト名]
   <<チェック対象のファイル名>>   で実行してください。
ワイルドカードで、複数のファイルを渡しても実行できます。