プログラム利用ガイド

1. このプログラムの利用シーン

PowerPointファイルのタイトルメタデータ(ドキュメントプロパティ)を設定するためのコマンドラインツールである。ファイルエクスプローラーの詳細表示や検索機能で参照されるタイトル情報を、PowerPointを開かずにコマンドラインから設定する場合に使用する。バッチ処理やスクリプトからの呼び出しにも対応する。

2. 主な機能

3. 基本的な使い方

  1. 必要なパッケージのインストール:

    以下のコマンドでpython-pptxとcomtypesをインストールする。

    pip install python-pptx comtypes

  2. 基本的な実行:

    コマンドプロンプトまたはPowerShellで以下のように実行する。

    python ファイル名.py 対象ファイル.pptx "設定するタイトル"

  3. 実行結果の確認:

    処理が完了すると「[完了] タイトルを設定しました: (タイトル名)」と表示される。エラーが発生した場合は「[エラー]」で始まるメッセージが表示される。

4. 便利な機能

プログラムコードの説明

1. 概要

このプログラムは、PowerPointファイル(.pptまたは.pptx形式)のタイトルメタデータを設定するコマンドラインツールである。python-pptxライブラリを使用してOpen XML形式のドキュメントプロパティにアクセスし、Dublin Core準拠のtitleプロパティを読み取り・書き込みする。旧形式の.pptファイルについては、comtypesライブラリを介してPowerPointのCOMインターフェースを呼び出し、.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のCOMパッケージである[3]。WindowsのCOMインターフェースをPythonから定義・呼び出し・実装することを可能にする。本プログラムでは、PowerPoint.ApplicationのCOMオブジェクトを生成し、旧形式.pptファイルの変換処理に使用する。Windows環境とPython 3.9以降が必要である。

3. 技術的特徴

4. 実装の特色

コマンドライン引数の解析にargparseモジュールを使用し、以下の機能を備える:

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

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())