private static XElement GetSpPr(PresentationPart part, double percentageOfCy) { XElement sldSz = part.GetXDocument() .Elements(P.presentation) .Elements(P.sldSz) .Single(); var sldCx = (int)sldSz.Attribute(NoNamespace.cx) !; var sldCy = (int)sldSz.Attribute(NoNamespace.cy) !; var extentSize = (long)(sldCy * percentageOfCy); long offsetX = (sldCx / 2) - (extentSize / 2); long offsetY = (sldCy / 2) - (extentSize / 2); return(new XElement(P.spPr, new XElement(A.xfrm, new XElement(A.off, new XAttribute(NoNamespace.x, offsetX), new XAttribute(NoNamespace.y, offsetY)), new XElement(A.ext, new XAttribute(NoNamespace.cx, extentSize), new XAttribute(NoNamespace.cy, extentSize))), new XElement(A.prstGeom, new XAttribute(NoNamespace.prst, "rect"), new XElement(A.avLst)))); }
public static void AddSvg(Stream stream, string svgPath, double percentageOfCy) { using PresentationDocument presentationDocument = PresentationDocument.Open(stream, true); PresentationPart presentationPart = presentationDocument.PresentationPart ?? throw new InvalidOperationException(@"PresentationDocument is invalid."); // Get relationship ID of first slide. string sldRelId = presentationPart.GetXDocument() .Elements(P.presentation) .Elements(P.sldIdLst) .Elements(P.sldId) .Select(sldId => (string)sldId.Attribute(R.id) !) .FirstOrDefault() ?? throw new InvalidOperationException(@"Presentation has no slides."); // Get first slide's part. var slidePart = (SlidePart)presentationPart.GetPartById(sldRelId); // Determine unique relationship IDs for new image parts. int partsCount = slidePart.Parts.Count(); string pngRelId = $"rId{++partsCount}"; string svgRelId = $"rId{++partsCount}"; // Add new image part with PNG image to slide part. using Stream pngStream = GeneralTools.ReadSvgAsPng(svgPath); GeneralTools.AddImagePart(slidePart, ImagePartType.Png, pngRelId, pngStream); // Add new image part with SVG image to slide part. using Stream svgStream = File.Open(svgPath, FileMode.Open, FileAccess.Read); GeneralTools.AddImagePart(slidePart, ImagePartType.Svg, svgRelId, svgStream); var picture = new XElement(P.pic, new XElement(P.nvPicPr, new XElement(P.cNvPr, new XAttribute(NoNamespace.id, ++partsCount), new XAttribute(NoNamespace.name, "Picture 1"), new XElement(A.extLst, new XElement(A.ext, new XAttribute(NoNamespace.uri, "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"), new XElement(A16.creationId, new XAttribute(XNamespace.Xmlns + "a16", A16.a16), new XAttribute(NoNamespace.id, GeneralTools.GetNewGuidString()))))), new XElement(P.cNvPicPr, new XElement(A.picLocks, new XAttribute(NoNamespace.noChangeAspect, "1"))), new XElement(P.nvPr)), new XElement(P.blipFill, new XElement(A.blip, new XAttribute(R.embed, pngRelId), new XElement(A.extLst, new XElement(A.ext, new XAttribute(NoNamespace.uri, "{96DAC541-7B7A-43D3-8B79-37D633B846F1}"), new XElement(ASVG.svgBlip, new XAttribute(XNamespace.Xmlns + "asvg", ASVG.asvg), new XAttribute(R.embed, svgRelId))))), new XElement(A.stretch, new XElement(A.fillRect))), GetSpPr(presentationPart, percentageOfCy)); XElement spTree = slidePart.GetXDocument() .Elements(P.sld) .Elements(P.cSld) .Elements(P.spTree) .Single(); spTree.Add(picture); slidePart.SaveXDocument(); }