Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to insert a shape in a powerpoint slide using OpenXML

This question could seem rather basic, but how do I insert a shape (i. e. a rectangle) in a slide using OpenXML in c#?

I've searched around and all I see is "create a slide with the shape and use the SDK Productivity Tool to reflect the code. That's not really helpful :(

like image 607
Yván Ecarri Avatar asked Sep 15 '13 07:09

Yván Ecarri


1 Answers

After hitting my head against the wall for a while, finally I took the advice, created a slide with the shape and used the tool to reflect the code. So for next generations, here is a brief explanation of how to do it by hand.

Firts of all you have to know is that a shape is inserted into a ShapeTree, which is part of a CommonSlideData:

Slide s = GetDesiredSlide(); // Get the slide where you want to insert the shape.
s.CommonSlideData.ShapeTree.Append(GenerateShape());

Second you should know is that a shape must contain at least 4 childs that describe its behavior:

  • A ShapeStyle object
  • A ShapeProperties object
  • A TextBody object
  • A NonVisualShapeProperties

In the sample code bellow I am using the following namespaces and variables:

using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using D = DocumentFormat.OpenXml.Drawing;

D.ShapeTypeValues shapeType; // Any of the built-in shapes (ellipse, rectangle, etc)
string rgbColorHex; // Hexadecimal RGB color code to fill the shape.
long x; // Represents the shape x position in 1/36000 cm.
long y; // Represents the shape y position in 1/36000 cm.
long width; // Shapw width in in 1/36000 cm.
long heigth;// Shapw heigth in in 1/36000 cm.

ShapeStyle Object

The shape style object describes general shape style attributes like the borders, the fill style, the text font and the visual effect (shadows, and other)

ShapeStyle shapeStyle1 = new ShapeStyle();

D.LineReference lineReference1 = new D.LineReference() { Index = (UInt32Value)2U };

D.SchemeColor schemeColor2 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };
D.Shade shade1 = new D.Shade() { Val = 50000 };

schemeColor2.Append(shade1);

lineReference1.Append(schemeColor2);

D.FillReference fillReference1 = new D.FillReference() { Index = (UInt32Value)1U };
D.SchemeColor schemeColor3 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };

fillReference1.Append(schemeColor3);

D.EffectReference effectReference1 = new D.EffectReference() { Index = (UInt32Value)0U };
D.SchemeColor schemeColor4 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };

effectReference1.Append(schemeColor4);

D.FontReference fontReference1 = new D.FontReference() { Index = D.FontCollectionIndexValues.Minor };
D.SchemeColor schemeColor5 = new D.SchemeColor() { Val = D.SchemeColorValues.Light1 };

fontReference1.Append(schemeColor5);

shapeStyle1.Append(lineReference1);
shapeStyle1.Append(fillReference1);
shapeStyle1.Append(effectReference1);
shapeStyle1.Append(fontReference1);

ShapeProperties

Define shape's visual Properties like Fill method (solid, gradient, etc.) Geometry (size, location, flipping, rotarion) Fill and Outline.

ShapeProperties shapeProperties1 = new ShapeProperties();

D.Transform2D transform2D1 = new D.Transform2D();
D.Offset offset1 = new D.Offset() { X = x, Y = y };
D.Extents extents1 = new D.Extents() { Cx = width, Cy = heigth };

transform2D1.Append(offset1);
transform2D1.Append(extents1);

D.PresetGeometry presetGeometry1 = new D.PresetGeometry() { Preset = shapeType };
D.AdjustValueList adjustValueList1 = new D.AdjustValueList();

presetGeometry1.Append(adjustValueList1);

D.SolidFill solidFill1 = new D.SolidFill();
D.RgbColorModelHex rgbColorModelHex1 = new D.RgbColorModelHex() { Val = rgbColorHex };

solidFill1.Append(rgbColorModelHex1);

D.Outline outline1 = new D.Outline() { Width = 12700 };

D.SolidFill solidFill2 = new D.SolidFill();
D.SchemeColor schemeColor1 = new D.SchemeColor() { Val = D.SchemeColorValues.Text1 };

solidFill2.Append(schemeColor1);

outline1.Append(solidFill2);

shapeProperties1.Append(transform2D1);
shapeProperties1.Append(presetGeometry1);
shapeProperties1.Append(solidFill1);
shapeProperties1.Append(outline1);

TextBody

Defines the textbox attributes like number of columns, alignment, anchoring, etc.

TextBody textBody1 = new TextBody();
D.BodyProperties bodyProperties1 = new D.BodyProperties() { RightToLeftColumns = false, Anchor = D.TextAnchoringTypeValues.Center };
D.ListStyle listStyle1 = new D.ListStyle();

D.Paragraph paragraph1 = new D.Paragraph();
D.ParagraphProperties paragraphProperties1 = new D.ParagraphProperties() { Alignment = D.TextAlignmentTypeValues.Center };
D.EndParagraphRunProperties endParagraphRunProperties1 = new D.EndParagraphRunProperties() { Language = "es-ES" };

paragraph1.Append(paragraphProperties1);
paragraph1.Append(endParagraphRunProperties1);

textBody1.Append(bodyProperties1);
textBody1.Append(listStyle1);
textBody1.Append(paragraph1);

NonVisualShapeProperties

Define non visual properties like the Name and the Id.

NonVisualShapeProperties nonVisualShapeProperties1 = new NonVisualShapeProperties();
NonVisualDrawingProperties nonVisualDrawingProperties1 = new NonVisualDrawingProperties() { Id = (UInt32Value)4U, Name = "1 Shape Name" };
NonVisualShapeDrawingProperties nonVisualShapeDrawingProperties1 = new NonVisualShapeDrawingProperties();
ApplicationNonVisualDrawingProperties applicationNonVisualDrawingProperties1 = new ApplicationNonVisualDrawingProperties();

nonVisualShapeProperties1.Append(nonVisualDrawingProperties1);
nonVisualShapeProperties1.Append(nonVisualShapeDrawingProperties1);
nonVisualShapeProperties1.Append(applicationNonVisualDrawingProperties1);

Putting all together

Finally you have to create the shape object and append these properties to it:

Shape shape1 = new Shape();
shape1.Append(nonVisualShapeProperties1);
shape1.Append(shapeProperties1);
shape1.Append(shapeStyle1);
shape1.Append(textBody1);

And then, add the shape to the slide's shape tree:

s.CommonSlideData.ShapeTree.Append(shape1);
like image 164
Yván Ecarri Avatar answered Oct 24 '22 05:10

Yván Ecarri