PowerPointファイルのタイトルメタデータ(ドキュメントプロパティ)を設定するためのコマンドラインツールである。ファイルエクスプローラーの詳細表示や検索機能で参照されるタイトル情報を、PowerPointを開かずにコマンドラインから設定する場合に使用する。バッチ処理やスクリプトからの呼び出しにも対応する。
以下のコマンドでpython-pptxとcomtypesをインストールする。
pip install python-pptx comtypes
コマンドプロンプトまたはPowerShellで以下のように実行する。
python ファイル名.py 対象ファイル.pptx "設定するタイトル"
処理が完了すると「[完了] タイトルを設定しました: (タイトル名)」と表示される。エラーが発生した場合は「[エラー]」で始まるメッセージが表示される。
--backupオプションを追加すると、元ファイルの複製(拡張子.bak)が作成される。このプログラムは、PowerPointファイル(.pptまたは.pptx形式)のタイトルメタデータを設定するコマンドラインツールである。python-pptxライブラリを使用してOpen XML形式のドキュメントプロパティにアクセスし、Dublin Core準拠のtitleプロパティを読み取り・書き込みする。旧形式の.pptファイルについては、comtypesライブラリを介してPowerPointのCOMインターフェースを呼び出し、.pptx形式に変換してから処理する。
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のCOMパッケージである[3]。WindowsのCOMインターフェースをPythonから定義・呼び出し・実装することを可能にする。本プログラムでは、PowerPoint.ApplicationのCOMオブジェクトを生成し、旧形式.pptファイルの変換処理に使用する。Windows環境とPython 3.9以降が必要である。
入力ファイルの拡張子を判定し、.pptx形式はpython-pptxで直接処理し、.ppt形式はCOM経由で変換後に処理する分岐構造を持つ。
Open Packaging Conventions(OPC)で定義されるcore_propertiesを通じて、標準化されたドキュメントメタデータを操作する。文字列プロパティは255文字に制限される。
tempfileモジュールで一時ディレクトリを作成し、変換作業後にshutil.rmtreeで削除する。
PowerPointアプリケーションを非表示モード(Visible = False)で起動し、バックグラウンドで変換処理を実行する。SaveAsメソッドの引数24はppSaveAsOpenXMLPresentationを示す。
コマンドライン引数の解析にargparseモジュールを使用し、以下の機能を備える:
[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
pptパワーポイントのタイトルメタデータを設定する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を使用して変換
powerpoint = comtypes.client.CreateObject("PowerPoint.Application")
powerpoint.Visible = False
try:
deck = powerpoint.Presentations.Open(os.path.abspath(ppt_path))
deck.SaveAs(os.path.abspath(pptx_path), 24) # 24 = ppSaveAsOpenXMLPresentation
deck.Close()
except Exception as e:
print(f"[エラー] 変換中にエラーが発生しました: {e}")
powerpoint.Quit()
return None
finally:
powerpoint.Quit()
print(f"[完了] 変換完了: {pptx_path}")
return pptx_path
def set_pptx_title(pptx_path, title):
"""PPTXファイルのタイトルメタデータを設定する"""
try:
# プレゼンテーションを開く
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}")
return True
except Exception as e:
print(f"[エラー] タイトル設定中にエラーが発生しました: {e}")
return False
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:
# 直接PPTXファイルを処理
if set_pptx_title(file_path, title):
return 0
else:
return 1
else:
# PPTをPPTXに変換して処理
temp_pptx = convert_ppt_to_pptx(file_path)
if not temp_pptx:
return 1
if set_pptx_title(temp_pptx, title):
# 元のファイル拡張子を.pptxに変更
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
else:
# 一時ディレクトリを削除
temp_dir = os.path.dirname(temp_pptx)
shutil.rmtree(temp_dir)
return 1
if __name__ == "__main__":
sys.exit(main())