PowerPointタイトル設定ツール ― python-pptxとcomtypesで作るコマンドライン版メタデータ編集プログラム
目次
プログラム利用ガイド
1. このプログラムの利用シーン
PowerPointファイルのタイトルメタデータ(ドキュメントプロパティ。ファイルを開いたアプリやエクスプローラーが参照する付帯情報)を設定するコマンドラインツールである。エクスプローラーの詳細表示や検索で参照されるタイトル情報を、PowerPointを開かずにコマンドラインから設定する場合に使用する。バッチ処理やスクリプトからの呼び出しにも対応する。
2. 主な機能
- タイトルメタデータの設定: PowerPointファイルのドキュメントプロパティにタイトルを書き込む。
- 複数形式の対応: .pptx形式は直接処理し、.ppt形式は自動的に.pptxに変換して処理する。
- バックアップ作成:
--backupオプションで元ファイルの複製(.bakファイル)を保存できる。 - 現在のタイトル表示: 設定前に既存のタイトル(未設定の場合は「未設定」)を表示する。
3. 基本的な使い方
- 必要なパッケージのインストール:
コマンドプロンプトで以下を実行し、python-pptxとcomtypesをインストールする。
pip install python-pptx comtypes - 基本的な実行:
コマンドプロンプトまたはPowerShellで以下のように実行する。
python ファイル名.py 対象ファイル.pptx "設定するタイトル" - 実行結果の確認:
処理が完了すると「[完了] タイトルを設定しました: (タイトル名)」と表示される。エラーが発生した場合は「[エラー]」で始まるメッセージが表示される。
4. 便利な機能
- バックアップ作成:
--backupオプションを追加すると、元ファイルの複製(拡張子.bak)が作成される。 - .pptファイルの処理: .ppt形式を指定した場合、自動的に.pptxに変換された新しいファイルが作成される。元の.pptファイルはそのまま残る。この変換にはWindowsとPowerPoint本体(デスクトップ版)のインストールが必要である(COM経由でPowerPointを操作するため)。
- バッチ処理への組み込み: 終了コード(0: 成功、1: 失敗)を返すため、バッチファイルからの呼び出しに対応する。
プログラムコードの説明
1. 概要
このプログラムは、PowerPointファイル(.pptまたは.pptx形式)のタイトルメタデータを設定するコマンドラインツールである。python-pptxライブラリでOpen XML形式(PowerPoint 2007以降の標準ファイル形式)のドキュメントプロパティにアクセスし、Dublin Core準拠のtitleプロパティを読み書きする。旧形式の.pptファイルについては、comtypesライブラリを介してPowerPointのCOMインターフェース(Windowsのアプリ間連携の仕組み)を呼び出し、.pptx形式に変換してから処理する。
2. 主要技術
python-pptx
Steve Cannyが開発したPythonライブラリである[1]。PowerPoint 2007以降のOpen XML形式(.pptx)ファイルを作成・読み取り・更新する機能を提供する。PowerPoint本体のインストールを必要とせず、任意のPython環境で動作する。Presentationオブジェクトのcore_propertiesプロパティを通じて、Dublin Coreメタデータ標準[2](資源を記述するための共通項目を定めた規格)に基づくドキュメントプロパティ(title、author、subject等)にアクセスできる。
comtypes
ctypes(PythonからC言語の関数を呼ぶ標準ライブラリ)を基盤とした、純粋PythonのCOMパッケージである[3]。WindowsのCOMインターフェースをPythonから定義・呼び出し・実装することを可能にする。本プログラムでは、PowerPoint.ApplicationのCOMオブジェクトを生成し、旧形式.pptファイルの変換に使用する。Windows環境とPython 3.9以降が必要である。
3. 技術的特徴
- デュアルフォーマット対応
入力ファイルの拡張子を判定し、.pptx形式はpython-pptxで直接処理し、.ppt形式はCOM経由で変換後に処理する分岐構造を持つ。
- Dublin Coreメタデータ操作
Open Packaging Conventions(OPC。Officeファイルの内部構造を定める規格)で定義されるcore_propertiesを通じて、標準化されたドキュメントメタデータを操作する。文字列プロパティは255文字に制限される。
- 一時ファイル管理
tempfileモジュールで一時ディレクトリを作成し、変換後にshutil.rmtreeで削除する。
- COMオートメーション制御
PowerPointを非表示モード(Visible = False)で起動し、バックグラウンドで変換を実行する。SaveAsメソッドの引数24はppSaveAsOpenXMLPresentation(.pptx形式での保存を指定する定数)を示す。
4. 実装の特色
コマンドライン引数の解析にargparseモジュールを使用し、以下の機能を備える。
- 位置引数によるファイルパスとタイトルの指定。
--backupオプションによる元ファイルのバックアップ作成(.bak拡張子)。- 処理状況を示すステータスメッセージの出力([処理]、[情報]、[完了]、[エラー])。
- 終了コードによる処理結果の通知(成功: 0、失敗: 1)。
5. 参考文献
[1] Canny, S. python-pptx. GitHub. https://github.com/scanny/python-pptx
[2] Dublin Core Metadata Initiative. (2020). DCMI Metadata Terms. https://www.dublincore.org/specifications/dublin-core/dcmi-terms/
[3] Enthought. comtypes. GitHub. https://github.com/enthought/comtypes
PowerPointのタイトルメタデータを設定するPythonプログラム(Windows上)
このプログラムを実行するには以下のPythonパッケージが必要です:
pip install python-pptx comtypes
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from pptx import Presentation
import comtypes.client
import argparse
import tempfile
import shutil
def convert_ppt_to_pptx(ppt_path):
"""古い.ppt形式のファイルを.pptx形式に変換する"""
print(f"[処理] {ppt_path} をPPTX形式に変換しています。")
temp_dir = tempfile.mkdtemp()
pptx_path = os.path.join(temp_dir, os.path.splitext(os.path.basename(ppt_path))[0] + '.pptx')
powerpoint = comtypes.client.CreateObject("PowerPoint.Application")
powerpoint.Visible = False
deck = powerpoint.Presentations.Open(os.path.abspath(ppt_path))
deck.SaveAs(os.path.abspath(pptx_path), 24) # 24 = ppSaveAsOpenXMLPresentation
deck.Close()
powerpoint.Quit()
print(f"[完了] 変換完了: {pptx_path}")
return pptx_path
def set_pptx_title(pptx_path, title):
"""PPTXファイルのタイトルメタデータを設定する"""
presentation = Presentation(pptx_path)
old_title = presentation.core_properties.title
print(f"[情報] 現在のタイトル: {old_title if old_title else '未設定'}")
presentation.core_properties.title = title
presentation.save(pptx_path)
print(f"[完了] タイトルを設定しました: {title}")
def main():
parser = argparse.ArgumentParser(description='PowerPointファイルのタイトルメタデータを設定します。')
parser.add_argument('file', help='PowerPointファイルのパス(.ppt または .pptx)')
parser.add_argument('title', help='設定するタイトル')
parser.add_argument('--backup', action='store_true', help='元のファイルのバックアップを作成します')
args = parser.parse_args()
file_path = args.file
title = args.title
if not os.path.exists(file_path):
print(f"[エラー] ファイルが見つかりません: {file_path}")
return 1
if args.backup:
backup_path = file_path + '.bak'
shutil.copy2(file_path, backup_path)
print(f"[情報] バックアップを作成しました: {backup_path}")
is_pptx = file_path.lower().endswith('.pptx')
if is_pptx:
set_pptx_title(file_path, title)
return 0
else:
temp_pptx = convert_ppt_to_pptx(file_path)
set_pptx_title(temp_pptx, title)
new_path = os.path.splitext(file_path)[0] + '.pptx'
shutil.copy2(temp_pptx, new_path)
print(f"[完了] 処理したファイルを保存しました: {new_path}")
temp_dir = os.path.dirname(temp_pptx)
shutil.rmtree(temp_dir)
print(f"[注意] 元の.pptファイルはそのまま残されています。新しい.pptxファイルが作成されました。")
return 0
if __name__ == "__main__":
sys.exit(main())