【问题标题】:How I add image in powerpoint with OpenXML C#如何使用 OpenXML C# 在 powerpoint 中添加图像
【发布时间】:2020-08-21 00:57:38
【问题描述】:

如何使用 OpenXML C# 在 powerpoint 中添加图片?

任何人都有如何在特定位置和大小插入图像的示例? 以及如何编辑文本框的位置和大小?

这是我目前所拥有的:

using (FileStream stream = new FileStream(@"c:/img.jpg", FileMode.Open, FileAccess.Read))             
{
     var image = Image.FromStream(stream);
     ImagePart imagePart = slidePart.AddImagePart(ImagePartType.Png, "rId3");
     imagePart.FeedData(stream);   
} 

【问题讨论】:

  • 你有什么尝试吗?
  • 我尝试using (FileStream stream = new FileStream(@"c:/img.jpg", FileMode.Open, FileAccess.Read)) { var image = Image.FromStream(stream); ImagePart imagePart = slidePart.AddImagePart(ImagePartType.Png, "rId3"); imagePart.FeedData(stream); } 但不起作用
  • @MrD 您已经将图像添加到包中,现在您需要获取该 imageId 并使用它在幻灯片中访问它
  • @AlexanderDerck 我是怎么做到的?

标签: c# powerpoint openxml


【解决方案1】:

使用以下代码:

public static void AddImage(string file, string image)
    {
        using (var presentation = PresentationDocument.Open(file, true))
        {
            var slidePart = presentation
                .PresentationPart
                .SlideParts
                .First();

            var part = slidePart
                .AddImagePart(ImagePartType.Png);

            using (var stream = File.OpenRead(image))
            {
                part.FeedData(stream);
            }

            var tree = slidePart
                .Slide
                .Descendants<DocumentFormat.OpenXml.Presentation.ShapeTree>()
                .First();

            var picture = new DocumentFormat.OpenXml.Presentation.Picture();

            picture.NonVisualPictureProperties = new DocumentFormat.OpenXml.Presentation.NonVisualPictureProperties();
            picture.NonVisualPictureProperties.Append(new DocumentFormat.OpenXml.Presentation.NonVisualDrawingProperties
            {
                Name = "My Shape",
                Id = (UInt32)tree.ChildElements.Count - 1
            });

            var nonVisualPictureDrawingProperties = new DocumentFormat.OpenXml.Presentation.NonVisualPictureDrawingProperties();
            nonVisualPictureDrawingProperties.Append(new DocumentFormat.OpenXml.Drawing.PictureLocks()
            {
                NoChangeAspect = true
            });
            picture.NonVisualPictureProperties.Append(nonVisualPictureDrawingProperties);
            picture.NonVisualPictureProperties.Append(new DocumentFormat.OpenXml.Presentation.ApplicationNonVisualDrawingProperties());

            var blipFill = new DocumentFormat.OpenXml.Presentation.BlipFill();
            var blip1 = new DocumentFormat.OpenXml.Drawing.Blip()
            {
                Embed = slidePart.GetIdOfPart(part)
            };
            var blipExtensionList1 = new DocumentFormat.OpenXml.Drawing.BlipExtensionList();
            var blipExtension1 = new DocumentFormat.OpenXml.Drawing.BlipExtension()
            {
                Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"
            };
            var useLocalDpi1 = new DocumentFormat.OpenXml.Office2010.Drawing.UseLocalDpi()
            {
                Val = false
            };
            useLocalDpi1.AddNamespaceDeclaration("a14", "http://schemas.microsoft.com/office/drawing/2010/main");
            blipExtension1.Append(useLocalDpi1);
            blipExtensionList1.Append(blipExtension1);
            blip1.Append(blipExtensionList1);
            var stretch = new DocumentFormat.OpenXml.Drawing.Stretch();
            stretch.Append(new DocumentFormat.OpenXml.Drawing.FillRectangle());
            blipFill.Append(blip1);
            blipFill.Append(stretch);
            picture.Append(blipFill);

            picture.ShapeProperties = new DocumentFormat.OpenXml.Presentation.ShapeProperties();
            picture.ShapeProperties.Transform2D = new DocumentFormat.OpenXml.Drawing.Transform2D();
            picture.ShapeProperties.Transform2D.Append(new DocumentFormat.OpenXml.Drawing.Offset
            {
                X = 0,
                Y = 0,
            });
            picture.ShapeProperties.Transform2D.Append(new DocumentFormat.OpenXml.Drawing.Extents
            {
                Cx = 1000000,
                Cy = 1000000,
            });
            picture.ShapeProperties.Append(new DocumentFormat.OpenXml.Drawing.PresetGeometry
            {
                Preset = DocumentFormat.OpenXml.Drawing.ShapeTypeValues.Rectangle
            });

            tree.Append(picture);
        }
    }

【讨论】:

  • 嗨@Md。 Zakir 我正在使用上面的代码(顺便谢谢你)无论我做什么,我都很难将 iamge 放置在左上角。
  • 嗨,要将图像放置在特定位置,您必须控制它。 picture.ShapeProperties.Transform2D.Append(new DocumentFormat.OpenXml.Drawing.Offset { X = 0, Y = 0, });在这里,您必须在 X 和 Y 中放置位置值
  • @md-zakir-hossain 谢谢你给我指出了正确的方向我也被它使用像marco像素之类的实际比例所迷惑(无法记住正确的名称)但x必须像 340,500 和类似的 y 是大量数字.. 但这有帮助..
【解决方案2】:

您可以使用 OpenXML SDK Productivity Tool 将 powerpoint 文件反编译为 c#。使用 Image 和 TextBox 创建一个文件,反编译并查看它是如何在 c# 中完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多