PresentationBuilder.cs 105 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825
  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Xml.Linq;
  8. using System.Text;
  9. using DocumentFormat.OpenXml.Packaging;
  10. namespace OpenXmlPowerTools
  11. {
  12. public class SlideSource
  13. {
  14. public PmlDocument PmlDocument { get; set; }
  15. public int Start { get; set; }
  16. public int Count { get; set; }
  17. public bool KeepMaster { get; set; }
  18. public SlideSource(PmlDocument source, bool keepMaster)
  19. {
  20. PmlDocument = source;
  21. Start = 0;
  22. Count = Int32.MaxValue;
  23. KeepMaster = keepMaster;
  24. }
  25. public SlideSource(string fileName, bool keepMaster)
  26. {
  27. PmlDocument = new PmlDocument(fileName);
  28. Start = 0;
  29. Count = Int32.MaxValue;
  30. KeepMaster = keepMaster;
  31. }
  32. public SlideSource(PmlDocument source, int start, bool keepMaster)
  33. {
  34. PmlDocument = source;
  35. Start = start;
  36. Count = Int32.MaxValue;
  37. KeepMaster = keepMaster;
  38. }
  39. public SlideSource(string fileName, int start, bool keepMaster)
  40. {
  41. PmlDocument = new PmlDocument(fileName);
  42. Start = start;
  43. Count = Int32.MaxValue;
  44. KeepMaster = keepMaster;
  45. }
  46. public SlideSource(PmlDocument source, int start, int count, bool keepMaster)
  47. {
  48. PmlDocument = source;
  49. Start = start;
  50. Count = count;
  51. KeepMaster = keepMaster;
  52. }
  53. public SlideSource(string fileName, int start, int count, bool keepMaster)
  54. {
  55. PmlDocument = new PmlDocument(fileName);
  56. Start = start;
  57. Count = count;
  58. KeepMaster = keepMaster;
  59. }
  60. }
  61. public static class PresentationBuilder
  62. {
  63. public static void BuildPresentation(List<SlideSource> sources, string fileName)
  64. {
  65. using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreatePresentationDocument())
  66. {
  67. using (PresentationDocument output = streamDoc.GetPresentationDocument())
  68. {
  69. BuildPresentation(sources, output);
  70. output.Close();
  71. }
  72. streamDoc.GetModifiedDocument().SaveAs(fileName);
  73. }
  74. }
  75. public static PmlDocument BuildPresentation(List<SlideSource> sources)
  76. {
  77. using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreatePresentationDocument())
  78. {
  79. using (PresentationDocument output = streamDoc.GetPresentationDocument())
  80. {
  81. BuildPresentation(sources, output);
  82. output.Close();
  83. }
  84. return streamDoc.GetModifiedPmlDocument();
  85. }
  86. }
  87. private static void BuildPresentation(List<SlideSource> sources, PresentationDocument output)
  88. {
  89. if (RelationshipMarkup == null)
  90. RelationshipMarkup = new Dictionary<XName, XName[]>()
  91. {
  92. { A.audioFile, new [] { R.link }},
  93. { A.videoFile, new [] { R.link }},
  94. { A.quickTimeFile, new [] { R.link }},
  95. { A.wavAudioFile, new [] { R.embed }},
  96. { A.blip, new [] { R.embed, R.link }},
  97. { A.hlinkClick, new [] { R.id }},
  98. { A.hlinkMouseOver, new [] { R.id }},
  99. { A.hlinkHover, new [] { R.id }},
  100. { A.relIds, new [] { R.cs, R.dm, R.lo, R.qs }},
  101. { C.chart, new [] { R.id }},
  102. { C.externalData, new [] { R.id }},
  103. { C.userShapes, new [] { R.id }},
  104. { DGM.relIds, new [] { R.cs, R.dm, R.lo, R.qs }},
  105. { A14.imgLayer, new [] { R.embed }},
  106. { P14.media, new [] { R.embed, R.link }},
  107. { P.oleObj, new [] { R.id }},
  108. { P.externalData, new [] { R.id }},
  109. { P.control, new [] { R.id }},
  110. { P.snd, new [] { R.embed }},
  111. { P.sndTgt, new [] { R.embed }},
  112. { PAV.srcMedia, new [] { R.embed, R.link }},
  113. { P.contentPart, new [] { R.id }},
  114. { VML.fill, new [] { R.id }},
  115. { VML.imagedata, new [] { R.href, R.id, R.pict, O.relid }},
  116. { VML.stroke, new [] { R.id }},
  117. { WNE.toolbarData, new [] { R.id }},
  118. { Plegacy.textdata, new [] { XName.Get("id") }},
  119. };
  120. List<ImageData> images = new List<ImageData>();
  121. List<MediaData> mediaList = new List<MediaData>();
  122. XDocument mainPart = output.PresentationPart.GetXDocument();
  123. mainPart.Declaration.Standalone = "yes";
  124. mainPart.Declaration.Encoding = "UTF-8";
  125. output.PresentationPart.PutXDocument();
  126. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(sources[0].PmlDocument))
  127. using (PresentationDocument doc = streamDoc.GetPresentationDocument())
  128. {
  129. CopyStartingParts(doc, output);
  130. }
  131. int sourceNum = 0;
  132. SlideMasterPart currentMasterPart = null;
  133. foreach (SlideSource source in sources)
  134. {
  135. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.PmlDocument))
  136. using (PresentationDocument doc = streamDoc.GetPresentationDocument())
  137. {
  138. try
  139. {
  140. if (sourceNum == 0)
  141. CopyPresentationParts(doc, output, images, mediaList);
  142. currentMasterPart = AppendSlides(doc, output, source.Start, source.Count, source.KeepMaster, images, currentMasterPart, mediaList);
  143. }
  144. catch (PresentationBuilderInternalException dbie)
  145. {
  146. if (dbie.Message.Contains("{0}"))
  147. throw new PresentationBuilderException(string.Format(dbie.Message, sourceNum));
  148. else
  149. throw dbie;
  150. }
  151. }
  152. sourceNum++;
  153. }
  154. foreach (var part in output.GetAllParts())
  155. {
  156. if (part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.slide+xml" ||
  157. part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml" ||
  158. part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml" ||
  159. part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml" ||
  160. part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml" ||
  161. part.ContentType == "application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml" ||
  162. part.ContentType == "application/vnd.openxmlformats-officedocument.theme+xml" ||
  163. part.ContentType == "application/vnd.openxmlformats-officedocument.drawingml.chart+xml" ||
  164. part.ContentType == "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml" ||
  165. part.ContentType == "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" ||
  166. part.ContentType == "application/vnd.ms-office.drawingml.diagramDrawing+xml")
  167. {
  168. XDocument xd = part.GetXDocument();
  169. xd.Descendants().Attributes("smtClean").Remove();
  170. part.PutXDocument();
  171. }
  172. else if (part.Annotation<XDocument>() != null)
  173. part.PutXDocument();
  174. }
  175. }
  176. private static void CopyStartingParts(PresentationDocument sourceDocument, PresentationDocument newDocument)
  177. {
  178. // A Core File Properties part does not have implicit or explicit relationships to other parts.
  179. CoreFilePropertiesPart corePart = sourceDocument.CoreFilePropertiesPart;
  180. if (corePart != null && corePart.GetXDocument().Root != null)
  181. {
  182. newDocument.AddCoreFilePropertiesPart();
  183. XDocument newXDoc = newDocument.CoreFilePropertiesPart.GetXDocument();
  184. newXDoc.Declaration.Standalone = "yes";
  185. newXDoc.Declaration.Encoding = "UTF-8";
  186. XDocument sourceXDoc = corePart.GetXDocument();
  187. newXDoc.Add(sourceXDoc.Root);
  188. }
  189. // An application attributes part does not have implicit or explicit relationships to other parts.
  190. ExtendedFilePropertiesPart extPart = sourceDocument.ExtendedFilePropertiesPart;
  191. if (extPart != null)
  192. {
  193. OpenXmlPart newPart = newDocument.AddExtendedFilePropertiesPart();
  194. XDocument newXDoc = newDocument.ExtendedFilePropertiesPart.GetXDocument();
  195. newXDoc.Declaration.Standalone = "yes";
  196. newXDoc.Declaration.Encoding = "UTF-8";
  197. newXDoc.Add(extPart.GetXDocument().Root);
  198. }
  199. // An custom file properties part does not have implicit or explicit relationships to other parts.
  200. CustomFilePropertiesPart customPart = sourceDocument.CustomFilePropertiesPart;
  201. if (customPart != null)
  202. {
  203. newDocument.AddCustomFilePropertiesPart();
  204. XDocument newXDoc = newDocument.CustomFilePropertiesPart.GetXDocument();
  205. newXDoc.Declaration.Standalone = "yes";
  206. newXDoc.Declaration.Encoding = "UTF-8";
  207. newXDoc.Add(customPart.GetXDocument().Root);
  208. }
  209. }
  210. #if false
  211. // TODO need to handle the following
  212. { P.custShowLst, 80 },
  213. { P.photoAlbum, 90 },
  214. { P.custDataLst, 100 },
  215. { P.kinsoku, 120 },
  216. { P.modifyVerifier, 150 },
  217. #endif
  218. // Copy handout master, notes master, presentation properties and view properties, if they exist
  219. private static void CopyPresentationParts(PresentationDocument sourceDocument, PresentationDocument newDocument, List<ImageData> images, List<MediaData> mediaList)
  220. {
  221. XDocument newPresentation = newDocument.PresentationPart.GetXDocument();
  222. // Copy slide and note slide sizes
  223. XDocument oldPresentationDoc = sourceDocument.PresentationPart.GetXDocument();
  224. foreach (var att in oldPresentationDoc.Root.Attributes())
  225. {
  226. if (!att.IsNamespaceDeclaration && newPresentation.Root.Attribute(att.Name) == null)
  227. newPresentation.Root.Add(oldPresentationDoc.Root.Attribute(att.Name));
  228. }
  229. XElement oldElement = oldPresentationDoc.Root.Elements(P.sldSz).FirstOrDefault();
  230. if (oldElement != null)
  231. newPresentation.Root.Add(oldElement);
  232. // Copy Font Parts
  233. if (oldPresentationDoc.Root.Element(P.embeddedFontLst) != null)
  234. {
  235. XElement newFontLst = new XElement(P.embeddedFontLst);
  236. foreach (var font in oldPresentationDoc.Root.Element(P.embeddedFontLst).Elements(P.embeddedFont))
  237. {
  238. XElement newRegular = null, newBold = null, newItalic = null, newBoldItalic = null;
  239. if (font.Element(P.regular) != null)
  240. newRegular = CreatedEmbeddedFontPart(sourceDocument, newDocument, font, P.regular);
  241. if (font.Element(P.bold) != null)
  242. newBold = CreatedEmbeddedFontPart(sourceDocument, newDocument, font, P.bold);
  243. if (font.Element(P.italic) != null)
  244. newItalic = CreatedEmbeddedFontPart(sourceDocument, newDocument, font, P.italic);
  245. if (font.Element(P.boldItalic) != null)
  246. newBoldItalic = CreatedEmbeddedFontPart(sourceDocument, newDocument, font, P.boldItalic);
  247. XElement newEmbeddedFont = new XElement(P.embeddedFont,
  248. font.Elements(P.font),
  249. newRegular,
  250. newBold,
  251. newItalic,
  252. newBoldItalic);
  253. newFontLst.Add(newEmbeddedFont);
  254. }
  255. newPresentation.Root.Add(newFontLst);
  256. }
  257. newPresentation.Root.Add(oldPresentationDoc.Root.Element(P.defaultTextStyle));
  258. newPresentation.Root.Add(oldPresentationDoc.Root.Elements(P.extLst));
  259. //<p:embeddedFont xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"
  260. // xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  261. // <p:font typeface="Perpetua" panose="02020502060401020303" pitchFamily="18" charset="0" />
  262. // <p:regular r:id="rId5" />
  263. // <p:bold r:id="rId6" />
  264. // <p:italic r:id="rId7" />
  265. // <p:boldItalic r:id="rId8" />
  266. //</p:embeddedFont>
  267. // Copy Handout Master
  268. if (sourceDocument.PresentationPart.HandoutMasterPart != null)
  269. {
  270. HandoutMasterPart oldMaster = sourceDocument.PresentationPart.HandoutMasterPart;
  271. HandoutMasterPart newMaster = newDocument.PresentationPart.AddNewPart<HandoutMasterPart>();
  272. // Copy theme for master
  273. ThemePart newThemePart = newMaster.AddNewPart<ThemePart>();
  274. newThemePart.PutXDocument(oldMaster.ThemePart.GetXDocument());
  275. CopyRelatedPartsForContentParts(newDocument, oldMaster.ThemePart, newThemePart, new[] { newThemePart.GetXDocument().Root }, images, mediaList);
  276. // Copy master
  277. newMaster.PutXDocument(oldMaster.GetXDocument());
  278. AddRelationships(oldMaster, newMaster, new[] { newMaster.GetXDocument().Root });
  279. CopyRelatedPartsForContentParts(newDocument, oldMaster, newMaster, new[] { newMaster.GetXDocument().Root }, images, mediaList);
  280. newPresentation.Root.Add(
  281. new XElement(P.handoutMasterIdLst, new XElement(P.handoutMasterId,
  282. new XAttribute(R.id, newDocument.PresentationPart.GetIdOfPart(newMaster)))));
  283. }
  284. // Copy Notes Master
  285. CopyNotesMaster(sourceDocument, newDocument, images, mediaList);
  286. // Copy Presentation Properties
  287. if (sourceDocument.PresentationPart.PresentationPropertiesPart != null)
  288. {
  289. PresentationPropertiesPart newPart = newDocument.PresentationPart.AddNewPart<PresentationPropertiesPart>();
  290. XDocument xd1 = sourceDocument.PresentationPart.PresentationPropertiesPart.GetXDocument();
  291. xd1.Descendants(P.custShow).Remove();
  292. newPart.PutXDocument(xd1);
  293. }
  294. // Copy View Properties
  295. if (sourceDocument.PresentationPart.ViewPropertiesPart != null)
  296. {
  297. ViewPropertiesPart newPart = newDocument.PresentationPart.AddNewPart<ViewPropertiesPart>();
  298. XDocument xd = sourceDocument.PresentationPart.ViewPropertiesPart.GetXDocument();
  299. xd.Descendants(P.outlineViewPr).Elements(P.sldLst).Remove();
  300. newPart.PutXDocument(xd);
  301. }
  302. foreach (var legacyDocTextInfo in sourceDocument.PresentationPart.Parts.Where(p => p.OpenXmlPart.RelationshipType == "http://schemas.microsoft.com/office/2006/relationships/legacyDocTextInfo"))
  303. {
  304. LegacyDiagramTextInfoPart newPart = newDocument.PresentationPart.AddNewPart<LegacyDiagramTextInfoPart>();
  305. newPart.FeedData(legacyDocTextInfo.OpenXmlPart.GetStream());
  306. }
  307. var listOfRootChildren = newPresentation.Root.Elements().ToList();
  308. foreach (var rc in listOfRootChildren)
  309. rc.Remove();
  310. newPresentation.Root.Add(
  311. listOfRootChildren.OrderBy(e =>
  312. {
  313. if (Order_presentation.ContainsKey(e.Name))
  314. return Order_presentation[e.Name];
  315. return 999;
  316. }));
  317. }
  318. private static Dictionary<XName, int> Order_presentation = new Dictionary<XName, int>
  319. {
  320. { P.sldMasterIdLst, 10 },
  321. { P.notesMasterIdLst, 20 },
  322. { P.handoutMasterIdLst, 30 },
  323. { P.sldIdLst, 40 },
  324. { P.sldSz, 50 },
  325. { P.notesSz, 60 },
  326. { P.embeddedFontLst, 70 },
  327. { P.custShowLst, 80 },
  328. { P.photoAlbum, 90 },
  329. { P.custDataLst, 100 },
  330. { P.kinsoku, 120 },
  331. { P.defaultTextStyle, 130 },
  332. { P.modifyVerifier, 150 },
  333. { P.extLst, 160 },
  334. };
  335. private static XElement CreatedEmbeddedFontPart(PresentationDocument sourceDocument, PresentationDocument newDocument, XElement font, XName fontXName)
  336. {
  337. XElement newRegular;
  338. FontPart oldFontPart = (FontPart)sourceDocument.PresentationPart.GetPartById((string)font.Element(fontXName).Attributes(R.id).FirstOrDefault());
  339. FontPartType fpt;
  340. if (oldFontPart.ContentType == "application/x-fontdata")
  341. fpt = FontPartType.FontData;
  342. else if (oldFontPart.ContentType == "application/x-font-ttf")
  343. fpt = FontPartType.FontTtf;
  344. else
  345. fpt = FontPartType.FontOdttf;
  346. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  347. var newFontPart = newDocument.PresentationPart.AddFontPart(fpt, newId);
  348. newFontPart.FeedData(oldFontPart.GetStream());
  349. newRegular = new XElement(fontXName,
  350. new XAttribute(R.id, newId));
  351. return newRegular;
  352. }
  353. private static SlideMasterPart AppendSlides(PresentationDocument sourceDocument, PresentationDocument newDocument,
  354. int start, int count, bool keepMaster, List<ImageData> images, SlideMasterPart currentMasterPart, List<MediaData> mediaList)
  355. {
  356. XDocument newPresentation = newDocument.PresentationPart.GetXDocument();
  357. if (newPresentation.Root.Element(P.sldIdLst) == null)
  358. newPresentation.Root.Add(new XElement(P.sldIdLst));
  359. uint newID = 256;
  360. var ids = newPresentation.Root.Descendants(P.sldId).Select(f => (uint)f.Attribute(NoNamespace.id));
  361. if (ids.Any())
  362. newID = ids.Max() + 1;
  363. var slideList = sourceDocument.PresentationPart.GetXDocument().Root.Descendants(P.sldId);
  364. if (slideList.Count() == 0 && (currentMasterPart == null || keepMaster))
  365. {
  366. var slideMasterPart = sourceDocument.PresentationPart.SlideMasterParts.FirstOrDefault();
  367. if (slideMasterPart != null)
  368. currentMasterPart = CopyMasterSlide(sourceDocument, slideMasterPart, newDocument, newPresentation, images, mediaList);
  369. return currentMasterPart;
  370. }
  371. while (count > 0 && start < slideList.Count())
  372. {
  373. SlidePart slide = (SlidePart)sourceDocument.PresentationPart.GetPartById(slideList.ElementAt(start).Attribute(R.id).Value);
  374. if (currentMasterPart == null || keepMaster)
  375. currentMasterPart = CopyMasterSlide(sourceDocument, slide.SlideLayoutPart.SlideMasterPart, newDocument, newPresentation, images, mediaList);
  376. SlidePart newSlide = newDocument.PresentationPart.AddNewPart<SlidePart>();
  377. newSlide.PutXDocument(slide.GetXDocument());
  378. AddRelationships(slide, newSlide, new[] { newSlide.GetXDocument().Root });
  379. CopyRelatedPartsForContentParts(newDocument, slide, newSlide, new[] { newSlide.GetXDocument().Root }, images, mediaList);
  380. CopyTableStyles(sourceDocument, newDocument, slide, newSlide);
  381. if (slide.NotesSlidePart != null)
  382. {
  383. if (newDocument.PresentationPart.NotesMasterPart == null)
  384. CopyNotesMaster(sourceDocument, newDocument, images, mediaList);
  385. NotesSlidePart newPart = newSlide.AddNewPart<NotesSlidePart>();
  386. newPart.PutXDocument(slide.NotesSlidePart.GetXDocument());
  387. newPart.AddPart(newSlide);
  388. newPart.AddPart(newDocument.PresentationPart.NotesMasterPart);
  389. AddRelationships(slide.NotesSlidePart, newPart, new[] { newPart.GetXDocument().Root });
  390. CopyRelatedPartsForContentParts(newDocument, slide.NotesSlidePart, newPart, new[] { newPart.GetXDocument().Root }, images, mediaList);
  391. }
  392. string layoutName = slide.SlideLayoutPart.GetXDocument().Root.Element(P.cSld).Attribute(NoNamespace.name).Value;
  393. foreach (SlideLayoutPart layoutPart in currentMasterPart.SlideLayoutParts)
  394. if (layoutPart.GetXDocument().Root.Element(P.cSld).Attribute(NoNamespace.name).Value == layoutName)
  395. {
  396. newSlide.AddPart(layoutPart);
  397. break;
  398. }
  399. if (newSlide.SlideLayoutPart == null)
  400. newSlide.AddPart(currentMasterPart.SlideLayoutParts.First()); // Cannot find matching layout part
  401. if (slide.SlideCommentsPart != null)
  402. CopyComments(sourceDocument, newDocument, slide, newSlide);
  403. newPresentation.Root.Element(P.sldIdLst).Add(new XElement(P.sldId,
  404. new XAttribute(NoNamespace.id, newID.ToString()),
  405. new XAttribute(R.id, newDocument.PresentationPart.GetIdOfPart(newSlide))));
  406. newID++;
  407. start++;
  408. count--;
  409. }
  410. return currentMasterPart;
  411. }
  412. private static SlideMasterPart CopyMasterSlide(PresentationDocument sourceDocument, SlideMasterPart sourceMasterPart,
  413. PresentationDocument newDocument, XDocument newPresentation, List<ImageData> images, List<MediaData> mediaList)
  414. {
  415. // Search for existing master slide with same theme name
  416. XDocument oldTheme = sourceMasterPart.ThemePart.GetXDocument();
  417. String themeName = oldTheme.Root.Attribute(NoNamespace.name).Value;
  418. foreach (SlideMasterPart master in newDocument.PresentationPart.GetPartsOfType<SlideMasterPart>())
  419. {
  420. XDocument themeDoc = master.ThemePart.GetXDocument();
  421. if (themeDoc.Root.Attribute(NoNamespace.name).Value == themeName)
  422. return master;
  423. }
  424. SlideMasterPart newMaster = newDocument.PresentationPart.AddNewPart<SlideMasterPart>();
  425. XDocument sourceMaster = sourceMasterPart.GetXDocument();
  426. // Add to presentation slide master list, need newID for layout IDs also
  427. uint newID = 2147483648;
  428. var ids = newPresentation.Root.Descendants(P.sldMasterId).Select(f => (uint)f.Attribute(NoNamespace.id));
  429. if (ids.Any())
  430. {
  431. newID = ids.Max();
  432. XElement maxMaster = newPresentation.Root.Descendants(P.sldMasterId).Where(f => (uint)f.Attribute(NoNamespace.id) == newID).FirstOrDefault();
  433. SlideMasterPart maxMasterPart = (SlideMasterPart)newDocument.PresentationPart.GetPartById(maxMaster.Attribute(R.id).Value);
  434. newID += (uint)maxMasterPart.GetXDocument().Root.Descendants(P.sldLayoutId).Count() + 1;
  435. }
  436. newPresentation.Root.Element(P.sldMasterIdLst).Add(new XElement(P.sldMasterId,
  437. new XAttribute(NoNamespace.id, newID.ToString()),
  438. new XAttribute(R.id, newDocument.PresentationPart.GetIdOfPart(newMaster))));
  439. newID++;
  440. ThemePart newThemePart = newMaster.AddNewPart<ThemePart>();
  441. if (newDocument.PresentationPart.ThemePart == null)
  442. newThemePart = newDocument.PresentationPart.AddPart(newThemePart);
  443. newThemePart.PutXDocument(oldTheme);
  444. CopyRelatedPartsForContentParts(newDocument, sourceMasterPart.ThemePart, newThemePart, new[] { newThemePart.GetXDocument().Root }, images, mediaList);
  445. foreach (SlideLayoutPart layoutPart in sourceMasterPart.SlideLayoutParts)
  446. {
  447. SlideLayoutPart newLayout = newMaster.AddNewPart<SlideLayoutPart>();
  448. newLayout.PutXDocument(layoutPart.GetXDocument());
  449. AddRelationships(layoutPart, newLayout, new[] { newLayout.GetXDocument().Root });
  450. CopyRelatedPartsForContentParts(newDocument, layoutPart, newLayout, new[] { newLayout.GetXDocument().Root }, images, mediaList);
  451. newLayout.AddPart(newMaster);
  452. string resID = sourceMasterPart.GetIdOfPart(layoutPart);
  453. XElement entry = sourceMaster.Root.Descendants(P.sldLayoutId).Where(f => f.Attribute(R.id).Value == resID).FirstOrDefault();
  454. entry.Attribute(R.id).SetValue(newMaster.GetIdOfPart(newLayout));
  455. entry.SetAttributeValue(NoNamespace.id, newID.ToString());
  456. newID++;
  457. }
  458. newMaster.PutXDocument(sourceMaster);
  459. AddRelationships(sourceMasterPart, newMaster, new[] { newMaster.GetXDocument().Root });
  460. CopyRelatedPartsForContentParts(newDocument, sourceMasterPart, newMaster, new[] { newMaster.GetXDocument().Root }, images, mediaList);
  461. return newMaster;
  462. }
  463. // Copies notes master and notesSz element from presentation
  464. private static void CopyNotesMaster(PresentationDocument sourceDocument, PresentationDocument newDocument, List<ImageData> images, List<MediaData> mediaList)
  465. {
  466. // Copy notesSz element from presentation
  467. XDocument newPresentation = newDocument.PresentationPart.GetXDocument();
  468. XDocument oldPresentationDoc = sourceDocument.PresentationPart.GetXDocument();
  469. XElement oldElement = oldPresentationDoc.Root.Element(P.notesSz);
  470. newPresentation.Root.Element(P.notesSz).ReplaceWith(oldElement);
  471. // Copy Notes Master
  472. if (sourceDocument.PresentationPart.NotesMasterPart != null)
  473. {
  474. NotesMasterPart oldMaster = sourceDocument.PresentationPart.NotesMasterPart;
  475. NotesMasterPart newMaster = newDocument.PresentationPart.AddNewPart<NotesMasterPart>();
  476. // Copy theme for master
  477. if (oldMaster.ThemePart != null)
  478. {
  479. ThemePart newThemePart = newMaster.AddNewPart<ThemePart>();
  480. newThemePart.PutXDocument(oldMaster.ThemePart.GetXDocument());
  481. CopyRelatedPartsForContentParts(newDocument, oldMaster.ThemePart, newThemePart, new[] { newThemePart.GetXDocument().Root }, images, mediaList);
  482. }
  483. // Copy master
  484. newMaster.PutXDocument(oldMaster.GetXDocument());
  485. AddRelationships(oldMaster, newMaster, new[] { newMaster.GetXDocument().Root });
  486. CopyRelatedPartsForContentParts(newDocument, oldMaster, newMaster, new[] { newMaster.GetXDocument().Root }, images, mediaList);
  487. newPresentation.Root.Add(
  488. new XElement(P.notesMasterIdLst, new XElement(P.notesMasterId,
  489. new XAttribute(R.id, newDocument.PresentationPart.GetIdOfPart(newMaster)))));
  490. }
  491. }
  492. private static void CopyComments(PresentationDocument oldDocument, PresentationDocument newDocument, SlidePart oldSlide, SlidePart newSlide)
  493. {
  494. newSlide.AddNewPart<SlideCommentsPart>();
  495. newSlide.SlideCommentsPart.PutXDocument(oldSlide.SlideCommentsPart.GetXDocument());
  496. XDocument newSlideComments = newSlide.SlideCommentsPart.GetXDocument();
  497. XDocument oldAuthors = oldDocument.PresentationPart.CommentAuthorsPart.GetXDocument();
  498. foreach (XElement comment in newSlideComments.Root.Elements(P.cm))
  499. {
  500. XElement newAuthor = FindCommentsAuthor(newDocument, comment, oldAuthors);
  501. // Update last index value for new comment
  502. comment.Attribute(NoNamespace.authorId).SetValue(newAuthor.Attribute(NoNamespace.id).Value);
  503. uint lastIndex = Convert.ToUInt32(newAuthor.Attribute(NoNamespace.lastIdx).Value);
  504. comment.Attribute(NoNamespace.idx).SetValue(lastIndex.ToString());
  505. newAuthor.Attribute(NoNamespace.lastIdx).SetValue(Convert.ToString(lastIndex + 1));
  506. }
  507. }
  508. private static XElement FindCommentsAuthor(PresentationDocument newDocument, XElement comment, XDocument oldAuthors)
  509. {
  510. XElement oldAuthor = oldAuthors.Root.Elements(P.cmAuthor).Where(
  511. f => f.Attribute(NoNamespace.id).Value == comment.Attribute(NoNamespace.authorId).Value).FirstOrDefault();
  512. XElement newAuthor = null;
  513. if (newDocument.PresentationPart.CommentAuthorsPart == null)
  514. {
  515. newDocument.PresentationPart.AddNewPart<CommentAuthorsPart>();
  516. newDocument.PresentationPart.CommentAuthorsPart.PutXDocument(new XDocument(new XElement(P.cmAuthorLst,
  517. new XAttribute(XNamespace.Xmlns + "a", A.a),
  518. new XAttribute(XNamespace.Xmlns + "r", R.r),
  519. new XAttribute(XNamespace.Xmlns + "p", P.p))));
  520. }
  521. XDocument authors = newDocument.PresentationPart.CommentAuthorsPart.GetXDocument();
  522. newAuthor = authors.Root.Elements(P.cmAuthor).Where(
  523. f => f.Attribute(NoNamespace.initials).Value == oldAuthor.Attribute(NoNamespace.initials).Value).FirstOrDefault();
  524. if (newAuthor == null)
  525. {
  526. uint newID = 0;
  527. var ids = authors.Root.Descendants(P.cmAuthor).Select(f => (uint)f.Attribute(NoNamespace.id));
  528. if (ids.Any())
  529. newID = ids.Max() + 1;
  530. newAuthor = new XElement(P.cmAuthor, new XAttribute(NoNamespace.id, newID.ToString()),
  531. new XAttribute(NoNamespace.name, oldAuthor.Attribute(NoNamespace.name).Value),
  532. new XAttribute(NoNamespace.initials, oldAuthor.Attribute(NoNamespace.initials).Value),
  533. new XAttribute(NoNamespace.lastIdx, "1"), new XAttribute(NoNamespace.clrIdx, newID.ToString()));
  534. authors.Root.Add(newAuthor);
  535. }
  536. return newAuthor;
  537. }
  538. private static void CopyTableStyles(PresentationDocument oldDocument, PresentationDocument newDocument, OpenXmlPart oldContentPart, OpenXmlPart newContentPart)
  539. {
  540. foreach (XElement table in newContentPart.GetXDocument().Descendants(A.tableStyleId))
  541. {
  542. string styleId = table.Value;
  543. if (string.IsNullOrEmpty(styleId))
  544. continue;
  545. // Find old style
  546. if (oldDocument.PresentationPart.TableStylesPart == null)
  547. continue;
  548. XDocument oldTableStyles = oldDocument.PresentationPart.TableStylesPart.GetXDocument();
  549. XElement oldStyle = oldTableStyles.Root.Elements(A.tblStyle).Where(f => f.Attribute(NoNamespace.styleId).Value == styleId).FirstOrDefault();
  550. if (oldStyle == null)
  551. continue;
  552. // Create new TableStylesPart, if needed
  553. XDocument tableStyles = null;
  554. if (newDocument.PresentationPart.TableStylesPart == null)
  555. {
  556. TableStylesPart newStylesPart = newDocument.PresentationPart.AddNewPart<TableStylesPart>();
  557. tableStyles = new XDocument(new XElement(A.tblStyleLst,
  558. new XAttribute(XNamespace.Xmlns + "a", A.a),
  559. new XAttribute(NoNamespace.def, styleId)));
  560. newStylesPart.PutXDocument(tableStyles);
  561. }
  562. else
  563. tableStyles = newDocument.PresentationPart.TableStylesPart.GetXDocument();
  564. // Search new TableStylesPart to see if it contains the ID
  565. if (tableStyles.Root.Elements(A.tblStyle).Where(f => f.Attribute(NoNamespace.styleId).Value == styleId).FirstOrDefault() != null)
  566. continue;
  567. // Copy style to new part
  568. tableStyles.Root.Add(oldStyle);
  569. }
  570. }
  571. private static void CopyRelatedPartsForContentParts(PresentationDocument newDocument, OpenXmlPart oldContentPart, OpenXmlPart newContentPart,
  572. IEnumerable<XElement> newContent, List<ImageData> images, List<MediaData> mediaList)
  573. {
  574. var relevantElements = newContent.DescendantsAndSelf()
  575. .Where(d => d.Name == VML.imagedata || d.Name == VML.fill || d.Name == VML.stroke || d.Name == A.blip)
  576. .ToList();
  577. foreach (XElement imageReference in relevantElements)
  578. {
  579. CopyRelatedImage(oldContentPart, newContentPart, imageReference, R.embed, images);
  580. CopyRelatedImage(oldContentPart, newContentPart, imageReference, R.pict, images);
  581. CopyRelatedImage(oldContentPart, newContentPart, imageReference, R.id, images);
  582. CopyRelatedImage(oldContentPart, newContentPart, imageReference, O.relid, images);
  583. }
  584. relevantElements = newContent.DescendantsAndSelf()
  585. .Where(d => d.Name == A.videoFile || d.Name == A.quickTimeFile)
  586. .ToList();
  587. foreach (XElement imageReference in relevantElements)
  588. {
  589. CopyRelatedMedia(oldContentPart, newContentPart, imageReference, R.link, mediaList, "video");
  590. }
  591. relevantElements = newContent.DescendantsAndSelf()
  592. .Where(d => d.Name == P14.media || d.Name == PAV.srcMedia)
  593. .ToList();
  594. foreach (XElement imageReference in relevantElements)
  595. {
  596. CopyRelatedMedia(oldContentPart, newContentPart, imageReference, R.embed, mediaList, "media");
  597. CopyRelatedMediaExternalRelationship(oldContentPart, newContentPart, imageReference, R.link, "media");
  598. }
  599. foreach (XElement extendedReference in newContent.DescendantsAndSelf(A14.imgLayer))
  600. {
  601. CopyExtendedPart(oldContentPart, newContentPart, extendedReference, R.embed);
  602. }
  603. foreach (XElement contentPartReference in newContent.DescendantsAndSelf(P.contentPart))
  604. {
  605. CopyInkPart(oldContentPart, newContentPart, contentPartReference, R.id);
  606. }
  607. foreach (XElement contentPartReference in newContent.DescendantsAndSelf(P.control))
  608. {
  609. CopyActiveXPart(oldContentPart, newContentPart, contentPartReference, R.id);
  610. }
  611. foreach (XElement contentPartReference in newContent.DescendantsAndSelf(Plegacy.textdata))
  612. {
  613. CopyLegacyDiagramText(oldContentPart, newContentPart, contentPartReference, "id");
  614. }
  615. foreach (XElement diagramReference in newContent.DescendantsAndSelf().Where(d => d.Name == DGM.relIds || d.Name == A.relIds))
  616. {
  617. // dm attribute
  618. string relId = diagramReference.Attribute(R.dm).Value;
  619. var tempPartIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  620. if (tempPartIdPair != null)
  621. continue;
  622. ExternalRelationship tempEr = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  623. if (tempEr != null)
  624. continue;
  625. OpenXmlPart oldPart = oldContentPart.GetPartById(relId);
  626. OpenXmlPart newPart = newContentPart.AddNewPart<DiagramDataPart>();
  627. newPart.GetXDocument().Add(oldPart.GetXDocument().Root);
  628. diagramReference.Attribute(R.dm).Value = newContentPart.GetIdOfPart(newPart);
  629. AddRelationships(oldPart, newPart, new[] { newPart.GetXDocument().Root });
  630. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newPart.GetXDocument().Root }, images, mediaList);
  631. // lo attribute
  632. relId = diagramReference.Attribute(R.lo).Value;
  633. var tempPartIdPair2 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  634. if (tempPartIdPair2 != null)
  635. continue;
  636. ExternalRelationship tempEr2 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  637. if (tempEr2 != null)
  638. continue;
  639. oldPart = oldContentPart.GetPartById(relId);
  640. newPart = newContentPart.AddNewPart<DiagramLayoutDefinitionPart>();
  641. newPart.GetXDocument().Add(oldPart.GetXDocument().Root);
  642. diagramReference.Attribute(R.lo).Value = newContentPart.GetIdOfPart(newPart);
  643. AddRelationships(oldPart, newPart, new[] { newPart.GetXDocument().Root });
  644. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newPart.GetXDocument().Root }, images, mediaList);
  645. // qs attribute
  646. relId = diagramReference.Attribute(R.qs).Value;
  647. var tempPartIdPair3 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  648. if (tempPartIdPair3 != null)
  649. continue;
  650. ExternalRelationship tempEr3 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  651. if (tempEr3 != null)
  652. continue;
  653. oldPart = oldContentPart.GetPartById(relId);
  654. newPart = newContentPart.AddNewPart<DiagramStylePart>();
  655. newPart.GetXDocument().Add(oldPart.GetXDocument().Root);
  656. diagramReference.Attribute(R.qs).Value = newContentPart.GetIdOfPart(newPart);
  657. AddRelationships(oldPart, newPart, new[] { newPart.GetXDocument().Root });
  658. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newPart.GetXDocument().Root }, images, mediaList);
  659. // cs attribute
  660. relId = diagramReference.Attribute(R.cs).Value;
  661. var tempPartIdPair4 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  662. if (tempPartIdPair4 != null)
  663. continue;
  664. ExternalRelationship tempEr4 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  665. if (tempEr4 != null)
  666. continue;
  667. oldPart = oldContentPart.GetPartById(relId);
  668. newPart = newContentPart.AddNewPart<DiagramColorsPart>();
  669. newPart.GetXDocument().Add(oldPart.GetXDocument().Root);
  670. diagramReference.Attribute(R.cs).Value = newContentPart.GetIdOfPart(newPart);
  671. AddRelationships(oldPart, newPart, new[] { newPart.GetXDocument().Root });
  672. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newPart.GetXDocument().Root }, images, mediaList);
  673. }
  674. foreach (XElement oleReference in newContent.DescendantsAndSelf().Where(d => d.Name == P.oleObj || d.Name == P.externalData))
  675. {
  676. string relId = oleReference.Attribute(R.id).Value;
  677. // First look to see if this relId has already been added to the new document.
  678. // This is necessary for those parts that get processed with both old and new ids, such as the comments
  679. // part. This is not necessary for parts such as the main document part, but this code won't malfunction
  680. // in that case.
  681. var tempPartIdPair5 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  682. if (tempPartIdPair5 != null)
  683. continue;
  684. ExternalRelationship tempEr5 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  685. if (tempEr5 != null)
  686. continue;
  687. var oldPartIdPair = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  688. if (oldPartIdPair != null)
  689. {
  690. OpenXmlPart oldPart = oldPartIdPair.OpenXmlPart;
  691. OpenXmlPart newPart = null;
  692. if (oldPart is EmbeddedObjectPart)
  693. {
  694. if (newContentPart is DialogsheetPart)
  695. newPart = ((DialogsheetPart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  696. else if (newContentPart is HandoutMasterPart)
  697. newPart = ((HandoutMasterPart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  698. else if (newContentPart is NotesMasterPart)
  699. newPart = ((NotesMasterPart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  700. else if (newContentPart is NotesSlidePart)
  701. newPart = ((NotesSlidePart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  702. else if (newContentPart is SlideLayoutPart)
  703. newPart = ((SlideLayoutPart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  704. else if (newContentPart is SlideMasterPart)
  705. newPart = ((SlideMasterPart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  706. else if (newContentPart is SlidePart)
  707. newPart = ((SlidePart)newContentPart).AddEmbeddedObjectPart(oldPart.ContentType);
  708. }
  709. else if (oldPart is EmbeddedPackagePart)
  710. {
  711. if (newContentPart is ChartPart)
  712. newPart = ((ChartPart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  713. else if (newContentPart is HandoutMasterPart)
  714. newPart = ((HandoutMasterPart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  715. else if (newContentPart is NotesMasterPart)
  716. newPart = ((NotesMasterPart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  717. else if (newContentPart is NotesSlidePart)
  718. newPart = ((NotesSlidePart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  719. else if (newContentPart is SlideLayoutPart)
  720. newPart = ((SlideLayoutPart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  721. else if (newContentPart is SlideMasterPart)
  722. newPart = ((SlideMasterPart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  723. else if (newContentPart is SlidePart)
  724. newPart = ((SlidePart)newContentPart).AddEmbeddedPackagePart(oldPart.ContentType);
  725. }
  726. using (Stream oldObject = oldPart.GetStream(FileMode.Open, FileAccess.Read))
  727. using (Stream newObject = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite))
  728. {
  729. int byteCount;
  730. byte[] buffer = new byte[65536];
  731. while ((byteCount = oldObject.Read(buffer, 0, 65536)) != 0)
  732. newObject.Write(buffer, 0, byteCount);
  733. }
  734. oleReference.Attribute(R.id).Value = newContentPart.GetIdOfPart(newPart);
  735. }
  736. else
  737. {
  738. ExternalRelationship er = oldContentPart.GetExternalRelationship(relId);
  739. ExternalRelationship newEr = newContentPart.AddExternalRelationship(er.RelationshipType, er.Uri);
  740. oleReference.Attribute(R.id).Value = newEr.Id;
  741. }
  742. }
  743. foreach (XElement chartReference in newContent.DescendantsAndSelf(C.chart))
  744. {
  745. string relId = (string)chartReference.Attribute(R.id);
  746. if (string.IsNullOrEmpty(relId))
  747. continue;
  748. var tempPartIdPair6 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  749. if (tempPartIdPair6 != null)
  750. continue;
  751. ExternalRelationship tempEr6 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  752. if (tempEr6 != null)
  753. continue;
  754. var oldPartIdPair2 = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  755. if (oldPartIdPair2 != null)
  756. {
  757. ChartPart oldPart = oldPartIdPair2.OpenXmlPart as ChartPart;
  758. if (oldPart != null)
  759. {
  760. XDocument oldChart = oldPart.GetXDocument();
  761. ChartPart newPart = newContentPart.AddNewPart<ChartPart>();
  762. XDocument newChart = newPart.GetXDocument();
  763. newChart.Add(oldChart.Root);
  764. chartReference.Attribute(R.id).Value = newContentPart.GetIdOfPart(newPart);
  765. CopyChartObjects(oldPart, newPart);
  766. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newChart.Root }, images, mediaList);
  767. }
  768. }
  769. }
  770. foreach (XElement userShape in newContent.DescendantsAndSelf(C.userShapes))
  771. {
  772. string relId = (string)userShape.Attribute(R.id);
  773. if (string.IsNullOrEmpty(relId))
  774. continue;
  775. var tempPartIdPair7 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  776. if (tempPartIdPair7 != null)
  777. continue;
  778. ExternalRelationship tempEr7 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  779. if (tempEr7 != null)
  780. continue;
  781. var oldPartIdPair3 = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  782. if (oldPartIdPair3 != null)
  783. {
  784. ChartDrawingPart oldPart = oldPartIdPair3.OpenXmlPart as ChartDrawingPart;
  785. if (oldPart != null)
  786. {
  787. XDocument oldXDoc = oldPart.GetXDocument();
  788. ChartDrawingPart newPart = newContentPart.AddNewPart<ChartDrawingPart>();
  789. XDocument newXDoc = newPart.GetXDocument();
  790. newXDoc.Add(oldXDoc.Root);
  791. userShape.Attribute(R.id).Value = newContentPart.GetIdOfPart(newPart);
  792. AddRelationships(oldPart, newPart, newContent);
  793. CopyRelatedPartsForContentParts(newDocument, oldPart, newPart, new[] { newXDoc.Root }, images, mediaList);
  794. }
  795. }
  796. }
  797. foreach (XElement tags in newContent.DescendantsAndSelf(P.tags))
  798. {
  799. string relId = (string)tags.Attribute(R.id);
  800. if (string.IsNullOrEmpty(relId))
  801. continue;
  802. var tempPartIdPair8 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  803. if (tempPartIdPair8 != null)
  804. continue;
  805. ExternalRelationship tempEr8 = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  806. if (tempEr8 != null)
  807. continue;
  808. var oldPartIdPair4 = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  809. if (oldPartIdPair4 != null)
  810. {
  811. UserDefinedTagsPart oldPart = oldPartIdPair4.OpenXmlPart as UserDefinedTagsPart;
  812. if (oldPart != null)
  813. {
  814. XDocument oldXDoc = oldPart.GetXDocument();
  815. UserDefinedTagsPart newPart = newContentPart.AddNewPart<UserDefinedTagsPart>();
  816. XDocument newXDoc = newPart.GetXDocument();
  817. newXDoc.Add(oldXDoc.Root);
  818. tags.Attribute(R.id).Value = newContentPart.GetIdOfPart(newPart);
  819. }
  820. }
  821. }
  822. foreach (XElement custData in newContent.DescendantsAndSelf(P.custData))
  823. {
  824. string relId = (string)custData.Attribute(R.id);
  825. if (string.IsNullOrEmpty(relId))
  826. continue;
  827. var tempPartIdPair9 = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  828. if (tempPartIdPair9 != null)
  829. continue;
  830. var oldPartIdPair9 = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  831. if (oldPartIdPair9 != null)
  832. {
  833. CustomXmlPart newPart = newDocument.PresentationPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
  834. newPart.FeedData(oldPartIdPair9.OpenXmlPart.GetStream());
  835. foreach (var itemProps in oldPartIdPair9.OpenXmlPart.Parts.Where(p => p.OpenXmlPart.ContentType == "application/vnd.openxmlformats-officedocument.customXmlProperties+xml"))
  836. {
  837. var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  838. CustomXmlPropertiesPart cxpp = newPart.AddNewPart<CustomXmlPropertiesPart>("application/vnd.openxmlformats-officedocument.customXmlProperties+xml", newId2);
  839. cxpp.FeedData(itemProps.OpenXmlPart.GetStream());
  840. }
  841. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  842. newContentPart.CreateRelationshipToPart(newPart, newId);
  843. custData.Attribute(R.id).Value = newId;
  844. }
  845. }
  846. foreach (XElement soundReference in newContent.DescendantsAndSelf().Where(d => d.Name == A.audioFile))
  847. CopyRelatedSound(newDocument, oldContentPart, newContentPart, soundReference, R.link);
  848. if ((oldContentPart is ChartsheetPart && newContentPart is ChartsheetPart) ||
  849. (oldContentPart is DialogsheetPart && newContentPart is DialogsheetPart) ||
  850. (oldContentPart is HandoutMasterPart && newContentPart is HandoutMasterPart) ||
  851. (oldContentPart is InternationalMacroSheetPart && newContentPart is InternationalMacroSheetPart) ||
  852. (oldContentPart is MacroSheetPart && newContentPart is MacroSheetPart) ||
  853. (oldContentPart is NotesMasterPart && newContentPart is NotesMasterPart) ||
  854. (oldContentPart is NotesSlidePart && newContentPart is NotesSlidePart) ||
  855. (oldContentPart is SlideLayoutPart && newContentPart is SlideLayoutPart) ||
  856. (oldContentPart is SlideMasterPart && newContentPart is SlideMasterPart) ||
  857. (oldContentPart is SlidePart && newContentPart is SlidePart) ||
  858. (oldContentPart is WorksheetPart && newContentPart is WorksheetPart))
  859. {
  860. foreach (XElement soundReference in newContent.DescendantsAndSelf().Where(d => d.Name == P.snd || d.Name == P.sndTgt || d.Name == A.wavAudioFile || d.Name == A.snd || d.Name == PAV.srcMedia))
  861. CopyRelatedSound(newDocument, oldContentPart, newContentPart, soundReference, R.embed);
  862. IEnumerable<VmlDrawingPart> vmlDrawingParts = null;
  863. if (oldContentPart is ChartsheetPart)
  864. vmlDrawingParts = ((ChartsheetPart)oldContentPart).VmlDrawingParts;
  865. if (oldContentPart is DialogsheetPart)
  866. vmlDrawingParts = ((DialogsheetPart)oldContentPart).VmlDrawingParts;
  867. if (oldContentPart is HandoutMasterPart)
  868. vmlDrawingParts = ((HandoutMasterPart)oldContentPart).VmlDrawingParts;
  869. if (oldContentPart is InternationalMacroSheetPart)
  870. vmlDrawingParts = ((InternationalMacroSheetPart)oldContentPart).VmlDrawingParts;
  871. if (oldContentPart is MacroSheetPart)
  872. vmlDrawingParts = ((MacroSheetPart)oldContentPart).VmlDrawingParts;
  873. if (oldContentPart is NotesMasterPart)
  874. vmlDrawingParts = ((NotesMasterPart)oldContentPart).VmlDrawingParts;
  875. if (oldContentPart is NotesSlidePart)
  876. vmlDrawingParts = ((NotesSlidePart)oldContentPart).VmlDrawingParts;
  877. if (oldContentPart is SlideLayoutPart)
  878. vmlDrawingParts = ((SlideLayoutPart)oldContentPart).VmlDrawingParts;
  879. if (oldContentPart is SlideMasterPart)
  880. vmlDrawingParts = ((SlideMasterPart)oldContentPart).VmlDrawingParts;
  881. if (oldContentPart is SlidePart)
  882. vmlDrawingParts = ((SlidePart)oldContentPart).VmlDrawingParts;
  883. if (oldContentPart is WorksheetPart)
  884. vmlDrawingParts = ((WorksheetPart)oldContentPart).VmlDrawingParts;
  885. if (vmlDrawingParts != null)
  886. {
  887. // Transitional: Copy VML Drawing parts, implicit relationship
  888. foreach (VmlDrawingPart vmlPart in vmlDrawingParts)
  889. {
  890. VmlDrawingPart newVmlPart = null;
  891. if (newContentPart is ChartsheetPart)
  892. newVmlPart = ((ChartsheetPart)newContentPart).AddNewPart<VmlDrawingPart>();
  893. if (newContentPart is DialogsheetPart)
  894. newVmlPart = ((DialogsheetPart)newContentPart).AddNewPart<VmlDrawingPart>();
  895. if (newContentPart is HandoutMasterPart)
  896. newVmlPart = ((HandoutMasterPart)newContentPart).AddNewPart<VmlDrawingPart>();
  897. if (newContentPart is InternationalMacroSheetPart)
  898. newVmlPart = ((InternationalMacroSheetPart)newContentPart).AddNewPart<VmlDrawingPart>();
  899. if (newContentPart is MacroSheetPart)
  900. newVmlPart = ((MacroSheetPart)newContentPart).AddNewPart<VmlDrawingPart>();
  901. if (newContentPart is NotesMasterPart)
  902. newVmlPart = ((NotesMasterPart)newContentPart).AddNewPart<VmlDrawingPart>();
  903. if (newContentPart is NotesSlidePart)
  904. newVmlPart = ((NotesSlidePart)newContentPart).AddNewPart<VmlDrawingPart>();
  905. if (newContentPart is SlideLayoutPart)
  906. newVmlPart = ((SlideLayoutPart)newContentPart).AddNewPart<VmlDrawingPart>();
  907. if (newContentPart is SlideMasterPart)
  908. newVmlPart = ((SlideMasterPart)newContentPart).AddNewPart<VmlDrawingPart>();
  909. if (newContentPart is SlidePart)
  910. newVmlPart = ((SlidePart)newContentPart).AddNewPart<VmlDrawingPart>();
  911. if (newContentPart is WorksheetPart)
  912. newVmlPart = ((WorksheetPart)newContentPart).AddNewPart<VmlDrawingPart>();
  913. XDocument xd = vmlPart.GetXDocument();
  914. foreach (var item in xd.Descendants(O.ink))
  915. {
  916. if (item.Attribute("i") != null)
  917. {
  918. var i = item.Attribute("i").Value;
  919. i = i.Replace(" ", "\r\n");
  920. item.Attribute("i").Value = i;
  921. }
  922. }
  923. newVmlPart.PutXDocument(xd);
  924. AddRelationships(vmlPart, newVmlPart, new[] { newVmlPart.GetXDocument().Root });
  925. CopyRelatedPartsForContentParts(newDocument, vmlPart, newVmlPart, new[] { newVmlPart.GetXDocument().Root }, images, mediaList);
  926. }
  927. }
  928. }
  929. }
  930. private static void CopyChartObjects(ChartPart oldChart, ChartPart newChart)
  931. {
  932. foreach (XElement dataReference in newChart.GetXDocument().Descendants(C.externalData))
  933. {
  934. string relId = dataReference.Attribute(R.id).Value;
  935. var oldPartIdPair = oldChart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  936. if (oldPartIdPair != null)
  937. {
  938. EmbeddedPackagePart oldPart = oldPartIdPair.OpenXmlPart as EmbeddedPackagePart;
  939. if (oldPart != null)
  940. {
  941. EmbeddedPackagePart newPart = newChart.AddEmbeddedPackagePart(oldPart.ContentType);
  942. using (Stream oldObject = oldPart.GetStream(FileMode.Open, FileAccess.Read))
  943. using (Stream newObject = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite))
  944. {
  945. int byteCount;
  946. byte[] buffer = new byte[65536];
  947. while ((byteCount = oldObject.Read(buffer, 0, 65536)) != 0)
  948. newObject.Write(buffer, 0, byteCount);
  949. }
  950. dataReference.Attribute(R.id).Value = newChart.GetIdOfPart(newPart);
  951. continue;
  952. }
  953. EmbeddedObjectPart oldEmbeddedObjectPart = oldPartIdPair.OpenXmlPart as EmbeddedObjectPart;
  954. if (oldEmbeddedObjectPart != null)
  955. {
  956. EmbeddedPackagePart newPart = newChart.AddEmbeddedPackagePart(oldEmbeddedObjectPart.ContentType);
  957. using (Stream oldObject = oldEmbeddedObjectPart.GetStream(FileMode.Open, FileAccess.Read))
  958. using (Stream newObject = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite))
  959. {
  960. int byteCount;
  961. byte[] buffer = new byte[65536];
  962. while ((byteCount = oldObject.Read(buffer, 0, 65536)) != 0)
  963. newObject.Write(buffer, 0, byteCount);
  964. }
  965. var rId = newChart.GetIdOfPart(newPart);
  966. dataReference.Attribute(R.id).Value = rId;
  967. // following is a hack to fix the package because the Open XML SDK does not let us create
  968. // a relationship from a chart with the oleObject relationship type.
  969. var pkg = newChart.OpenXmlPackage.Package;
  970. var fromPart = pkg.GetParts().FirstOrDefault(p => p.Uri == newChart.Uri);
  971. var rel = fromPart.GetRelationships().FirstOrDefault(p => p.Id == rId);
  972. var targetUri = rel.TargetUri;
  973. fromPart.DeleteRelationship(rId);
  974. fromPart.CreateRelationship(targetUri, System.IO.Packaging.TargetMode.Internal,
  975. "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject", rId);
  976. continue;
  977. }
  978. }
  979. else
  980. {
  981. ExternalRelationship oldRelationship = oldChart.GetExternalRelationship(relId);
  982. Guid g = Guid.NewGuid();
  983. string newRid = "R" + g.ToString().Replace("-", "");
  984. var oldRel = oldChart.ExternalRelationships.FirstOrDefault(h => h.Id == relId);
  985. if (oldRel == null)
  986. throw new PresentationBuilderInternalException("Internal Error 0007");
  987. newChart.AddExternalRelationship(oldRel.RelationshipType, oldRel.Uri, newRid);
  988. dataReference.Attribute(R.id).Value = newRid;
  989. }
  990. }
  991. }
  992. private static Dictionary<XName, XName[]> RelationshipMarkup = null;
  993. private static void UpdateContent(IEnumerable<XElement> newContent, XName elementToModify, string oldRid, string newRid)
  994. {
  995. foreach (var attributeName in RelationshipMarkup[elementToModify])
  996. {
  997. var elementsToUpdate = newContent
  998. .Descendants(elementToModify)
  999. .Where(e => (string)e.Attribute(attributeName) == oldRid);
  1000. foreach (var element in elementsToUpdate)
  1001. element.Attribute(attributeName).Value = newRid;
  1002. }
  1003. }
  1004. private static void RemoveContent(IEnumerable<XElement> newContent, XName elementToModify, string oldRid)
  1005. {
  1006. foreach (var attributeName in RelationshipMarkup[elementToModify])
  1007. {
  1008. newContent
  1009. .Descendants(elementToModify)
  1010. .Where(e => (string)e.Attribute(attributeName) == oldRid).Remove();
  1011. }
  1012. }
  1013. private static void AddRelationships(OpenXmlPart oldPart, OpenXmlPart newPart, IEnumerable<XElement> newContent)
  1014. {
  1015. var relevantElements = newContent.DescendantsAndSelf()
  1016. .Where(d => RelationshipMarkup.ContainsKey(d.Name) &&
  1017. d.Attributes().Any(a => RelationshipMarkup[d.Name].Contains(a.Name)))
  1018. .ToList();
  1019. foreach (var e in relevantElements)
  1020. {
  1021. if (e.Name == A.hlinkClick || e.Name == A.hlinkHover || e.Name == A.hlinkMouseOver)
  1022. {
  1023. string relId = (string)e.Attribute(R.id);
  1024. if (string.IsNullOrEmpty(relId))
  1025. {
  1026. // handle the following:
  1027. //<a:hlinkClick r:id=""
  1028. // action="ppaction://customshow?id=0" />
  1029. var action = (string)e.Attribute("action");
  1030. if (action != null)
  1031. {
  1032. if (action.Contains("customshow"))
  1033. e.Attribute("action").Remove();
  1034. }
  1035. continue;
  1036. }
  1037. var tempHyperlink = newPart.HyperlinkRelationships.FirstOrDefault(h => h.Id == relId);
  1038. if (tempHyperlink != null)
  1039. continue;
  1040. Guid g = Guid.NewGuid();
  1041. string newRid = "R" + g.ToString().Replace("-", "");
  1042. var oldHyperlink = oldPart.HyperlinkRelationships.FirstOrDefault(h => h.Id == relId);
  1043. if (oldHyperlink == null) {
  1044. //TODO Issue with reference to another part: var temp = oldPart.GetPartById(relId);
  1045. RemoveContent(newContent, e.Name, relId);
  1046. continue;
  1047. }
  1048. newPart.AddHyperlinkRelationship(oldHyperlink.Uri, oldHyperlink.IsExternal, newRid);
  1049. UpdateContent(newContent, e.Name, relId, newRid);
  1050. }
  1051. if (e.Name == VML.imagedata)
  1052. {
  1053. string relId = (string)e.Attribute(R.href);
  1054. if (string.IsNullOrEmpty(relId))
  1055. continue;
  1056. var tempExternalRelationship = newPart.ExternalRelationships.FirstOrDefault(h => h.Id == relId);
  1057. if (tempExternalRelationship != null)
  1058. continue;
  1059. Guid g = Guid.NewGuid();
  1060. string newRid = "R" + g.ToString().Replace("-", "");
  1061. var oldRel = oldPart.ExternalRelationships.FirstOrDefault(h => h.Id == relId);
  1062. if (oldRel == null)
  1063. throw new PresentationBuilderInternalException("Internal Error 0006");
  1064. newPart.AddExternalRelationship(oldRel.RelationshipType, oldRel.Uri, newRid);
  1065. UpdateContent(newContent, e.Name, relId, newRid);
  1066. }
  1067. if (e.Name == A.blip || e.Name == A14.imgLayer || e.Name == A.audioFile || e.Name == A.videoFile || e.Name == A.quickTimeFile)
  1068. {
  1069. string relId = (string)e.Attribute(R.link);
  1070. if (string.IsNullOrEmpty(relId))
  1071. continue;
  1072. var tempExternalRelationship = newPart.ExternalRelationships.FirstOrDefault(h => h.Id == relId);
  1073. if (tempExternalRelationship != null)
  1074. continue;
  1075. Guid g = Guid.NewGuid();
  1076. string newRid = "R" + g.ToString().Replace("-", "");
  1077. var oldRel = oldPart.ExternalRelationships.FirstOrDefault(h => h.Id == relId);
  1078. if (oldRel == null)
  1079. continue;
  1080. newPart.AddExternalRelationship(oldRel.RelationshipType, oldRel.Uri, newRid);
  1081. UpdateContent(newContent, e.Name, relId, newRid);
  1082. }
  1083. }
  1084. }
  1085. private static void CopyRelatedImage(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement imageReference, XName attributeName,
  1086. List<ImageData> images)
  1087. {
  1088. string relId = (string)imageReference.Attribute(attributeName);
  1089. if (string.IsNullOrEmpty(relId))
  1090. return;
  1091. // First look to see if this relId has already been added to the new document.
  1092. // This is necessary for those parts that get processed with both old and new ids, such as the comments
  1093. // part. This is not necessary for parts such as the main document part, but this code won't malfunction
  1094. // in that case.
  1095. var partIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1096. if (partIdPair != null)
  1097. return;
  1098. ExternalRelationship extRel = newContentPart.ExternalRelationships.FirstOrDefault(r => r.Id == relId);
  1099. if (extRel != null)
  1100. return;
  1101. var oldPartIdPair = oldContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1102. if (oldPartIdPair != null)
  1103. {
  1104. ImagePart oldPart = oldPartIdPair.OpenXmlPart as ImagePart;
  1105. ImageData temp = ManageImageCopy(oldPart, newContentPart, images);
  1106. if (temp.ImagePart == null)
  1107. {
  1108. ImagePart newPart = null;
  1109. if (newContentPart is ChartDrawingPart)
  1110. newPart = ((ChartDrawingPart)newContentPart).AddImagePart(oldPart.ContentType);
  1111. else if (newContentPart is ChartPart)
  1112. newPart = ((ChartPart)newContentPart).AddImagePart(oldPart.ContentType);
  1113. else if (newContentPart is ChartsheetPart)
  1114. newPart = ((ChartsheetPart)newContentPart).AddImagePart(oldPart.ContentType);
  1115. else if (newContentPart is DiagramDataPart)
  1116. newPart = ((DiagramDataPart)newContentPart).AddImagePart(oldPart.ContentType);
  1117. else if (newContentPart is DiagramLayoutDefinitionPart)
  1118. newPart = ((DiagramLayoutDefinitionPart)newContentPart).AddImagePart(oldPart.ContentType);
  1119. else if (newContentPart is DiagramPersistLayoutPart)
  1120. newPart = ((DiagramPersistLayoutPart)newContentPart).AddImagePart(oldPart.ContentType);
  1121. else if (newContentPart is DrawingsPart)
  1122. newPart = ((DrawingsPart)newContentPart).AddImagePart(oldPart.ContentType);
  1123. else if (newContentPart is HandoutMasterPart)
  1124. newPart = ((HandoutMasterPart)newContentPart).AddImagePart(oldPart.ContentType);
  1125. else if (newContentPart is NotesMasterPart)
  1126. newPart = ((NotesMasterPart)newContentPart).AddImagePart(oldPart.ContentType);
  1127. else if (newContentPart is NotesSlidePart)
  1128. newPart = ((NotesSlidePart)newContentPart).AddImagePart(oldPart.ContentType);
  1129. else if (newContentPart is RibbonAndBackstageCustomizationsPart)
  1130. newPart = ((RibbonAndBackstageCustomizationsPart)newContentPart).AddImagePart(oldPart.ContentType);
  1131. else if (newContentPart is RibbonExtensibilityPart)
  1132. newPart = ((RibbonExtensibilityPart)newContentPart).AddImagePart(oldPart.ContentType);
  1133. else if (newContentPart is SlideLayoutPart)
  1134. newPart = ((SlideLayoutPart)newContentPart).AddImagePart(oldPart.ContentType);
  1135. else if (newContentPart is SlideMasterPart)
  1136. newPart = ((SlideMasterPart)newContentPart).AddImagePart(oldPart.ContentType);
  1137. else if (newContentPart is SlidePart)
  1138. newPart = ((SlidePart)newContentPart).AddImagePart(oldPart.ContentType);
  1139. else if (newContentPart is ThemeOverridePart)
  1140. newPart = ((ThemeOverridePart)newContentPart).AddImagePart(oldPart.ContentType);
  1141. else if (newContentPart is ThemePart)
  1142. newPart = ((ThemePart)newContentPart).AddImagePart(oldPart.ContentType);
  1143. else if (newContentPart is VmlDrawingPart)
  1144. newPart = ((VmlDrawingPart)newContentPart).AddImagePart(oldPart.ContentType);
  1145. else if (newContentPart is WorksheetPart)
  1146. newPart = ((WorksheetPart)newContentPart).AddImagePart(oldPart.ContentType);
  1147. temp.ImagePart = newPart;
  1148. var id = newContentPart.GetIdOfPart(newPart);
  1149. temp.AddContentPartRelTypeResourceIdTupple(newContentPart, newPart.RelationshipType, id);
  1150. temp.WriteImage(newPart);
  1151. imageReference.Attribute(attributeName).Value = id;
  1152. }
  1153. else
  1154. {
  1155. var refRel = newContentPart.DataPartReferenceRelationships.FirstOrDefault(rr =>
  1156. {
  1157. var rel = temp.ContentPartRelTypeIdList.FirstOrDefault(cpr =>
  1158. {
  1159. var found = cpr.ContentPart == newContentPart && cpr.RelationshipId == rr.Id;
  1160. return found;
  1161. });
  1162. if (rel != null)
  1163. return true;
  1164. return false;
  1165. });
  1166. if (refRel != null)
  1167. {
  1168. imageReference.Attribute(attributeName).Value = temp.ContentPartRelTypeIdList.First(cpr =>
  1169. {
  1170. var found = cpr.ContentPart == newContentPart && cpr.RelationshipId == refRel.Id;
  1171. return found;
  1172. }).RelationshipId;
  1173. return;
  1174. }
  1175. var cpr2 = temp.ContentPartRelTypeIdList.FirstOrDefault(c => c.ContentPart == newContentPart);
  1176. if (cpr2 != null)
  1177. {
  1178. imageReference.Attribute(attributeName).Value = cpr2.RelationshipId;
  1179. }
  1180. else
  1181. {
  1182. ImagePart imagePart = (ImagePart)temp.ImagePart;
  1183. var existingImagePart = newContentPart.AddPart<ImagePart>(imagePart);
  1184. var newId = newContentPart.GetIdOfPart(existingImagePart);
  1185. temp.AddContentPartRelTypeResourceIdTupple(newContentPart, imagePart.RelationshipType, newId);
  1186. imageReference.Attribute(attributeName).Value = newId;
  1187. }
  1188. }
  1189. }
  1190. else
  1191. {
  1192. ExternalRelationship er = oldContentPart.ExternalRelationships.FirstOrDefault(r => r.Id == relId);
  1193. if (er != null)
  1194. {
  1195. ExternalRelationship newEr = newContentPart.AddExternalRelationship(er.RelationshipType, er.Uri);
  1196. imageReference.Attribute(R.id).Value = newEr.Id;
  1197. }
  1198. else
  1199. {
  1200. var fromPart = newContentPart.OpenXmlPackage.Package.GetParts().FirstOrDefault(p => p.Uri == newContentPart.Uri);
  1201. fromPart.CreateRelationship(new Uri("NULL", UriKind.RelativeOrAbsolute), System.IO.Packaging.TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", relId);
  1202. }
  1203. }
  1204. }
  1205. private static void CopyRelatedMedia(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement imageReference, XName attributeName,
  1206. List<MediaData> mediaList, string mediaRelationshipType)
  1207. {
  1208. string relId = (string)imageReference.Attribute(attributeName);
  1209. if (string.IsNullOrEmpty(relId))
  1210. return;
  1211. // First look to see if this relId has already been added to the new document.
  1212. var existingDataPartRefRel2 = newContentPart.DataPartReferenceRelationships.FirstOrDefault(dpr => dpr.Id == relId);
  1213. if (existingDataPartRefRel2 != null)
  1214. return;
  1215. var oldRel = oldContentPart.DataPartReferenceRelationships.FirstOrDefault(dpr => dpr.Id == relId);
  1216. if (oldRel == null)
  1217. return;
  1218. DataPart oldPart = oldRel.DataPart;
  1219. MediaData temp = ManageMediaCopy(oldPart, mediaList);
  1220. if (temp.DataPart == null)
  1221. {
  1222. var ct = oldPart.ContentType;
  1223. var ext = Path.GetExtension(oldPart.Uri.OriginalString);
  1224. MediaDataPart newPart = newContentPart.OpenXmlPackage.CreateMediaDataPart(ct, ext);
  1225. newPart.FeedData(oldPart.GetStream());
  1226. string id = null;
  1227. string relationshipType = null;
  1228. if (mediaRelationshipType == "media")
  1229. {
  1230. MediaReferenceRelationship mrr = null;
  1231. if (newContentPart is SlidePart)
  1232. mrr = ((SlidePart)newContentPart).AddMediaReferenceRelationship(newPart);
  1233. else if (newContentPart is SlideLayoutPart)
  1234. mrr = ((SlideLayoutPart)newContentPart).AddMediaReferenceRelationship(newPart);
  1235. else if (newContentPart is SlideMasterPart)
  1236. mrr = ((SlideMasterPart)newContentPart).AddMediaReferenceRelationship(newPart);
  1237. id = mrr.Id;
  1238. relationshipType = "http://schemas.microsoft.com/office/2007/relationships/media";
  1239. }
  1240. else if (mediaRelationshipType == "video")
  1241. {
  1242. VideoReferenceRelationship vrr = null;
  1243. if (newContentPart is SlidePart)
  1244. vrr = ((SlidePart)newContentPart).AddVideoReferenceRelationship(newPart);
  1245. else if (newContentPart is HandoutMasterPart)
  1246. vrr = ((HandoutMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1247. else if (newContentPart is NotesMasterPart)
  1248. vrr = ((NotesMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1249. else if (newContentPart is NotesSlidePart)
  1250. vrr = ((NotesSlidePart)newContentPart).AddVideoReferenceRelationship(newPart);
  1251. else if (newContentPart is SlideLayoutPart)
  1252. vrr = ((SlideLayoutPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1253. else if (newContentPart is SlideMasterPart)
  1254. vrr = ((SlideMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1255. id = vrr.Id;
  1256. relationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video";
  1257. }
  1258. temp.DataPart = newPart;
  1259. temp.AddContentPartRelTypeResourceIdTupple(newContentPart, relationshipType, id);
  1260. imageReference.Attribute(attributeName).Value = id;
  1261. }
  1262. else
  1263. {
  1264. string desiredRelType = null;
  1265. if (mediaRelationshipType == "media")
  1266. desiredRelType = "http://schemas.microsoft.com/office/2007/relationships/media";
  1267. if (mediaRelationshipType == "video")
  1268. desiredRelType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video";
  1269. var existingRel = temp.ContentPartRelTypeIdList.FirstOrDefault(cp => cp.ContentPart == newContentPart && cp.RelationshipType == desiredRelType);
  1270. if (existingRel != null)
  1271. {
  1272. imageReference.Attribute(attributeName).Value = existingRel.RelationshipId;
  1273. }
  1274. else
  1275. {
  1276. MediaDataPart newPart = (MediaDataPart)temp.DataPart;
  1277. string id = null;
  1278. string relationshipType = null;
  1279. if (mediaRelationshipType == "media")
  1280. {
  1281. MediaReferenceRelationship mrr = null;
  1282. if (newContentPart is SlidePart)
  1283. mrr = ((SlidePart)newContentPart).AddMediaReferenceRelationship(newPart);
  1284. if (newContentPart is SlideLayoutPart)
  1285. mrr = ((SlideLayoutPart)newContentPart).AddMediaReferenceRelationship(newPart);
  1286. if (newContentPart is SlideMasterPart)
  1287. mrr = ((SlideMasterPart)newContentPart).AddMediaReferenceRelationship(newPart);
  1288. id = mrr.Id;
  1289. relationshipType = mrr.RelationshipType;
  1290. }
  1291. else if (mediaRelationshipType == "video")
  1292. {
  1293. VideoReferenceRelationship vrr = null;
  1294. if (newContentPart is SlidePart)
  1295. vrr = ((SlidePart)newContentPart).AddVideoReferenceRelationship(newPart);
  1296. if (newContentPart is HandoutMasterPart)
  1297. vrr = ((HandoutMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1298. if (newContentPart is NotesMasterPart)
  1299. vrr = ((NotesMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1300. if (newContentPart is NotesSlidePart)
  1301. vrr = ((NotesSlidePart)newContentPart).AddVideoReferenceRelationship(newPart);
  1302. if (newContentPart is SlideLayoutPart)
  1303. vrr = ((SlideLayoutPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1304. if (newContentPart is SlideMasterPart)
  1305. vrr = ((SlideMasterPart)newContentPart).AddVideoReferenceRelationship(newPart);
  1306. id = vrr.Id;
  1307. relationshipType = vrr.RelationshipType;
  1308. }
  1309. temp.AddContentPartRelTypeResourceIdTupple(newContentPart, relationshipType, id);
  1310. imageReference.Attribute(attributeName).Value = id;
  1311. }
  1312. }
  1313. }
  1314. private static void CopyRelatedMediaExternalRelationship(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement imageReference, XName attributeName,
  1315. string mediaRelationshipType)
  1316. {
  1317. string relId = (string)imageReference.Attribute(attributeName);
  1318. if (string.IsNullOrEmpty(relId))
  1319. return;
  1320. var existingExternalReference = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  1321. if (existingExternalReference != null)
  1322. return;
  1323. var oldRel = oldContentPart.ExternalRelationships.FirstOrDefault(dpr => dpr.Id == relId);
  1324. if (oldRel == null)
  1325. return;
  1326. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  1327. newContentPart.AddExternalRelationship(oldRel.RelationshipType, oldRel.Uri, newId);
  1328. imageReference.Attribute(attributeName).Value = newId;
  1329. }
  1330. private static void CopyInkPart(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement contentPartReference, XName attributeName)
  1331. {
  1332. string relId = (string)contentPartReference.Attribute(attributeName);
  1333. if (string.IsNullOrEmpty(relId))
  1334. return;
  1335. var tempPartIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1336. if (tempPartIdPair != null)
  1337. return;
  1338. var tempEr = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  1339. if (tempEr != null)
  1340. return;
  1341. var oldPart = oldContentPart.GetPartById(relId);
  1342. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  1343. CustomXmlPart newPart = newContentPart.AddNewPart<CustomXmlPart>("application/inkml+xml", newId);
  1344. newPart.FeedData(oldPart.GetStream());
  1345. contentPartReference.Attribute(attributeName).Value = newId;
  1346. }
  1347. private static void CopyActiveXPart(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement activeXPartReference, XName attributeName)
  1348. {
  1349. string relId = (string)activeXPartReference.Attribute(attributeName);
  1350. if (string.IsNullOrEmpty(relId))
  1351. return;
  1352. var tempPartIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1353. if (tempPartIdPair != null)
  1354. return;
  1355. var oldPart = oldContentPart.GetPartById(relId);
  1356. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  1357. EmbeddedControlPersistencePart newPart = newContentPart.AddNewPart<EmbeddedControlPersistencePart>("application/vnd.ms-office.activeX+xml", newId);
  1358. newPart.FeedData(oldPart.GetStream());
  1359. activeXPartReference.Attribute(attributeName).Value = newId;
  1360. if (newPart.ContentType == "application/vnd.ms-office.activeX+xml")
  1361. {
  1362. XDocument axc = newPart.GetXDocument();
  1363. if (axc.Root.Attribute(R.id) != null)
  1364. {
  1365. var oldPersistencePart = oldPart.GetPartById((string)axc.Root.Attribute(R.id));
  1366. var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  1367. EmbeddedControlPersistenceBinaryDataPart newPersistencePart = newPart.AddNewPart<EmbeddedControlPersistenceBinaryDataPart>("application/vnd.ms-office.activeX", newId2);
  1368. newPersistencePart.FeedData(oldPersistencePart.GetStream());
  1369. axc.Root.Attribute(R.id).Value = newId2;
  1370. newPart.PutXDocument();
  1371. }
  1372. }
  1373. }
  1374. private static void CopyLegacyDiagramText(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement textdataReference, XName attributeName)
  1375. {
  1376. string relId = (string)textdataReference.Attribute(attributeName);
  1377. if (string.IsNullOrEmpty(relId))
  1378. return;
  1379. var tempPartIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1380. if (tempPartIdPair != null)
  1381. return;
  1382. var oldPart = oldContentPart.GetPartById(relId);
  1383. var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
  1384. LegacyDiagramTextPart newPart = newContentPart.AddNewPart<LegacyDiagramTextPart>(newId);
  1385. newPart.FeedData(oldPart.GetStream());
  1386. textdataReference.Attribute(attributeName).Value = newId;
  1387. }
  1388. private static void CopyExtendedPart(OpenXmlPart oldContentPart, OpenXmlPart newContentPart, XElement extendedReference, XName attributeName)
  1389. {
  1390. string relId = (string)extendedReference.Attribute(attributeName);
  1391. if (string.IsNullOrEmpty(relId))
  1392. return;
  1393. try
  1394. {
  1395. // First look to see if this relId has already been added to the new document.
  1396. // This is necessary for those parts that get processed with both old and new ids, such as the comments
  1397. // part. This is not necessary for parts such as the main document part, but this code won't malfunction
  1398. // in that case.
  1399. var tempPartIdPair = newContentPart.Parts.FirstOrDefault(p => p.RelationshipId == relId);
  1400. if (tempPartIdPair != null)
  1401. return;
  1402. var tempEr = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  1403. if (tempEr != null)
  1404. return;
  1405. ExtendedPart oldPart = (ExtendedPart)oldContentPart.GetPartById(relId);
  1406. FileInfo fileInfo = new FileInfo(oldPart.Uri.OriginalString);
  1407. ExtendedPart newPart = null;
  1408. #if !NET35
  1409. if (newContentPart is ChartColorStylePart)
  1410. newPart = ((ChartColorStylePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1411. else
  1412. #endif
  1413. if (newContentPart is ChartDrawingPart)
  1414. newPart = ((ChartDrawingPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1415. else if (newContentPart is ChartPart)
  1416. newPart = ((ChartPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1417. else if (newContentPart is ChartsheetPart)
  1418. newPart = ((ChartsheetPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1419. #if !NET35
  1420. else if (newContentPart is ChartStylePart)
  1421. newPart = ((ChartStylePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1422. #endif
  1423. else if (newContentPart is CommentAuthorsPart)
  1424. newPart = ((CommentAuthorsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1425. else if (newContentPart is ConnectionsPart)
  1426. newPart = ((ConnectionsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1427. else if (newContentPart is ControlPropertiesPart)
  1428. newPart = ((ControlPropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1429. else if (newContentPart is CoreFilePropertiesPart)
  1430. newPart = ((CoreFilePropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1431. else if (newContentPart is CustomDataPart)
  1432. newPart = ((CustomDataPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1433. else if (newContentPart is CustomDataPropertiesPart)
  1434. newPart = ((CustomDataPropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1435. else if (newContentPart is CustomFilePropertiesPart)
  1436. newPart = ((CustomFilePropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1437. else if (newContentPart is CustomizationPart)
  1438. newPart = ((CustomizationPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1439. else if (newContentPart is CustomPropertyPart)
  1440. newPart = ((CustomPropertyPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1441. else if (newContentPart is CustomUIPart)
  1442. newPart = ((CustomUIPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1443. else if (newContentPart is CustomXmlMappingsPart)
  1444. newPart = ((CustomXmlMappingsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1445. else if (newContentPart is CustomXmlPart)
  1446. newPart = ((CustomXmlPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1447. else if (newContentPart is CustomXmlPropertiesPart)
  1448. newPart = ((CustomXmlPropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1449. else if (newContentPart is DiagramColorsPart)
  1450. newPart = ((DiagramColorsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1451. else if (newContentPart is DiagramDataPart)
  1452. newPart = ((DiagramDataPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1453. else if (newContentPart is DiagramLayoutDefinitionPart)
  1454. newPart = ((DiagramLayoutDefinitionPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1455. else if (newContentPart is DiagramPersistLayoutPart)
  1456. newPart = ((DiagramPersistLayoutPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1457. else if (newContentPart is DiagramStylePart)
  1458. newPart = ((DiagramStylePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1459. else if (newContentPart is DigitalSignatureOriginPart)
  1460. newPart = ((DigitalSignatureOriginPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1461. else if (newContentPart is DrawingsPart)
  1462. newPart = ((DrawingsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1463. else if (newContentPart is EmbeddedControlPersistenceBinaryDataPart)
  1464. newPart = ((EmbeddedControlPersistenceBinaryDataPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1465. else if (newContentPart is EmbeddedControlPersistencePart)
  1466. newPart = ((EmbeddedControlPersistencePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1467. else if (newContentPart is EmbeddedObjectPart)
  1468. newPart = ((EmbeddedObjectPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1469. else if (newContentPart is EmbeddedPackagePart)
  1470. newPart = ((EmbeddedPackagePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1471. else if (newContentPart is ExtendedFilePropertiesPart)
  1472. newPart = ((ExtendedFilePropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1473. else if (newContentPart is ExtendedPart)
  1474. newPart = ((ExtendedPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1475. else if (newContentPart is FontPart)
  1476. newPart = ((FontPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1477. else if (newContentPart is FontTablePart)
  1478. newPart = ((FontTablePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1479. else if (newContentPart is HandoutMasterPart)
  1480. newPart = ((HandoutMasterPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1481. else if (newContentPart is InternationalMacroSheetPart)
  1482. newPart = ((InternationalMacroSheetPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1483. else if (newContentPart is LegacyDiagramTextInfoPart)
  1484. newPart = ((LegacyDiagramTextInfoPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1485. else if (newContentPart is LegacyDiagramTextPart)
  1486. newPart = ((LegacyDiagramTextPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1487. else if (newContentPart is MacroSheetPart)
  1488. newPart = ((MacroSheetPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1489. else if (newContentPart is NotesMasterPart)
  1490. newPart = ((NotesMasterPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1491. else if (newContentPart is NotesSlidePart)
  1492. newPart = ((NotesSlidePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1493. else if (newContentPart is PresentationPart)
  1494. newPart = ((PresentationPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1495. else if (newContentPart is PresentationPropertiesPart)
  1496. newPart = ((PresentationPropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1497. else if (newContentPart is QuickAccessToolbarCustomizationsPart)
  1498. newPart = ((QuickAccessToolbarCustomizationsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1499. else if (newContentPart is RibbonAndBackstageCustomizationsPart)
  1500. newPart = ((RibbonAndBackstageCustomizationsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1501. else if (newContentPart is RibbonExtensibilityPart)
  1502. newPart = ((RibbonExtensibilityPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1503. else if (newContentPart is SingleCellTablePart)
  1504. newPart = ((SingleCellTablePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1505. else if (newContentPart is SlideCommentsPart)
  1506. newPart = ((SlideCommentsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1507. else if (newContentPart is SlideLayoutPart)
  1508. newPart = ((SlideLayoutPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1509. else if (newContentPart is SlideMasterPart)
  1510. newPart = ((SlideMasterPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1511. else if (newContentPart is SlidePart)
  1512. newPart = ((SlidePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1513. else if (newContentPart is SlideSyncDataPart)
  1514. newPart = ((SlideSyncDataPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1515. else if (newContentPart is StyleDefinitionsPart)
  1516. newPart = ((StyleDefinitionsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1517. else if (newContentPart is StylesPart)
  1518. newPart = ((StylesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1519. else if (newContentPart is StylesWithEffectsPart)
  1520. newPart = ((StylesWithEffectsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1521. else if (newContentPart is TableDefinitionPart)
  1522. newPart = ((TableDefinitionPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1523. else if (newContentPart is TableStylesPart)
  1524. newPart = ((TableStylesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1525. else if (newContentPart is ThemeOverridePart)
  1526. newPart = ((ThemeOverridePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1527. else if (newContentPart is ThemePart)
  1528. newPart = ((ThemePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1529. else if (newContentPart is ThumbnailPart)
  1530. newPart = ((ThumbnailPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1531. #if !NET35
  1532. else if (newContentPart is TimeLineCachePart)
  1533. newPart = ((TimeLineCachePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1534. else if (newContentPart is TimeLinePart)
  1535. newPart = ((TimeLinePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1536. #endif
  1537. else if (newContentPart is UserDefinedTagsPart)
  1538. newPart = ((UserDefinedTagsPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1539. else if (newContentPart is VbaDataPart)
  1540. newPart = ((VbaDataPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1541. else if (newContentPart is VbaProjectPart)
  1542. newPart = ((VbaProjectPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1543. else if (newContentPart is ViewPropertiesPart)
  1544. newPart = ((ViewPropertiesPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1545. else if (newContentPart is VmlDrawingPart)
  1546. newPart = ((VmlDrawingPart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1547. else if (newContentPart is XmlSignaturePart)
  1548. newPart = ((XmlSignaturePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
  1549. relId = newContentPart.GetIdOfPart(newPart);
  1550. newPart.FeedData(oldPart.GetStream());
  1551. extendedReference.Attribute(attributeName).Value = relId;
  1552. }
  1553. catch (ArgumentOutOfRangeException)
  1554. {
  1555. try
  1556. {
  1557. ExternalRelationship er = oldContentPart.GetExternalRelationship(relId);
  1558. ExternalRelationship newEr = newContentPart.AddExternalRelationship(er.RelationshipType, er.Uri);
  1559. extendedReference.Attribute(R.id).Value = newEr.Id;
  1560. }
  1561. catch (KeyNotFoundException)
  1562. {
  1563. var fromPart = newContentPart.OpenXmlPackage.Package.GetParts().FirstOrDefault(p => p.Uri == newContentPart.Uri);
  1564. fromPart.CreateRelationship(new Uri("NULL", UriKind.RelativeOrAbsolute), System.IO.Packaging.TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", relId);
  1565. }
  1566. }
  1567. }
  1568. // General function for handling images that tries to use an existing image if they are the same
  1569. private static ImageData ManageImageCopy(ImagePart oldImage, OpenXmlPart newContentPart, List<ImageData> images)
  1570. {
  1571. ImageData oldImageData = new ImageData(oldImage);
  1572. foreach (ImageData item in images)
  1573. {
  1574. if (item.Compare(oldImageData))
  1575. return item;
  1576. }
  1577. images.Add(oldImageData);
  1578. return oldImageData;
  1579. }
  1580. // General function for handling media that tries to use an existing media item if they are the same
  1581. private static MediaData ManageMediaCopy(DataPart oldMedia, List<MediaData> mediaList)
  1582. {
  1583. MediaData oldMediaData = new MediaData(oldMedia);
  1584. foreach (MediaData item in mediaList)
  1585. {
  1586. if (item.Compare(oldMediaData))
  1587. return item;
  1588. }
  1589. mediaList.Add(oldMediaData);
  1590. return oldMediaData;
  1591. }
  1592. private static void CopyRelatedSound(PresentationDocument newDocument, OpenXmlPart oldContentPart, OpenXmlPart newContentPart,
  1593. XElement soundReference, XName attributeName)
  1594. {
  1595. string relId = (string)soundReference.Attribute(attributeName);
  1596. if (string.IsNullOrEmpty(relId))
  1597. return;
  1598. ExternalRelationship alreadyExistingExternalRelationship = newContentPart.ExternalRelationships.FirstOrDefault(er => er.Id == relId);
  1599. if (alreadyExistingExternalRelationship != null)
  1600. return;
  1601. ReferenceRelationship alreadyExistingReferenceRelationship = newContentPart.DataPartReferenceRelationships.FirstOrDefault(er => er.Id == relId);
  1602. if (alreadyExistingReferenceRelationship != null)
  1603. return;
  1604. if (oldContentPart.GetReferenceRelationship(relId) is AudioReferenceRelationship)
  1605. {
  1606. AudioReferenceRelationship temp = (AudioReferenceRelationship)oldContentPart.GetReferenceRelationship(relId);
  1607. MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType);
  1608. newSound.FeedData(temp.DataPart.GetStream());
  1609. AudioReferenceRelationship newRel = null;
  1610. if (newContentPart is SlidePart)
  1611. newRel = ((SlidePart)newContentPart).AddAudioReferenceRelationship(newSound);
  1612. else if (newContentPart is SlideLayoutPart)
  1613. newRel = ((SlideLayoutPart)newContentPart).AddAudioReferenceRelationship(newSound);
  1614. else if (newContentPart is SlideMasterPart)
  1615. newRel = ((SlideMasterPart)newContentPart).AddAudioReferenceRelationship(newSound);
  1616. else if (newContentPart is HandoutMasterPart)
  1617. newRel = ((HandoutMasterPart)newContentPart).AddAudioReferenceRelationship(newSound);
  1618. else if (newContentPart is NotesMasterPart)
  1619. newRel = ((NotesMasterPart)newContentPart).AddAudioReferenceRelationship(newSound);
  1620. else if (newContentPart is NotesSlidePart)
  1621. newRel = ((NotesSlidePart)newContentPart).AddAudioReferenceRelationship(newSound);
  1622. soundReference.Attribute(attributeName).Value = newRel.Id;
  1623. }
  1624. if (oldContentPart.GetReferenceRelationship(relId) is MediaReferenceRelationship)
  1625. {
  1626. MediaReferenceRelationship temp = (MediaReferenceRelationship)oldContentPart.GetReferenceRelationship(relId);
  1627. MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType);
  1628. newSound.FeedData(temp.DataPart.GetStream());
  1629. MediaReferenceRelationship newRel = null;
  1630. if (newContentPart is SlidePart)
  1631. newRel = ((SlidePart)newContentPart).AddMediaReferenceRelationship(newSound);
  1632. else if (newContentPart is SlideLayoutPart)
  1633. newRel = ((SlideLayoutPart)newContentPart).AddMediaReferenceRelationship(newSound);
  1634. else if (newContentPart is SlideMasterPart)
  1635. newRel = ((SlideMasterPart)newContentPart).AddMediaReferenceRelationship(newSound);
  1636. soundReference.Attribute(attributeName).Value = newRel.Id;
  1637. }
  1638. }
  1639. }
  1640. public class PresentationBuilderException : Exception
  1641. {
  1642. public PresentationBuilderException(string message) : base(message) { }
  1643. }
  1644. public class PresentationBuilderInternalException : Exception
  1645. {
  1646. public PresentationBuilderInternalException(string message) : base(message) { }
  1647. }
  1648. }