6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Delphi で PowerPoint の各ページを画像ファイルにする

Last updated at Posted at 2020-03-17

はじめに

@natsutan さんの『PythonでPowerPointの各ページを画像ファイルにする』という記事中にあるコードを Delphi で書いてみました。使用する Delphi のバージョンは 10.3.3 Rio です。

移植

使い方などはオリジナルに準拠するものとします。

コード

コンソールアプリケーションとして書かれており、ほぼベタ移植です。

PPT2PNG.dproj
program PPT2PNG;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Win.ComObj,
  System.IOUtils;

const
  PPT_NAME = 'test.pptx';
  OUT_DIR  = 'images';

  procedure export_img(fname, odir: string);
  begin
    var application: OleVariant := CreateOleObject('Powerpoint.Application');
    application.Visible := True;
    var current_folder := TDirectory.GetCurrentDirectory;

    var presentation := application.Presentations.open(TPath.Combine(current_folder, fname));

    var export_path := TPath.Combine(current_folder, odir);
    presentation.Export(export_path, FilterName := 'png');

    presentation.close;
    application.quit;
  end; { export_img }

  procedure rename_img(odir: string);
  begin
     for var fname in TDirectory.GetFiles(odir, '*.png', TSearchOption.soTopDirectoryOnly) do
       begin
         var new_fname := StringReplace(fname, 'スライド', 'slide', []);
         TFile.Move(fname, new_fname);
       end;
  end; { rename_img }

begin
  export_img(PPT_NAME, OUT_DIR);
  rename_img(OUT_DIR);
end. { main }

ところがこれを実行するとエラーが発生してしまいます。
image.png

---------------------------
デバッガ例外通知
---------------------------
プロジェクト PPT2PNG.exe は例外クラス EOleSysError (メッセージ 'CoInitialize は呼び出されていません。')を送出しました。
---------------------------
ブレーク(B)   継続(C)   ヘルプ   
---------------------------

この問題はアプリケーションがコンソールアプリケーションの時に起こります。

問題回避

問題を回避するには、usesWinapi.ActiveX を加え、

uses
  System.SysUtils,
  System.Win.ComObj,
  System.IOUtils,
  Winapi.ActiveX;  // <-- 追加

COM を使っているコードを CoInitializeCoUninitialize で括ります。

  procedure export_img(fname, odir: string);
  begin
    CoInitialize(nil);  // <- 追加
    var application: OleVariant := CreateOleObject('Powerpoint.Application');
    application.Visible := True;
    var current_folder := TPath.GetDirectoryName(ParamStr(0));

    var presentation := application.Presentations.open(TPath.Combine(current_folder, fname));

    var export_path := TPath.Combine(current_folder, odir);
    presentation.Export(export_path, FilterName := 'png');

    presentation.close;
    application.quit;
    CoUninitialize;  // <- 追加
  end; { export_img }

ちゃんとやるなら CoInitializeCoUninitializetryfinally で括った方がいいと思います。

See also:

おわりに

でるお (仮) のスライドが無事画像に変換できました!
image.png

See also:

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?