none
C#を用いたPowerPointのスライドへの画像挿入について RRS feed

  • 質問

  • 初めて書かせていただきます。

    C#にて、パワーポイントの各スライドに同じ画像を同じ場所に挿入たいと考えています。

    そこで下記のようにコードを書いたところ、スライド1枚目は意図した場所に画像が貼り付けられたのですが、

    スライド2枚目以降は、スライドの中央に貼り付けられてしまいます。

    どのようにしたら全てのスライドで同じ場所に画像を挿入できるでしょうか。

    ご教授のほど、よろしくお願いします。

    using PPt = Microsoft.Office.Interop.PowerPoint;
    using Microsoft.Office.Core;
    
    class test
    {
        static void Main()
        {
            PPt.Application pptApp = new PPt.Application();
    
            PPt.Presentation pptPre = pptApp.Presentations.Open(@"C:\test\pptfile.pptx");
    
            PPt.Slides PPtSlides = pptPre.Slides;
    
            foreach (PPt.Slide s in PPtSlides)
            {
                s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
            }
    
            // なお、foreachを用いずスライドを指定して実施しても同じ結果となる。
            PPt.Slide oPPtone = (PPt.Slide)pptPre.Slides._Index(1);
    
            oPPtone.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0,0);
    
            PPt.Slide oPPttwo = (PPt.Slide)pptPre.Slides._Index(2);
    
            oPPttwo.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
        }
    }

    2015年3月16日 13:41

回答

  • スライドのレイアウトの影響があるらしい

    foreach (PPt.Slide s in PPtSlides)
    {
        PPt.Shape shape;
        //最初にAddPictureするときに、そのスライドページにプレースホルダーがあると
        //プレースホルダーの位置と変形の影響を受けてしまう。
        shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
        shape.Delete();//プレースホルダーごと削除してやる
    
        //プレースホルダーがなくなったので次はプレースホルダーの影響を受けずに貼り付けられる
        shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
        //でもまだ位置がずれてるので修正する
        shape.Left = 0;
        shape.Top = 0;
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク yufuin 2015年3月17日 11:22
    2015年3月16日 18:40
  • gekkaさん、回答ありがとうございます。

    提示していただいたコードを参考に、

    画像の挿入とプレースホルダーの関係を検証しました。

    どうも、プレースホルダーが空白かつ画像の挿入が可能な状態で、AddPictureを行うと、

    指定した座標に関係なく、プレースホルダーに画像が挿入されるようです。

    また、プレースホルダーに挿入された後、そのshapeを削除すると、プレースホルダーが復活するようです。

    これらから、以下のようにすることで解決できました。

            foreach (PPt.Slide s in pptSlides)
            {
                // とりあえず、画像を挿入する。挿入する座標は仮置き。
                shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
                // あらためて、画像の座標を設定
                shape.Left = 100;
                shape.Top = 100;
                // 画像の幅・高さもあらためて設定
                shape.Width = 85;
                shape.Height = 50;
            }
    gekkaさん、考えていただいた皆さん、ありがとうございました。

    • 回答としてマーク yufuin 2015年3月17日 11:22
    2015年3月17日 11:22

すべての返信

  • スライドのレイアウトの影響があるらしい

    foreach (PPt.Slide s in PPtSlides)
    {
        PPt.Shape shape;
        //最初にAddPictureするときに、そのスライドページにプレースホルダーがあると
        //プレースホルダーの位置と変形の影響を受けてしまう。
        shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
        shape.Delete();//プレースホルダーごと削除してやる
    
        //プレースホルダーがなくなったので次はプレースホルダーの影響を受けずに貼り付けられる
        shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
        //でもまだ位置がずれてるので修正する
        shape.Left = 0;
        shape.Top = 0;
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク yufuin 2015年3月17日 11:22
    2015年3月16日 18:40
  • gekkaさん、回答ありがとうございます。

    提示していただいたコードを参考に、

    画像の挿入とプレースホルダーの関係を検証しました。

    どうも、プレースホルダーが空白かつ画像の挿入が可能な状態で、AddPictureを行うと、

    指定した座標に関係なく、プレースホルダーに画像が挿入されるようです。

    また、プレースホルダーに挿入された後、そのshapeを削除すると、プレースホルダーが復活するようです。

    これらから、以下のようにすることで解決できました。

            foreach (PPt.Slide s in pptSlides)
            {
                // とりあえず、画像を挿入する。挿入する座標は仮置き。
                shape=s.Shapes.AddPicture(@"C:\test\1.jpg", MsoTriState.msoTrue, MsoTriState.msoFalse, 0, 0);
                // あらためて、画像の座標を設定
                shape.Left = 100;
                shape.Top = 100;
                // 画像の幅・高さもあらためて設定
                shape.Width = 85;
                shape.Height = 50;
            }
    gekkaさん、考えていただいた皆さん、ありがとうございました。

    • 回答としてマーク yufuin 2015年3月17日 11:22
    2015年3月17日 11:22