パソコンでWordファイルを作成すると、ファイルに著者情報が自動的に入るのはご存知でしょうか。試しに適当なWordファイルを右クリックして「プロパティ」を選択してみてください。以下のようなウィンドウが開きます。「詳細」タブを見るとファイルの作成者や前回修正した人の情報が残っていることが分かります。

最近では個人情報保護が叫ばれていますが、匿名のつもりで文章を書いたのにファイルに著者情報が残っていたら、誰のことか分かってしまうリスクがあります。
私は仕事において他社とファイルを共有することがあるのですが、中には業務上、作成者を匿名にする必要があるファイルがあります。そのようなファイルを先方に送る場合、Wordファイルから著者情報を削除する必要があります。1つや2つであれば手作業で著者情報を削除してもいいのですが、30個近くのファイルを扱わないといけないこともあって、それを1つ1つ手作業でやるのは結構面倒なんです。
そこで仕事をラクにするため、複数のWordファイルから著者情報を削除していくPythonプログラムを作成したので今日はそれを紹介します。
ちなみに手動で著者情報を削除するには以下のサイトを参考にしてみてください。
http://dtp.screen-cre.co.jp/dtp0027/
準備(ライブラリのインストール)
PythonでMS Wordを扱うにはPython-Docxというライブラリを使いますので、事前にインストールしておく必要があります。
コマンドプロンプトで以下のコマンドを入力して、Python-Docxライブラリをインストールしてください。
|
1 |
pip install python-docx |
プログラムの動作
まずは私が作成したプログラムの動作について説明します。コマンドプロンプトからPythonプログラムを実行すると、以下のようにファイルを選択するダイアログが表示されます。ここで著者情報を削除したいWordファイルを選択します。Ctrlボタンを押しながら複数のファイルを選択することもできます。

ファイルを選択後「開く(O)」を押すとすぐに処理が終わり、著者情報が削除されたファイルを保存するダイアログが開きます(さっきと全く同じように見えますがダイアログのタイトルが「出力ファイル」となっていることに注目してください)。
最初に選択したファイルの数だけ繰り返し保存先を訊くダイアログが開きますので、それぞれ保存してください。元のファイル名の末尾に「著者情報削除済」という文字列が自動的に入るので、そのまま保存しても元のファイルとは別ファイルで保存されます。たとえば「Wordファイル.docx」は「Wordファイル(著者情報削除済).docx」となります。

「Wordファイル.docx」「 Wordファイル2.docx 」「 Wordファイル3.docx 」という3つのファイルから著者情報を削除した後のフォルダの様子です。

プロパティを見ると「作成者」と「前回保存者」の名前が削除されていることが確認できます。

プログラムのソースコード
では実際の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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import os import tkinter as tk import tkinter.filedialog as fd from docx import Document def ask_input_filenames(msg = None, types = [('', '*.*')]): """ 入力用ファイル名の設定 """ rt = tk.Tk() rt.withdraw() filenames = fd.askopenfilenames(title = msg, filetypes = types) rt.destroy() return filenames def ask_output_filename(filename, msg = None, types = [('', '*.*')], deftype = '.txt'): """ 出力用ファイル名の設定 """ rt = tk.Tk() rt.withdraw() filename = fd.asksaveasfilename(initialfile = filename, title = msg, filetypes = types, defaultextension = deftype) rt.destroy() return filename # ファイルを選択する(複数可) input_filenames = ask_input_filenames('入力データファイル', types = [('Wordファイル(*.docx)', '*.docx')]) # キャンセルされた場合 if input_filenames == '': print('キャンセルされました。何かキーを押してください。') input() exit() # 選択したファイル全てで著者情報を削除していく for input_filename in input_filenames: try: doc = Document(input_filename) except: print(f'ファイル{input_filename}でエラーが起こりました。ファイルに問題があります。\n何かキーを押してください。') input() continue core_properties = doc.core_properties meta_fields= ["author", "category", "last_modified_by", "comments", "content_status", "identifier", "keywords", "language", "subject", "title", "version"] for meta_field in meta_fields: setattr(core_properties, meta_field, "") initial_filename = os.path.basename(input_filename) initial_filename = initial_filename[:-5] + '(著者情報削除済).docx' output_filename = ask_output_filename(initial_filename, msg = '出力ファイル', types = [('テキスト (*.docx)', '*.docx')]) # キャンセルされた場合 if output_filename == '': #print('キャンセルされました。何かキーを押してください。') #input() continue doc.save(output_filename) |
こちらからソースコードをダウンロードできます。
プログラムの解説
簡単にプログラムの解説をしていきます。
まずは必要なライブラリをインポートします。
|
1 2 3 4 |
import os import tkinter as tk import tkinter.filedialog as fd from docx import Document |
入力ファイルの選択と出力ファイルの保存先を訊くためのダイアログを表示する関数を定義しています。
|
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def ask_input_filenames(msg = None, types = [('', '*.*')]): """ 入力用ファイル名の設定 """ rt = tk.Tk() rt.withdraw() filenames = fd.askopenfilenames(title = msg, filetypes = types) rt.destroy() return filenames def ask_output_filename(filename, msg = None, types = [('', '*.*')], deftype = '.txt'): """ 出力用ファイル名の設定 """ rt = tk.Tk() rt.withdraw() filename = fd.asksaveasfilename(initialfile = filename, title = msg, filetypes = types, defaultextension = deftype) rt.destroy() return filename |
選択されたファイルを1つずつ開きます。
|
36 37 38 39 40 41 42 43 44 |
# 選択したファイル全てで著者情報を削除していく for input_filename in input_filenames: try: doc = Document(input_filename) except: print(f'ファイル{input_filename}でエラーが起こりました。ファイルに問題があります。\n何かキーを押してください。') input() continue |
開いたファイルの「core_properties」に保存されている、著者(author)、カテゴリー(category)、前回保存者(last_modified_by)、コメント(comments)といったプライバシー情報を削除しています。
|
46 47 48 49 |
core_properties = doc.core_properties meta_fields= ["author", "category", "last_modified_by", "comments", "content_status", "identifier", "keywords", "language", "subject", "title", "version"] for meta_field in meta_fields: setattr(core_properties, meta_field, "") |
元のファイル名から保存するファイル名を作成し、保存先を訊ねるダイアログを開きます。キャンセルされなければ指定されたパスにファイルを保存しています。
|
51 52 53 54 55 56 57 58 59 60 |
initial_filename = os.path.basename(input_filename) initial_filename = initial_filename[:-5] + '(著者情報削除済).docx' output_filename = ask_output_filename(initial_filename, msg = '出力ファイル', types = [('テキスト (*.docx)', '*.docx')]) # キャンセルされた場合 if output_filename == '': #print('キャンセルされました。何かキーを押してください。') #input() continue doc.save(output_filename) |
以上がプログラムの解説です。
自分が使うために作ったプログラムなのでエラー処理は最低限しかしていません。動作に責任は持てませんので、もしお使いになるようでしたら自己責任のもと、気を付けてお使いください。