Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

最近の作業部屋活動履歴

2023-04-16
2023-03-24
2023-03-22
2023-01-25

最近のWikiの更新 (Recent Changes)

2023-04-16
2023-03-24
2023-01-25
2023-01-08
2023-01-07

Wikiガイド(Guide)

サイドバー (Side Bar)

雛形スライドからPowerPointファイルを作成できるC++ライブラリ/ツール

概要

Excel の場合は libxlsxwriter や xlsxio 等、C++ から作成できるライブラリが色々ありますが、PowerPointをC++から作成となると、探しても全く見つかりません。pythonやjavascriptであればそこそこあるようなのですが・・・。ということで、作成してみました。 このソフトは、雛形用PowerPointスライド、「どのスライドのどの部分差し替えるか」を定義したjson、差し込む画像データ の3点を入力すると、それらを合成して新しいPowerPointファイルを作ることができます。 実行ファイル形式、ライブラリ形式のどちらでも使用できるようになってます。

<概略図>

concept.png

雛形用のPowerPointファイルは、各スライドがそれぞれ雛形として扱われます。雛形PowerPointに3枚のスライドが入っていたら、3種類の雛形スライドが入っている、ということになります。

スライド定義json直下の配列要素が、作成されるPowerPointファイルの各スライドに対応しています。スライド定義jsonの配列要素数が4だとしたら、4枚のスライドのPowerPointが作成されることになります。 jsonの各要素には、使用する雛形スライドの番号や、置換したいオートシェイプ要素と置換テキスト、または画像要素と画像インデックスを記載します。

雛形用PowerPointのオートシェイプオブジェクト、及び画像オブジェクトには、名前を付けておく必要があります。その名前をjsonのキーとして使用します。

画像は、雛形の画像オブジェクトの枠内に収まるように縦横比を維持して拡大縮小します。

仕様

* cpp_pptx_template.h

namespace cpp_pptx_template {
	struct image_data {
		uint8_t *filedata; /// 画像データ本体  呼び出し元でメモリ管理すること
		size_t filedata_size; /// 画像データサイズ
		double aspect_y_x; /// 縦横比(縦幅 ÷ 横幅)
		const char *ext; /// 画像データの拡張子
	};
        /// template_pptx : 雛形PowerPoint(zipper::UnZipに入れて呼び出す)
        /// pptx_to_generate: PowerPoint生成先(zipper::Zipに書き出す)
        /// slides_define: スライド定義json
        /// image_data_ary: 画像データ配列
        /// image_data_count: 画像要素数
	void create_slide_from_template(zipper::UnZip &template_pptx, zipper::Zip &pptx_to_generate, const nlohmann::json &slides_define, const image_data *image_data_ary, int image_data_count);
}

* スライド定義json

[
  { /// 1枚目のスライド
    "template_slide": 0,  // 使用する雛形スライド番号、番号は0から始まる ... つまり、1枚目のスライドは1枚目の雛形スライドから作成する。
    "images": { // 差し込む画像の情報をここに記載
      "image_1": {  // 雛形の対象画像オブジェクト名
        "image_data": 0 // 差し込む画像のインデックス ...  image_1 に image_data_ary[0] を差し込む
      },
      "image_2": {
        "image_data": 1 //  ...  image_2 に image_data_ary[1] を差し込む
      }
    },
    "shapes": { // オートシェイプ要素の書き換え情報をここに記載。今のところテキスト置換のみ
      "image_caption_2": { // 雛形の対象オートシェイプオブジェクト名
        "text": "cap2" // 置換テキスト ... image_caption_2 のテキストを 「cap2」に書き換える
      },
      "page_title": {
        "text": "Hello first title" ... page_title のテキストを 「Hello first title」に書き換える
      }
    }
  },
  { /// 2枚目のスライド
    "template_slide": 1,  // 2枚目のスライドは、2枚目の雛形スライドから作成する。
    "images": {
      "image": {
        "image_data": 2 ... image に image_data_ary[2] を差し込む
      }
    },
    "shapes": {
      "image_caption": {
   ...

* 実行可能ファイル引数

cpp_pptx_template.exe tempalte_pptx pptx_to_generate slides_define_json imagelist
<コマンドライン引数>
  template_pptx : 雛形PowerPointファイルのパス
  pptx_to_generate : 生成されるPowerPointファイルのパス
  slides_define_json : スライド定義jsonファイルのパス
  imagelist : 画像リストファイル(1行につき1ファイルの形式。PNG形式のみ対応)

ライセンス

  • MITライセンス

使用しているライブラリ

  • JSON for Modern C++ N. Lohmann さん作のjsonライブラリ
  • tinyxml2
  • zlib
  • miniz
  • minizip Zlibの contrib に入っている zip読み書きプログラム
  • cpp-zipper minizip の C++ラッパー。本作では少し改造して、pptx(zip)ファイルをメモリに読み込んだ状態からでもUnZipインスタンスを作成できるようにしてみました。
  • stb 実行可能ファイル形式の方で、指定された画像ファイルから縦横比を取得するために stb_image を使用しています。

ダウンロード

  • ソース一式 (23/3/22更新、zlibからminizを使用するように変更、不具合修正)