{"id":2901,"date":"2016-03-19T05:06:07","date_gmt":"2016-03-19T05:06:07","guid":{"rendered":"http:\/\/www.ericwhite.com\/home2\/bm8qcmjy\/public_html\/blog\/?page_id=2901"},"modified":"2016-03-19T05:06:07","modified_gmt":"2016-03-19T05:06:07","slug":"deleting-slides-using-open-xml-sdk-2-0","status":"publish","type":"page","link":"https:\/\/www.ericwhite.com\/blog\/deleting-slides-using-open-xml-sdk-2-0\/","title":{"rendered":"Deleting Slides Using Open XML SDK 2.0"},"content":{"rendered":"<p>I usually like to use the Linq objects (XDpcument, XElement) when searching and modifying OpenXML documents. However, I know a lot of people prefer to use the specific objects available in version 2.0 of the SDK. For simple operations, this approach can work pretty well. I decided to try this approach while modifying an example I found in the forums that deletes hidden slides in a presentation. This example can be used as follows:<\/p>\n<pre class=\"prettyprint\"><span class=\"kwd\">using<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"typ\">PresentationDocument<\/span><span class=\"pln\"> pdoc <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> <\/span><span class=\"typ\">PresentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Open<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"Default.pptx\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">true<\/span><span class=\"pun\">))<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"typ\">SlideId<\/span><span class=\"pln\"> _slideId <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> <\/span><span class=\"typ\">GetHiddenSlide<\/span><span class=\"pun\">(<\/span><span class=\"pln\">pdoc<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">_slideId <\/span><span class=\"pun\">!=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"typ\">DeleteSlide<\/span><span class=\"pun\">(<\/span><span class=\"pln\">pdoc<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> _slideId<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br>&nbsp; &nbsp; pdoc<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Close<\/span><span class=\"pun\">();<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">}<\/span><\/pre>\n<p>The GetHiddenSlide method will return the SlideId object for the slide to be deleted. DeleteSlide will delete the slide object specified. Of course, this will only delete the first hidden slide in the presentation. Deleting multiple hidden slides would require looping until GetHiddenSlide returns null, or changing GetHiddenSlide to return a list of SlideId objects.<\/p>\n<pre class=\"prettyprint\"><span class=\"com\">\/\/ Get the presentation object and pass it to the next CountSlides method.<\/span><span class=\"pln\"><br><\/span><span class=\"kwd\">public<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">static<\/span><span class=\"pln\"> <\/span><span class=\"typ\">SlideId<\/span><span class=\"pln\"> <\/span><span class=\"typ\">GetHiddenSlide<\/span><span class=\"pun\">(<\/span><span class=\"typ\">PresentationDocument<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Open the presentation as read-only.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"typ\">SlideId<\/span><span class=\"pln\"> slideId <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">foreach<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"typ\">SlidePart<\/span><span class=\"pln\"> slide <\/span><span class=\"kwd\">in<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">PresentationPart<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideParts<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">slide<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Slide<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Show<\/span><span class=\"pln\"> <\/span><span class=\"pun\">!=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pln\"> <\/span><span class=\"pun\">&amp;&amp;<\/span><span class=\"pln\"> <\/span><span class=\"pun\">!<\/span><span class=\"pln\">slide<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Slide<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Show<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">string<\/span><span class=\"pln\"> slideRelId <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">PresentationPart<\/span><span class=\"pun\">.<\/span><span class=\"typ\">GetIdOfPart<\/span><span class=\"pun\">(<\/span><span class=\"pln\">slide<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Get the slide ID of the specified slide<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; slideId <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">PresentationPart<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Presentation<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideIdList<\/span><span class=\"pun\">.<\/span><span class=\"typ\">ChildElements<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Where<\/span><span class=\"pun\">(<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s <\/span><span class=\"pun\">=&gt;<\/span><span class=\"pln\"> <\/span><span class=\"pun\">((<\/span><span class=\"typ\">SlideId<\/span><span class=\"pun\">)<\/span><span class=\"pln\">s<\/span><span class=\"pun\">).<\/span><span class=\"typ\">RelationshipId<\/span><span class=\"pln\"> <\/span><span class=\"pun\">==<\/span><span class=\"pln\"> slideRelId<\/span><span class=\"pun\">).<\/span><span class=\"typ\">FirstOrDefault<\/span><span class=\"pun\">()<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">as<\/span><span class=\"pln\"> <\/span><span class=\"typ\">SlideId<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">break<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Pass the presentation to the next CountSlide method<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"com\">\/\/ and return the slide count.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">return<\/span><span class=\"pln\"> slideId<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">}<\/span><\/pre>\n<p>Here is the first example of using the SlideId object in a Linq query. Once the hidden slide is located, the Linq query is used to find the matching SlideId object in the presentation. That object is the one that will need to be removed from the presentation part. Conveniently, it also contains the relationship ID of the slide, which can be used to easily delete the slide part. All of that is done in the next method:<\/p>\n<pre class=\"prettyprint\"><span class=\"com\">\/\/ Delete the specified slide from the presentation.<\/span><span class=\"pln\"><br><\/span><span class=\"kwd\">public<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">static<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">void<\/span><span class=\"pln\"> <\/span><span class=\"typ\">DeleteSlide<\/span><span class=\"pun\">(<\/span><span class=\"typ\">PresentationDocument<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> <\/span><span class=\"typ\">SlideId<\/span><span class=\"pln\"> slideId<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">presentationDocument <\/span><span class=\"pun\">==<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">throw<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">new<\/span><span class=\"pln\"> <\/span><span class=\"typ\">ArgumentNullException<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"presentationDocument\"<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Get the presentation from the presentation part.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"typ\">Presentation<\/span><span class=\"pln\"> presentation <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> presentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">PresentationPart<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Presentation<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Remove the slide from the slide list.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; presentation<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideIdList<\/span><span class=\"pun\">.<\/span><span class=\"typ\">RemoveChild<\/span><span class=\"pun\">(<\/span><span class=\"pln\">slideId<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Get the relationship ID of the slide.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"kwd\">string<\/span><span class=\"pln\"> slideRelId <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> slideId<\/span><span class=\"pun\">.<\/span><span class=\"typ\">RelationshipId<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/\/\/ Remove references to the slide from all custom shows.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">presentation<\/span><span class=\"pun\">.<\/span><span class=\"typ\">CustomShowList<\/span><span class=\"pln\"> <\/span><span class=\"pun\">!=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Iterate through the list of custom shows.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">foreach<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> customShow <\/span><span class=\"kwd\">in<\/span><span class=\"pln\"> presentation<\/span><span class=\"pun\">.<\/span><span class=\"typ\">CustomShowList<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Elements<\/span><span class=\"pun\">&lt;<\/span><span class=\"typ\">CustomShow<\/span><span class=\"pun\">&gt;())<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">customShow<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideList<\/span><span class=\"pln\"> <\/span><span class=\"pun\">!=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">{<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"typ\">SlideListEntry<\/span><span class=\"pln\"> entry <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> customShow<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideList<\/span><span class=\"pun\">.<\/span><span class=\"typ\">ChildElements<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Where<\/span><span class=\"pun\">(<\/span><span class=\"pln\">s <\/span><span class=\"pun\">=&gt;<\/span><span class=\"pln\"> <\/span><span class=\"pun\">((<\/span><span class=\"typ\">SlideListEntry<\/span><span class=\"pun\">)<\/span><span class=\"pln\">s<\/span><span class=\"pun\">).<\/span><span class=\"typ\">Id<\/span><span class=\"pln\"> <\/span><span class=\"pun\">==<\/span><span class=\"pln\"> slideRelId<\/span><span class=\"pun\">).<\/span><span class=\"typ\">FirstOrDefault<\/span><span class=\"pun\">()<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">as<\/span><span class=\"pln\"> <\/span><span class=\"typ\">SlideListEntry<\/span><span class=\"pun\">;<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> <\/span><span class=\"pun\">(<\/span><span class=\"pln\">entry <\/span><span class=\"pun\">!=<\/span><span class=\"pln\"> <\/span><span class=\"kwd\">null<\/span><span class=\"pun\">)<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customShow<\/span><span class=\"pun\">.<\/span><span class=\"typ\">SlideList<\/span><span class=\"pun\">.<\/span><span class=\"typ\">RemoveChild<\/span><span class=\"pun\">(<\/span><span class=\"pln\">entry<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; &nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"pun\">}<\/span><span class=\"pln\"><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Save the modified presentation.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; presentation<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Save<\/span><span class=\"pun\">();<\/span><span class=\"pln\"><br><br>&nbsp; &nbsp; <\/span><span class=\"com\">\/\/ Remove the slide part.<\/span><span class=\"pln\"><br>&nbsp; &nbsp; presentationDocument<\/span><span class=\"pun\">.<\/span><span class=\"typ\">PresentationPart<\/span><span class=\"pun\">.<\/span><span class=\"typ\">DeletePart<\/span><span class=\"pun\">(<\/span><span class=\"pln\">slideRelId<\/span><span class=\"pun\">);<\/span><span class=\"pln\"><br><\/span><span class=\"pun\">}<\/span><\/pre>\n<p>There are three steps to deleting a slide. First, the SlideId entry is removed from the SlideIdList in the presentation part. Second, the slide may be referenced from any number of custom slide shows. The middle of the method iterates through the list of shows, but then uses a Linq query to find a matching entry in the show, if any, and delete it. Third, the slide part needs to be removed from the document. That can be done using the relationship ID for the slide.<\/p>\n<p>Notice that even though the Linq queries use generic objects, they can be easily cast to the appropriate object from the SDK 2.0. If it is not convenient to use the SlideId object for the delete method, then you could use a relationship ID instead and move the Linq query from GetHiddenSlide into the delete.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I usually like to use the Linq objects (XDpcument, XElement) when searching and modifying OpenXML documents. However, I know a lot of people prefer to use the specific objects available in version 2.0 of the SDK. For simple operations, this approach can work pretty well. I decided to try this approach while modifying an example [&hellip;]<\/p>\n","protected":false},"author":10567,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"_s2mail":"","footnotes":""},"class_list":["post-2901","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/pages\/2901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/users\/10567"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/comments?post=2901"}],"version-history":[{"count":1,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/pages\/2901\/revisions"}],"predecessor-version":[{"id":2902,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/pages\/2901\/revisions\/2902"}],"wp:attachment":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/media?parent=2901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}