生成AIの手を借りて提案書と手引書とサンプルをつくる

# はじめに
「こんなことやりたいんだけど、生成AIでいい感じにできない？」
そんな曖昧な要望、ユーザから受けたりしませんか？

「じゃぁ、生成AIにきいてみますか。」
そんなアプローチを起こしてみました。

# 想定読者
「はじめに」のようなシーンに立ち会う方

# アプローチ
下記のような流れを考えてみます。
1. ユーザ要望の発生
1. 生成AIへの相談
1. 生成AIへの提案書作成依頼
1. 生成AIへの手引書作成依頼
1. 生成AIへのサンプル作成依頼

# ユーザ要望の発生
今回は下記お題にします。
「複数のプレゼン資料を一か所にまとめて通しで表示できるようにしたいんだけど、
　生成AIでいい感じにできない？」

（生成AIで、という制限がなければ、既存のサービスやツールを使うことが可能ですが。）

# 生成AIへの相談
今回はChatGPTに相談します。

- <b>プロンプト
あなたはソフトウェア開発者です。お客様から、
「複数のプレゼン資料を一か所にまとめて通しで表示できるようにしたいんだけど、
　生成AIでいい感じにできない？」
と要望を受けました。どのような方法があるか提案してください。</b>

複数の案をChatGPTから回答されます。(回答内容は割愛。以降も同様。)

# 生成AIへの提案書作成依頼

回答を提案書のかたちにするため、プロンプトを打ち込みます。

- <b>プロンプト
これらの回答を提案資料として起こし、お客様へ説明したいです。
提案資料を作成してください。</b>

PowerPointスライドにはりつけやすいように加工します。

- <b>プロンプト
この章立てをプレゼン資料へコピー＆ペーストしやすい形式にしてもらえませんか。</b>

この結果をPowerPointスライドへ貼り付けます。そのままでは味気ないので、
パワーポイントのデザイナ[^1]機能でレイアウトを調整します。

[^1]: デザイナ機能の場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762098/be173b60-3084-b339-b9c6-1cd3a2458cc0.png)

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/5MX1GE/embed" data-aspect="0.5625"></script>

また、1枚ものなら、html形式で整形するのもありかもしれません。
- <b>プロンプト
この内容をHTML形式でA4用紙1枚にPDF形式で出力できる構成に要約してください。</b>

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/KEXN9R/embed?key=2024-08-21-130354" data-aspect="1.4138"></script>

これならOfficeが入っていないPCでもOKですね。

# 生成AIへの手引書作成依頼

提案書から実施案が採択されたら次のステップに進みます。
※ここまでユーザ自身にやってもらえると、提案の抽象度もだいぶ下がりますね。

「3.1.プレゼン資料の統合」が採択された前提で再びプロンプトを投げます。

- <b>プロンプト
「3.1. プレゼン資料の統合」を進めたいです。具体的な実現方法を教えてください。</b>

手順が列挙されるため、提案書と同様に転記しやすいよう指示します。

- <b>プロンプト
この流れを簡単な手引書として作成したいです。コピー＆ペーストでパワーポイントにはりつけやすい章立てで要約してください。</b>

提案書同様に作成しました。レイアウトはちょっと変えています。

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/ZN1RXE/embed?key=2024-08-21-145314" data-aspect="0.5625"></script>

# 生成AIへのサンプル作成依頼

手引き内のフォーマットの統一に記載されたAdobe Acrobatは有償です。
無償（プログラミング）の対応方法をプロンプトを投げます。
PDFとPowerPoint形式のプレゼン資料が混在し、PowerPointに統一することを想定します。

- <b>プロンプト
PDFファイルからパワーポイント形式に変換するサンプルプログラムが欲しいです。</b>

Pythonで実装する例が回答されます。回答された内容をもとにプログラミングを行います。

モジュールのインストール
```
pip install python-pptx
pip install pymupdf
```

PDFをPowerPointに変換(画像化してパワーポイントに貼り付けるサンプル)

``` pdf_2_pptx.py 
import fitz  # PyMuPDF
from pptx import Presentation
from pptx.util import Inches
import os

def pdf_to_pptx(pdf_path, pptx_path):
    # PDFファイルを開く
    pdf_document = fitz.open(pdf_path)
    
    # プレゼンテーションオブジェクトを作成
    presentation = Presentation()

    for page_number in range(len(pdf_document)):
        # ページごとにPPTXのスライドを追加
        slide = presentation.slides.add_slide(presentation.slide_layouts[5])
        
        # ページを画像として抽出
        page = pdf_document.load_page(page_number)
        pix = page.get_pixmap()
        img_path = f"page_{page_number + 1}.png"
        pix.save(img_path)
        
        # スライドに画像を追加
        left = top = Inches(0)
        slide.shapes.add_picture(img_path, left, top, width=Inches(10), height=Inches(7.5))
    
    # PPTXファイルを保存
    presentation.save(pptx_path)

# フォルダ内のファイルを取得
files = os.listdir()
# PDFファイルのみを抽出して順に表示
for file in files:
    if file.endswith(".pdf"):
        pdf_path = file
        pptx_path = file.replace(".pdf", ".pptx")
        if os.path.exists(pptx_path):
            os.remove(pptx_path)
        pdf_to_pptx(pdf_path, pptx_path)
        # フォルダ内のファイルを取得
        files2 = os.listdir()
        # PNGファイルをすべて削除
        for file2 in files2:
            if file2.endswith(".png"):
                os.remove(file2)
```

生成AIへの指示次第でサンプルは色々作れます。
ユーザ環境適用時、Pythonのインストールができない場合、PyInstallerを活用します。
(Windowsの場合)

https://qiita.com/kunishou/items/b2e8754886107292926d

あとは手引書に沿ってスライドをまとめていけば、プレゼン資料の結合はできそうです。
※ここもプログラムで機械的に結合する、のもアリかもしれません。

# まとめ

手引書に書かれたテンプレートの選定は今回の例だと満たせないのですが、
プレゼン資料を統合したい、という要望に対してある程度示せたのではないかと思います。

- 生成AIが案を出して
- 人間がアクションをとる

という組み合わせでさまざまな要望にアクションできるのではないかと思います。

# 参考

Gemini によるプレゼン資料作成例

https://presentation.style/presentation-tips-14/