WmlDocument.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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.IO.Packaging;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Xml;
  10. using System.Xml.Linq;
  11. using DocumentFormat.OpenXml.Packaging;
  12. namespace OpenXmlPowerTools
  13. {
  14. public class PtMainDocumentPart : XElement
  15. {
  16. private WmlDocument ParentWmlDocument;
  17. public PtWordprocessingCommentsPart WordprocessingCommentsPart
  18. {
  19. get
  20. {
  21. using (MemoryStream ms = new MemoryStream(ParentWmlDocument.DocumentByteArray))
  22. using (WordprocessingDocument wDoc = WordprocessingDocument.Open(ms, false))
  23. {
  24. WordprocessingCommentsPart commentsPart = wDoc.MainDocumentPart.WordprocessingCommentsPart;
  25. if (commentsPart == null)
  26. return null;
  27. XElement partElement = commentsPart.GetXDocument().Root;
  28. var childNodes = partElement.Nodes().ToList();
  29. foreach (var item in childNodes)
  30. item.Remove();
  31. return new PtWordprocessingCommentsPart(this.ParentWmlDocument, commentsPart.Uri, partElement.Name, partElement.Attributes(), childNodes);
  32. }
  33. }
  34. }
  35. public PtMainDocumentPart(WmlDocument wmlDocument, Uri uri, XName name, params object[] values)
  36. : base(name, values)
  37. {
  38. ParentWmlDocument = wmlDocument;
  39. this.Add(
  40. new XAttribute(PtOpenXml.Uri, uri),
  41. new XAttribute(XNamespace.Xmlns + "pt", PtOpenXml.pt)
  42. );
  43. }
  44. }
  45. public class PtWordprocessingCommentsPart : XElement
  46. {
  47. private WmlDocument ParentWmlDocument;
  48. public PtWordprocessingCommentsPart(WmlDocument wmlDocument, Uri uri, XName name, params object[] values)
  49. : base(name, values)
  50. {
  51. ParentWmlDocument = wmlDocument;
  52. this.Add(
  53. new XAttribute(PtOpenXml.Uri, uri),
  54. new XAttribute(XNamespace.Xmlns + "pt", PtOpenXml.pt)
  55. );
  56. }
  57. }
  58. public partial class WmlDocument
  59. {
  60. public PtMainDocumentPart MainDocumentPart
  61. {
  62. get
  63. {
  64. using (MemoryStream ms = new MemoryStream(this.DocumentByteArray))
  65. using (WordprocessingDocument wDoc = WordprocessingDocument.Open(ms, false))
  66. {
  67. XElement partElement = wDoc.MainDocumentPart.GetXDocument().Root;
  68. var childNodes = partElement.Nodes().ToList();
  69. foreach (var item in childNodes)
  70. item.Remove();
  71. return new PtMainDocumentPart(this, wDoc.MainDocumentPart.Uri, partElement.Name, partElement.Attributes(), childNodes);
  72. }
  73. }
  74. }
  75. public WmlDocument(WmlDocument other, params XElement[] replacementParts)
  76. : base(other)
  77. {
  78. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(this))
  79. {
  80. using (Package package = streamDoc.GetPackage())
  81. {
  82. foreach (var replacementPart in replacementParts)
  83. {
  84. XAttribute uriAttribute = replacementPart.Attribute(PtOpenXml.Uri);
  85. if (uriAttribute == null)
  86. throw new OpenXmlPowerToolsException("Replacement part does not contain a Uri as an attribute");
  87. String uri = uriAttribute.Value;
  88. var part = package.GetParts().FirstOrDefault(p => p.Uri.ToString() == uri);
  89. using (Stream partStream = part.GetStream(FileMode.Create, FileAccess.Write))
  90. using (XmlWriter partXmlWriter = XmlWriter.Create(partStream))
  91. replacementPart.Save(partXmlWriter);
  92. }
  93. }
  94. this.DocumentByteArray = streamDoc.GetModifiedDocument().DocumentByteArray;
  95. }
  96. }
  97. }
  98. }