パスワードを忘れた? アカウント作成
13659151 journal
Perl

route127の日記: ぱわぽ分割スクリプト 2

日記 by route127

M$のpowerpointで印刷原稿を作っていた。
パワポで版下を作っている時点で既に色々間違っている気がするが、最初excelで作ろうとしてたよりはマシのはず。
聞くところによれば近所の郷土史家も著書をパワポで書いているそうだし割とパワポ版下層は居るのかもしれない。
ただ150ページの原稿で2ページ位作ったところで貼りこんだ画像素材が重くて仕事にならなくなってきたので1ページを1ファイルにしようとPerlでスクリプトを組んだ。

src.pptxを001.pptx、002.pptx、…と分割していくのだが、これは「src.pptxを開き、任意のスライド1枚以外を削除して別名保存」をスライド枚数分繰り返しているだけなので大したことはしていない。
ただ当初そのループを$presentation->Slideで回そうとして失敗した。
$presentation->Slide->Itemのインデックスでループを回してもいいんだろうけど(そちらの方が速そう)、mapやgrepを使って書きたかった。
その為に一度Win32::OLEで受けてperlの配列にした

@slides = Win32::OLE::Enum->new($presentation->Slides)->All

のところ。

使い捨てのスクリプトなので用済みではあるが、見直してみると毎度ファイル開閉しなければもっと高速化できるのではないか(別名保存ではなくて予めスライド枚数文ファイルを複製しておく?)とか、スクリプトの冗長なところを短縮出来るのではないか(ワンライナにできたりしないか)とか思うがそれは読者への課題とする(古い本によくある言い回し)。

use strict;
use warnings;
use Win32::OLE;
$Win32::OLE::Warn = 3;
use Win32::OLE::Const 'Microsoft PowerPoint';
use Win32::OLE::Enum;
use Cwd;
use utf8;

my $pp = Win32::OLE->new('PowerPoint.Application', 'Quit');
$pp->{DisplayAlerts} = 1;
$pp->{Visible} = 1;

my $filename = 'C:\hoge\huga\src.pptx';
my $presentation = $pp->Presentations->Open($filename, 1);
my @slides = Win32::OLE::Enum->new($presentation->Slides)->All;
$presentation->Close;

foreach my $page (0..$#slides){
    my $input = 'C:\hoge\fuga\src.pptx';
    my $output = 'C:\hoge\fuga\\' . sprintf("%03d", $page + 1) . '.pptx';
    my $presentation = $pp->Presentations->Open($input, 1);
    my @slides = Win32::OLE::Enum->new($presentation->Slides)->All;
    map{$slides[$_]->Delete}grep{$_!=$page}0..$#slides;
    $presentation->SaveAs($output);
    $presentation->Close;
}

編集を終えた連番パワポファイルの結合も一応作ったが大して面白くはない。
pptxファイルを2つ開いて2つ目から1つ目にスライドをコピペするのみ。

$slides2[0]->Copy;
$presentation1->Slides->Paste;

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...