使用open xml在powerpoint中设置图像大小

时间:2010-10-28 07:19:09

标签: asp.net xml powerpoint

我正在使用本教程here

生成一个ppt文件

步骤4介绍了如何换出图像占位符。 我的图像有不同的尺寸,这使得一些图像看起来有点太有趣了。

有没有办法调整占位符的大小以便它可以保留尺寸?

编辑:好的,更好的解释:用户可以上传自己的图像。图像存储在服务器上。我正在生成一个ppt文件,每个幻灯片有一个用户。对于每张幻灯片,都会有一张图片,如果有的话。我当然可以得到每个图像的尺寸,但是如何用占位符替换另一个维度的图像呢?

2 个答案:

答案 0 :(得分:4)

好吧,我不能根据该教程告诉你,但我可以告诉你它在Open XML中的位置(即不是SDK)。

您的图片将包含一个xfrm元素,其中包含一组值,如下所示:

    <p:spPr>
      <a:xfrm>
        <a:off x="7048050" y="6248401"/>
        <a:ext cx="972000" cy="288000"/>
      </a:xfrm>
    </p:spPr>

您要更改的值是cx的{​​{1}}和cy。从a:ext对象中获取新图片的尺寸(h和w)并获取每个值并乘以12700.因此,如果图片的宽度为400像素,则System.Drawing.Image的值为cx {1}}将是(400 x 12700 = 5080000)。

答案 1 :(得分:0)

我是这样做的:

using DocumentFormat.OpenXml.Packaging;

假设您有 SlidePart

就我而言,我想检查图片的 alt 标题,如果与我的密钥匹配,则替换它们。

//find all image alt title (description) in the slide
List<DocumentFormat.OpenXml.Presentation.Picture> slidePictures = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
.Where(a => a.NonVisualPictureProperties.NonVisualDrawingProperties.Description.HasValue).Distinct().ToList();

现在我们检查所有图像:

//check all images in the slide and replace them if it matches our parameter
foreach (DocumentFormat.OpenXml.Presentation.Picture imagePlaceHolder in slidePictures)

现在在循环中我们寻找 Transform2D 并用我们的值修改它:

Transform2D transform = imagePlaceHolder.Descendants<Transform2D>().First();
Tuple<Int64Value, Int64Value> aspectRatio = CorrectAspectRatio(param.Image.FullName, transform.Extents.Cx, transform.Extents.Cy);
                        transform.Extents.Cx = aspectRatio.Item1;
                        transform.Extents.Cy = aspectRatio.Item2;

这个函数看起来像这样:

public static Tuple<Int64Value, Int64Value> CorrectAspectRatio(string fileName, Int64Value cx, Int64Value cy)
{
   BitmapImage img = new();
   using (FileStream fs = new(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
   {
       img.BeginInit();
       img.StreamSource = fs;
       img.EndInit();
    }
   int widthPx = img.PixelWidth;
   int heightPx = img.PixelHeight;

   const int EMUsPerInch = 914400;

   Int64Value x = (Int64Value)(widthPx * EMUsPerInch / img.DpiX);
   Int64Value y = (Int64Value)(heightPx * EMUsPerInch / img.DpiY);

   if (x > cx)
   {
       decimal ratio = cx * 1.0m / x;
       x = cx;
       y = (Int64Value)(cy * ratio);
    }

    if (y > cy)
    {
        decimal ratio = cy * 1.0m / y;
        y = cy;
        x = (Int64Value)(cx * ratio);
    }

    return new Tuple<Int64Value, Int64Value>(x, y);
}

需要注意的重要一点是 EMU per inch914400。在大多数情况下,您只需将其除以 96,但对于某些监视器,情况有所不同。因此,最好将其划分为 DPIxy