はじめに
@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 }
---------------------------
デバッガ例外通知
---------------------------
プロジェクト PPT2PNG.exe は例外クラス EOleSysError (メッセージ 'CoInitialize は呼び出されていません。')を送出しました。
---------------------------
ブレーク(B) 継続(C) ヘルプ
---------------------------
この問題はアプリケーションがコンソールアプリケーションの時に起こります。
問題回避
問題を回避するには、uses に Winapi.ActiveX
を加え、
uses
System.SysUtils,
System.Win.ComObj,
System.IOUtils,
Winapi.ActiveX; // <-- 追加
COM を使っているコードを CoInitialize
と CoUninitialize
で括ります。
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 }
ちゃんとやるなら CoInitialize
と CoUninitialize
は try ~ finally で括った方がいいと思います。
See also:
- COM (Wikipedia)
- CoInitialize function (docs.microsoft.com)
- CoUninitialize function (docs.microsoft.com)
おわりに
See also: