public static WmlDocument AddToc(WmlDocument document, string xPath, string switches, string title, int? rightTabPos) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { AddToc(doc, xPath, switches, title, rightTabPos); } return streamDoc.GetModifiedWmlDocument(); } }
public static object GetAllComments(WmlDocument doc, CommentFormat format) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { IEnumerable<XElement> comments = null; WordprocessingCommentsPart commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; if (commentsPart != null) { XDocument commentsPartDocument = commentsPart.GetXDocument(); comments = commentsPartDocument.Element(W.comments).Elements(W.comment); } if (comments != null) { XDocument commentsDocument = new XDocument( new XElement(W.comments, new XAttribute(XNamespace.Xmlns + "w", W.w), comments ) ); switch (format) { case CommentFormat.PlainText: return commentsDocument.ToString(); case CommentFormat.Xml: return commentsDocument; case CommentFormat.Docx: return CreateCommentsDocument(comments); } } return null; } }
/// <summary> /// Inserts Xml markup representing format attributes inside a specific paragraph or paragraph run /// </summary> /// <param name="document">Document to insert formatting Xml tags</param> /// <param name="xpathInsertionPoint">Paragraph or paragraph run to set format</param> /// <param name="content">Formatting tags</param> public static OpenXmlPowerToolsDocument Insert(WmlDocument doc, string xpathInsertionPoint, string content) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument xDocument = document.MainDocumentPart.GetXDocument(); XmlDocument xmlMainDocument = new XmlDocument(); xmlMainDocument.Load(xDocument.CreateReader()); XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable()); namespaceManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); XmlNodeList insertionPoints = xmlMainDocument.SelectNodes(xpathInsertionPoint, namespaceManager); if (insertionPoints.Count == 0) throw new ArgumentException("The xpath query did not return a valid location."); foreach (XmlNode insertionPoint in insertionPoints) { XmlNode propertiesElement = insertionPoint.SelectSingleNode(@"w:pPr|w:rPr", namespaceManager); if (insertionPoint.Name == "w:p") { // Checks if the rPr or pPr element exists if (propertiesElement == null) { propertiesElement = xmlMainDocument.CreateElement("w", "pPr", namespaceManager.LookupNamespace("w")); insertionPoint.PrependChild(propertiesElement); } } else if (insertionPoint.Name == "w:r") { // Checks if the rPr or pPr element exists if (propertiesElement == null) { propertiesElement = xmlMainDocument.CreateElement("w", "rPr", namespaceManager.LookupNamespace("w")); insertionPoint.PrependChild(propertiesElement); } } if (propertiesElement != null) { propertiesElement.InnerXml += content; } else { throw new ArgumentException("Specified xpath query result is not a valid location to place a formatting markup"); } } XDocument xNewDocument = new XDocument(); using (XmlWriter xWriter = xNewDocument.CreateWriter()) xmlMainDocument.WriteTo(xWriter); document.MainDocumentPart.PutXDocument(xNewDocument); } return streamDoc.GetModifiedDocument(); } }
public static XElement ConvertToHtml(WmlDocument doc, HtmlConverterSettings htmlConverterSettings) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { return ConvertToHtml(document, htmlConverterSettings); } } }
public static string GetBackgroundColor(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); XElement backgroundElement = mainDocument.Descendants(W.background).FirstOrDefault(); return (backgroundElement == null) ? string.Empty : backgroundElement.Attribute(W.color).Value; } }
public static XElement ConvertToHtml(WmlDocument doc, HtmlConverterSettings htmlConverterSettings, Func<ImageInfo, XElement> imageHandler) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { return ConvertToHtml(document, htmlConverterSettings, imageHandler); } } }
public static WmlDocument SearchAndReplace(WmlDocument doc, string search, string replace, bool matchCase) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { SearchAndReplace(document, search, replace, matchCase); } return(streamDoc.GetModifiedWmlDocument()); } }
private static OpenXmlPowerToolsDocument CreateCommentsDocument(IEnumerable <XElement> contents) { using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreateWordprocessingDocument()) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { PowerToolsExtensions.SetContent(document, contents); } return(streamDoc.GetModifiedDocument()); } }
public static WmlDocument AcceptRevisions(WmlDocument document) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { AcceptRevisions(doc); } return(streamDoc.GetModifiedWmlDocument()); } }
public static WmlDocument AcceptRevisions(WmlDocument document) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { AcceptRevisions(doc); } return streamDoc.GetModifiedWmlDocument(); } }
public static WmlDocument SimplifyMarkup(WmlDocument doc, SimplifyMarkupSettings settings) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { SimplifyMarkup(document, settings); } return streamDoc.GetModifiedWmlDocument(); } }
public static string RetrieveListItem(WmlDocument document, XElement paragraph, string bulletReplacementString) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument wdoc = streamDoc.GetWordprocessingDocument()) { return(RetrieveListItem(wdoc, paragraph, bulletReplacementString)); } } }
public static WmlDocument AddTof(WmlDocument document, string xPath, string switches, int?rightTabPos) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { AddTof(doc, xPath, switches, rightTabPos); } return(streamDoc.GetModifiedWmlDocument()); } }
/// <summary> /// Get the specified footer from the document /// </summary> /// <param name="type">The footer part type</param> /// <returns>the XDocument containing the footer</returns> public static XDocument GetFooter(WmlDocument doc, FooterType type, int sectionIndex) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { OpenXmlPart footer = GetFooterPart(document, type, sectionIndex); if (footer != null) return footer.GetXDocument(); return null; } }
public static WmlDocument AssembleFormatting(WmlDocument document, FormattingAssemblerSettings settings) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { AssembleFormatting(doc, settings); } return streamDoc.GetModifiedWmlDocument(); } }
public static WmlDocument SearchAndReplace(WmlDocument doc, string search, string replace, bool matchCase) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { SearchAndReplace(document, search, replace, matchCase); } return streamDoc.GetModifiedWmlDocument(); } }
public static string RetrieveListItem(WmlDocument document, XElement paragraph, string bulletReplacementString) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument wdoc = streamDoc.GetWordprocessingDocument()) { return RetrieveListItem(wdoc, paragraph, bulletReplacementString); } } }
public static WmlDocument SimplifyMarkup(WmlDocument doc, SimplifyMarkupSettings settings) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { SimplifyMarkup(document, settings); } return(streamDoc.GetModifiedWmlDocument()); } }
/// <summary> /// Sets the document background image /// </summary> /// <param name="imagePath">Path of the background image</param> public static OpenXmlPowerToolsDocument SetImage(WmlDocument doc, string imagePath) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); // Adds the image to the package ImagePart imagePart = document.MainDocumentPart.AddImagePart(ImagePartType.Bmp); Stream imageStream = new StreamReader(imagePath).BaseStream; byte[] imageBytes = new byte[imageStream.Length]; imageStream.Read(imageBytes, 0, imageBytes.Length); imagePart.GetStream().Write(imageBytes, 0, imageBytes.Length); // Creates a "background" element relating the image and the document // If the background element already exists, deletes it XElement backgroundElement = BackgroundElement(document); if (backgroundElement != null) { backgroundElement.Remove(); } // Background element construction mainDocument.Root.Add( new XElement(ns + "background", new XAttribute(ns + "color", defaultBackgroundColor), new XElement(vmlns + "background", new XAttribute(vmlns + "id", defaultVmlBackgroundImageId), new XAttribute(officens + "bwmode", defaultBWMode), new XAttribute(officens + "targetscreensize", defaultTargetScreenSize), new XElement(vmlns + "fill", new XAttribute(relationshipsns + "id", document.MainDocumentPart.GetIdOfPart(imagePart)), new XAttribute("recolor", defaultImageRecolor), new XAttribute("type", defaultImageType) ) ) ) ); // Enables background displaying by adding "displayBackgroundShape" tag if (SettingAccessor.DisplayBackgroundShapeElements(document) == null) { SettingAccessor.AddBackgroundShapeElement(document); } document.MainDocumentPart.PutXDocument(); } return(streamDoc.GetModifiedDocument()); } }
/// <summary> /// Get the specified header from the document /// </summary> /// <param name="type">The header part type</param> /// <returns>A XDocument containing the header</returns> public static XDocument GetHeader(WmlDocument doc, HeaderType type, int sectionIndex) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { OpenXmlPart header = GetHeaderPart(document, type, sectionIndex); if (header != null) { return(header.GetXDocument()); } return(null); } }
/// <summary> /// Searches for a custom Xml part with a given name /// </summary> /// <param name="xmlPartName">Name of custom Xml part</param> /// <returns>XDocument with customXml part loaded</returns> public static XDocument Find(WmlDocument doc, string xmlPartName) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { WordprocessingDocument document = streamDoc.GetWordprocessingDocument(); string partName = "/" + xmlPartName; var customXmlPart = document.MainDocumentPart.CustomXmlParts.Where( t => t.Uri.OriginalString.EndsWith(partName, System.StringComparison.OrdinalIgnoreCase) ).FirstOrDefault(); if (customXmlPart == null) throw new ArgumentException("Part name '" + xmlPartName + "' not found."); return customXmlPart.GetXDocument(); } }
public static XElement GetDocxMetrics(WmlDocument wmlDoc, MetricsGetterSettings settings) { WmlDocument converted = new WmlDocument(wmlDoc, true); WmlDocument noTrackedRevisions = new WmlDocument(converted); try { using (OpenXmlMemoryStreamDocument noTrackedStreamDoc = new OpenXmlMemoryStreamDocument(noTrackedRevisions)) using (WordprocessingDocument noTrackedDocument = noTrackedStreamDoc.GetWordprocessingDocument()) using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(converted)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { if (RevisionAccepter.HasTrackedRevisions(noTrackedDocument)) RevisionAccepter.AcceptRevisions(noTrackedDocument); return GetWmlMetrics(converted.FileName, false, document, noTrackedDocument, settings); } } catch (OpenXmlPowerToolsException e) { if (e.ToString().Contains("Invalid Hyperlink")) { using (MemoryStream ms = new MemoryStream()) { WmlDocument fixedWmlDoc = new WmlDocument(converted); ms.Write(converted.DocumentByteArray, 0, converted.DocumentByteArray.Length); #if !NET35 UriFixer.FixInvalidUri(ms, brokenUri => FixUri(brokenUri)); #endif converted = new WmlDocument("dummy.docx", ms.ToArray()); } noTrackedRevisions = new WmlDocument(converted); using (OpenXmlMemoryStreamDocument noTrackedStreamDoc = new OpenXmlMemoryStreamDocument(noTrackedRevisions)) using (WordprocessingDocument noTrackedDocument = noTrackedStreamDoc.GetWordprocessingDocument()) using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(converted)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { if (RevisionAccepter.HasTrackedRevisions(noTrackedDocument)) RevisionAccepter.AcceptRevisions(noTrackedDocument); return GetWmlMetrics(converted.FileName, true, document, noTrackedDocument, settings); } } } var metrics = new XElement(H.Metrics, new XAttribute(H.FileName, converted.FileName), new XAttribute(H.FileType, "WordprocessingML"), new XAttribute(H.Error, "Unknown error, metrics not determined")); return metrics; }
/// <summary> /// Sets a new styles part inside the document /// </summary> /// <param name="newStylesDocument">Path of styles definition file</param> public static OpenXmlPowerToolsDocument SetStylePart(WmlDocument doc, XDocument newStylesDocument) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { // Replaces XDocument with the style file to transfer if (document.MainDocumentPart.StyleDefinitionsPart == null) { document.MainDocumentPart.AddNewPart <StyleDefinitionsPart>(); } document.MainDocumentPart.StyleDefinitionsPart.PutXDocument(newStylesDocument); } return(streamDoc.GetModifiedDocument()); } }
public static IEnumerable <ValidationErrorInfo> GetOpenXmlValidationErrors(string fileName, string officeVersion) { FileFormatVersions fileFormatVersion; if (!Enum.TryParse(officeVersion, out fileFormatVersion)) { fileFormatVersion = FileFormatVersions.Office2013; } FileInfo fi = new FileInfo(fileName); if (Util.IsWordprocessingML(fi.Extension)) { WmlDocument wml = new WmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wml)) using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return(errors.ToList()); } } else if (Util.IsSpreadsheetML(fi.Extension)) { SmlDocument Sml = new SmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Sml)) using (SpreadsheetDocument wDoc = streamDoc.GetSpreadsheetDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return(errors.ToList()); } } else if (Util.IsPresentationML(fi.Extension)) { PmlDocument Pml = new PmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Pml)) using (PresentationDocument wDoc = streamDoc.GetPresentationDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return(errors.ToList()); } } return(Enumerable.Empty <ValidationErrorInfo>()); }
/// <summary> /// Searches for a custom Xml part with a given name /// </summary> /// <param name="xmlPartName">Name of custom Xml part</param> /// <returns>XDocument with customXml part loaded</returns> public static XDocument Find(WmlDocument doc, string xmlPartName) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { WordprocessingDocument document = streamDoc.GetWordprocessingDocument(); string partName = "/" + xmlPartName; var customXmlPart = document.MainDocumentPart.CustomXmlParts.Where( t => t.Uri.OriginalString.EndsWith(partName, System.StringComparison.OrdinalIgnoreCase) ).FirstOrDefault(); if (customXmlPart == null) { throw new ArgumentException("Part name '" + xmlPartName + "' not found."); } return(customXmlPart.GetXDocument()); } }
public static OpenXmlPowerToolsDocument Lock(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { //Finds the settings part XDocument settingsDocument; XElement documentProtectionElement = null; if (document.MainDocumentPart.DocumentSettingsPart == null) { //If settings part does not exist creates a new one DocumentSettingsPart settingsPart = document.MainDocumentPart.AddNewPart <DocumentSettingsPart>(); settingsDocument = settingsPart.GetXDocument(); settingsDocument.Add(new XElement(W.settings, new XAttribute(XNamespace.Xmlns + "w", W.w), new XAttribute(XNamespace.Xmlns + "r", R.r))); } else { //If the settings part does exist looks if documentProtection has been included settingsDocument = document.MainDocumentPart.DocumentSettingsPart.GetXDocument(); documentProtectionElement = settingsDocument.Element(W.settings).Element(W.documentProtection); } //Creates the documentProtection element, or edits it if it exists if (documentProtectionElement == null) { settingsDocument .Element(W.settings) .Add( new XElement(W.documentProtection, new XAttribute(W.edit, "readOnly") ) ); } else { documentProtectionElement.SetAttributeValue(W.edit, "readOnly"); } document.MainDocumentPart.DocumentSettingsPart.PutXDocument(); } return(streamDoc.GetModifiedDocument()); } }
/// <summary> /// Replaces a previously existing customXml part by another one /// </summary> /// <param name="customXmlDocument">XDocument of part to replace inside the document package</param> /// <param name="partNameOnly">Name of the part.</param> public static OpenXmlPowerToolsDocument SetDocument(WmlDocument doc, XDocument customXmlDocument, string partNameOnly) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { string partName = "/" + partNameOnly; var customXmlPart = document.MainDocumentPart.CustomXmlParts.Where( t => t.Uri.OriginalString.EndsWith(partName, System.StringComparison.OrdinalIgnoreCase) ).FirstOrDefault(); if (customXmlPart == null) customXmlPart = document.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); customXmlPart.PutXDocument(customXmlDocument); } return streamDoc.GetModifiedDocument(); } }
/// <summary> /// Removes all of the comments existing in the document /// </summary> public static OpenXmlPowerToolsDocument RemoveAll(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { //Removes comment-related tags inside the main document part IEnumerable<XElement> commentReferences = CommentReferences(document).ToList(); commentReferences.Remove(); document.MainDocumentPart.PutXDocument(); WordprocessingCommentsPart commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; if (commentsPart != null) commentsPart.RemovePart(); } return streamDoc.GetModifiedDocument(); } }
/// <summary> /// Replaces a previously existing customXml part by another one /// </summary> /// <param name="customXmlDocument">XDocument of part to replace inside the document package</param> /// <param name="partNameOnly">Name of the part.</param> public static OpenXmlPowerToolsDocument SetDocument(WmlDocument doc, XDocument customXmlDocument, string partNameOnly) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { string partName = "/" + partNameOnly; var customXmlPart = document.MainDocumentPart.CustomXmlParts.Where( t => t.Uri.OriginalString.EndsWith(partName, System.StringComparison.OrdinalIgnoreCase) ).FirstOrDefault(); if (customXmlPart == null) { customXmlPart = document.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); } customXmlPart.PutXDocument(customXmlDocument); } return(streamDoc.GetModifiedDocument()); } }
/// <summary> /// Removes all of the comments existing in the document /// </summary> public static OpenXmlPowerToolsDocument RemoveAll(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { //Removes comment-related tags inside the main document part IEnumerable <XElement> commentReferences = CommentReferences(document).ToList(); commentReferences.Remove(); document.MainDocumentPart.PutXDocument(); WordprocessingCommentsPart commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; if (commentsPart != null) { commentsPart.RemovePart(); } } return(streamDoc.GetModifiedDocument()); } }
public static void SaveImageToFile(WmlDocument doc, string fileName) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); XElement fillElement = mainDocument.Descendants(W.background).Descendants(VML.fill).FirstOrDefault(); if (fillElement != null) { string imageRelationshipId = fillElement.Attribute(R.id).Value; OpenXmlPart imagePart = document.MainDocumentPart.GetPartById(imageRelationshipId); // Gets the image name (path stripped) string imagePath = imagePart.Uri.OriginalString; // Writes the image outside the package OpenXmlPowerToolsDocument.SavePartAs(imagePart, fileName); } } }
public static string GetImageFileName(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); XElement fillElement = mainDocument.Descendants(W.background).Descendants(VML.fill).FirstOrDefault(); if (fillElement != null) { string imageRelationshipId = fillElement.Attribute(R.id).Value; OpenXmlPart imagePart = document.MainDocumentPart.GetPartById(imageRelationshipId); // Gets the image name (path stripped) string imagePath = imagePart.Uri.OriginalString; return imagePath.Substring(imagePath.LastIndexOf('/') + 1); } else return string.Empty; } }
/// <summary> /// Gets the document structure related to watermark description /// </summary> /// <returns>Document structure related to watermark description</returns> public static IEnumerable<XElement> GetWatermark(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { // to get the watermark text, we have to look inside the document // get the default header reference and get the header reference id part XElement defaultHeaderReference = HeaderAccessor.GetHeaderReference(document, HeaderType.Default, 0); if (defaultHeaderReference != null) { string headerReferenceId = defaultHeaderReference.Attribute(relationshipsns + "id").Value; OpenXmlPart headerPart = document.MainDocumentPart.GetPartById(headerReferenceId); if (headerPart != null) { XDocument headerPartXml = headerPart.GetXDocument(); return headerPartXml.Descendants(ns + "pict"); } } return null; } }
/// <summary> /// Gets the document structure related to watermark description /// </summary> /// <returns>Document structure related to watermark description</returns> public static IEnumerable <XElement> GetWatermark(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { // to get the watermark text, we have to look inside the document // get the default header reference and get the header reference id part XElement defaultHeaderReference = HeaderAccessor.GetHeaderReference(document, HeaderType.Default, 0); if (defaultHeaderReference != null) { string headerReferenceId = defaultHeaderReference.Attribute(relationshipsns + "id").Value; OpenXmlPart headerPart = document.MainDocumentPart.GetPartById(headerReferenceId); if (headerPart != null) { XDocument headerPartXml = headerPart.GetXDocument(); return(headerPartXml.Descendants(ns + "pict")); } } return(null); } }
public static string GetImageFileName(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); XElement fillElement = mainDocument.Descendants(W.background).Descendants(VML.fill).FirstOrDefault(); if (fillElement != null) { string imageRelationshipId = fillElement.Attribute(R.id).Value; OpenXmlPart imagePart = document.MainDocumentPart.GetPartById(imageRelationshipId); // Gets the image name (path stripped) string imagePath = imagePart.Uri.OriginalString; return(imagePath.Substring(imagePath.LastIndexOf('/') + 1)); } else { return(string.Empty); } } }
public static object GetAllComments(WmlDocument doc, CommentFormat format) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { IEnumerable <XElement> comments = null; WordprocessingCommentsPart commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; if (commentsPart != null) { XDocument commentsPartDocument = commentsPart.GetXDocument(); comments = commentsPartDocument.Element(W.comments).Elements(W.comment); } if (comments != null) { XDocument commentsDocument = new XDocument( new XElement(W.comments, new XAttribute(XNamespace.Xmlns + "w", W.w), comments ) ); switch (format) { case CommentFormat.PlainText: return(commentsDocument.ToString()); case CommentFormat.Xml: return(commentsDocument); case CommentFormat.Docx: return(CreateCommentsDocument(comments)); } } return(null); } }
public static OpenXmlPowerToolsDocument Insert(WmlDocument doc, string xpathInsertionPoint, Image pictureToInsert, string name) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument xmlMainDocument = document.MainDocumentPart.GetXDocument(); ImagePart picturePart = null; XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable()); namespaceManager.AddNamespace("w", mainns.NamespaceName); IEnumerable<XElement> insertionPoints = xmlMainDocument.XPathSelectElements(xpathInsertionPoint, namespaceManager); //make the insertion for each insertion point specified in the xpath query foreach (XElement insertionPoint in insertionPoints) { if (picturePart == null) { // Create the picture part in the package picturePart = document.MainDocumentPart.AddImagePart(GetImagePartType(pictureToInsert.RawFormat)); } // the pictures in the main document part goes in a very long xml, wich specifies the way the picture // has to be placed using drawingXml. insertionPoint.AddAfterSelf( new XElement(mainns + "p", new XElement(mainns + "r", new XElement(mainns + "drawing", new XElement(wordprocessingDrawingns + "inline", new XElement(wordprocessingDrawingns + "extent", new XAttribute("cx", pictureToInsert.Width * pixelsPerEmu), new XAttribute("cy", pictureToInsert.Height * pixelsPerEmu) ), new XElement(wordprocessingDrawingns + "docPr", new XAttribute("name", name), new XAttribute("id", "1") ), new XElement(drawingmlMainns + "graphic", new XAttribute(XNamespace.Xmlns + "a", drawingmlMainns.NamespaceName), new XElement(drawingmlMainns + "graphicData", new XAttribute("uri", picturens.NamespaceName), new XElement(picturens + "pic", new XAttribute(XNamespace.Xmlns + "pic", picturens.NamespaceName), new XElement(picturens + "nvPicPr", new XElement(picturens + "cNvPr", new XAttribute("id", "0"), new XAttribute("name", name) ), new XElement(picturens + "cNvPicPr") ), new XElement(picturens + "blipFill", new XElement(drawingmlMainns + "blip", new XAttribute(relationshipns + "embed", document.MainDocumentPart.GetIdOfPart(picturePart)) ), new XElement(drawingmlMainns + "stretch", new XElement(drawingmlMainns + "fillRect") ) ), new XElement(picturens + "spPr", new XElement(drawingmlMainns + "xfrm", new XElement(drawingmlMainns + "off", new XAttribute("x", "0"), new XAttribute("y", "0") ), new XElement(drawingmlMainns + "ext", new XAttribute("cx", pictureToInsert.Width * pixelsPerEmu), new XAttribute("cy", pictureToInsert.Height * pixelsPerEmu) ) ), new XElement(drawingmlMainns + "prstGeom", new XAttribute("prst", "rect") ) ) ) ) ) ) ) ) ) ); } if (picturePart != null) { Stream partStream = picturePart.GetStream(FileMode.Create, FileAccess.ReadWrite); pictureToInsert.Save(partStream, pictureToInsert.RawFormat); } else throw new ArgumentException("The xpath query did not return a valid location."); document.MainDocumentPart.PutXDocument(); } return streamDoc.GetModifiedDocument(); } }
public static WmlDocument AppendParagraphToDocument( WmlDocument wmlDoc, string strParagraph, bool isBold, bool isItalic, bool isUnderline, string foreColor, string backColor, string styleName) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wmlDoc)) { using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument()) { StyleDefinitionsPart part = wDoc.MainDocumentPart.StyleDefinitionsPart; Body body = wDoc.MainDocumentPart.Document.Body; SectionProperties sectionProperties = body.Elements <SectionProperties>().FirstOrDefault(); Paragraph paragraph = new Paragraph(); Run run = paragraph.AppendChild(new Run()); RunProperties runProperties = new RunProperties(); if (isBold) { runProperties.AppendChild(new Bold()); } if (isItalic) { runProperties.AppendChild(new Italic()); } if (!string.IsNullOrEmpty(foreColor)) { int colorValue = System.Drawing.Color.FromName(foreColor).ToArgb(); if (colorValue == 0) { throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor)); } string ColorHex = string.Format("{0:x6}", colorValue); runProperties.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = ColorHex.Substring(2) }); } if (isUnderline) { runProperties.AppendChild(new Underline() { Val = UnderlineValues.Single }); } if (!string.IsNullOrEmpty(backColor)) { int colorShade = System.Drawing.Color.FromName(backColor).ToArgb(); if (colorShade == 0) { throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor)); } string ColorShadeHex = string.Format("{0:x6}", colorShade); runProperties.AppendChild(new Shading() { Fill = ColorShadeHex.Substring(2), Val = ShadingPatternValues.Clear }); } if (!string.IsNullOrEmpty(styleName)) { Style style = part.Styles.Elements <Style>().Where(s => s.StyleId == styleName).FirstOrDefault(); //if the specified style is not present in word document add it if (style == null) { using (MemoryStream memoryStream = new MemoryStream()) { #region Default.dotx Template has been used to get all the paragraph styles string base64 = @"UEsDBBQABgAIAAAAIQDTMB8uXgEAACAFAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbLSUy27CMBBF 95X6D5G3VWLooqoqAos+li1S6QcYewJW/ZI9vP6+EwKoqiCRCmwiJTP33jNWxoPR2ppsCTFp70rW L3osAye90m5Wsq/JW/7IsoTCKWG8g5JtILHR8PZmMNkESBmpXSrZHDE8cZ7kHKxIhQ/gqFL5aAXS a5zxIOS3mAG/7/UeuPQOwWGOtQcbDl6gEguD2euaPjckEUxi2XPTWGeVTIRgtBRIdb506k9Kvkso SLntSXMd0h01MH40oa6cDtjpPuhoolaQjUXEd2Gpi698VFx5ubCkLNptjnD6qtISDvraLUQvISU6 c2sKBBtoAiis0G7Pf5Ij4cZAujxF49sdD4gkuAbAzrkTYQXTz6tR/DLvBKkodyKmBi6PcbDuhEDa QGie/bM5tjZtkdQ5jj4k2uj4j7H3K1urcxo4QETd/tcdEsn67Pmgvg0UqCPZfHu/DX8AAAD//wMA UEsDBBQABgAIAAAAIQAekRq37wAAAE4CAAALAAAAX3JlbHMvLnJlbHOsksFqwzAMQO+D/YPRvVHa wRijTi9j0NsY2QcIW0lME9vYatf+/TzY2AJd6WFHy9LTk9B6c5xGdeCUXfAallUNir0J1vlew1v7 vHgAlYW8pTF41nDiDJvm9mb9yiNJKcqDi1kVis8aBpH4iJjNwBPlKkT25acLaSIpz9RjJLOjnnFV 1/eYfjOgmTHV1mpIW3sHqj1FvoYdus4ZfgpmP7GXMy2Qj8Lesl3EVOqTuDKNain1LBpsMC8lnJFi rAoa8LzR6nqjv6fFiYUsCaEJiS/7fGZcElr+54rmGT827yFZtF/hbxucXUHzAQAA//8DAFBLAwQU AAYACADRagZB/Fz9fNYBAAALAwAAEAAAAGRvY1Byb3BzL2FwcC54bWztvQdgHEmWJSYvbcp7f0r1 StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n 99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J5 8dlH6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0OFs9ellXq7xui7xJCcayeXTZfvbRvG1Xj+7ebabz fJE1Y2qxpC/Pq3qRtfRnfXG3Oj8vpvnTarpe5Mv27t7Ozqd3Z9UU0JqffHO9IvgKL1t9XXj5uzZf zvLZ9sri+BHj/CZfrMqszY8e3w3+wh9Vm5VvikV+tCNf2r95sNlF3hzt8jfyOz79blXPGm0vv+PT k3lWZ9OWaKpfeR/g++PVqiymWUsUP/qimNZVU5236Zc8jhRg+CW/Fd6iEb7Op+u6aK8VrP8JWjwv lrnpUn4XzOvsos5Wc/OV9wG+fz3NyvyE6HR0npVNzk3cZwr3bfPV6k31FLRyrcLPw5F/t2jnr1fZ 1CIU/Yr7py/yGY3F799+hhbfJqaoS3RGQJYX+cxr2f9OKfyTwtJHu/fHO/QYkpqPhRKWO47+H1BL AwQUAAYACADRagZBUsP9QroBAABvAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1s7b0HYBxJliUmL23K e39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6 O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iHv8e7xZlepnXTVEtP/tod7zzUZovp9WsWF58 9tFXb55tH3yUNm22nGVltcw/++g6bz76PY6Sx9PVo2lV5y/rapXXbZE3KQFaNo+mq88+mrft6tHd u810ni+yZkwtlvTleVUvspb+rC/urrLp2+wiv7u3s/Pp3UXeZrOsze4C4PbKQvxIQc6mFuRqXZcM YDa9m5f5Il+2zd3d8e5d17bN60UTfYG/8VouivZ6lUebmi9t63dNYRteXV2Nr+5xU8J/9+7v/cXz 1zzU7WIJUk3zj44ez6aPpnWetVV9dJIVbVks0+NmXubX26+qslxky8d3vSYgZ5k17RdE+PMinz25 vsuf1fllgZk52n181//zsY5TAOSzlPB7JKMx33z33snTN88+Otrb2d3b3nmwvXf/ze6DR3v3H+3s /BT6Dt53ABeKwW0g3nuzt/tovwPRADhijEMeOfp/AFBLAwQUAAYACAAAACEA1mSzUfQAAAAxAwAA HAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHOskstqwzAQRfeF/oOYfS07fVBC5GxKIdvW /QBFHj+oLAnN9OG/r0hJ69BguvByrphzz4A228/BineM1HunoMhyEOiMr3vXKnipHq/uQRBrV2vr HSoYkWBbXl5sntBqTkvU9YFEojhS0DGHtZRkOhw0ZT6gSy+Nj4PmNMZWBm1edYtyled3Mk4ZUJ4w xa5WEHf1NYhqDPgftm+a3uCDN28DOj5TIT9w/4zM6ThKWB1bZAWTMEtEkOdFVkuK0B+LYzKnUCyq wKPFqcBhnqu/XbKe0y7+th/G77CYc7hZ0qHxjiu9txOPn+goIU8+evkFAAD//wMAUEsDBBQABgAI ANFqBkF65TN3MwIAAJAFAAARAAAAd29yZC9kb2N1bWVudC54bWztvQdgHEmWJSYvbcp7f0r1Stfg dKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99// P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J58dlH 6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0+OrRrJquF/myTQnAsnl0tZp+9tG8bVeP7t5tpvN8kTXj RTGtq6Y6b8fTanG3Oj8vpvndq6qe3d3b2d3h31Z1Nc2bhno7yZaXWfORglv0oVWrfElfnlf1Imvp z/ri7iKr365X2wR9lbXFpCiL9ppg73xqwFQ0hnr5SEFsW4TwyiNBSH+YN+rb9CuvPFUKcI9367wk HKplMy9WbhhfFxp9OTdALjcN4nJRmnZXq939D5uDp3V2RT8cwNugP5OXFqVgvhni7s4tZgQg7Bu3 QSHs02CyyIql6/hrkcYj7u799wOw1wWwung/AN3J+byu1isHrfgwaGfLtxYW5Po9YOkk+0Nr3gtA D5nX82xFEriYPjq7WFZ1NikJI5qylKiegq0/gsaZVLNr/Fyld/Gjyafty5o/uHj9g/QKrLK7t7dP Guzq0Zx+v3+A3+9Kiy+ymj5uK2Lp3X1pUxcX89b9Oanatlq4v8v83Pt2nmeznJTDgz3+87yqWu/P i3XLf5r+plXZ0MfNKpvm2og+v+uQvmuGc9dp0qP/B1BLAwQUAAYACADRagZB3iZxVZoCAAAzBwAA EgAAAHdvcmQvZm9udFRhYmxlLnhtbO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3m kuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrI Hz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KO0abPlLCurZf7Z R9d589HvcfT46tF5tWyblN5eNo8W088+mrft6tHdu810ni+yZlyt8iV9eV7Vi6ylP+uLu4usfrte bU+rxSpri0lRFu313b2dnU8/UjD1baBU5+fFNH9aTdeLfNny+3frvCSI1bKZF6vGQLu6DbSrqp6t 6mqaNw2NeFEKvEVWLC2Y3f0eoEUxraumOm/HNBjFiEHR67s7/NuidADuvx+APQtgMX10drGs6mxS EukJk5SAfWSon149WmYL+uIkK4tJXfAXq2xZNfkufXeZlZ99tLO382znPv2L//Z37uHfj9K7aDmd Z3WTt7bljn5+ni2K8tp83FwVTaPfrIp2OjdfXGZ1Abz0u6a4oG/WzWTns49Od+jZe/bsI/lk97OP 9umD4xP7yR6642dXP7lnP9nBJ1OGIy0ePtNPdv021OldIUOPHK+Lxev1kqmRle0L+szg/J//DX/s f/b3/6lmND1K7e58SrDv0U/9L06pg0+jlMrWbfWehNLR3HOE2js4eGaI4BNq99MbCAUK774noY4J sXKAa54QLfaVb/Z+aFyzd+xzzQl98uBg35DHcc3Dm7nm2ftyjQpR+ry4mLeDonTPkOOHJErHwHvv tCNKezsPnvSIYnhmmCg77y1Kb4pF3qQv8qv0VbXIlgNk2SNeuUdaZp81zb33JEvNkN+PLD9sXtFf mqP/B1BLAwQUAAQACADRagZBhoJdSR0EAAB5CQAAEQAAAHdvcmQvc2V0dGluZ3MueG1s7b0HYBxJ liUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z2899577733 3nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8i/se/9x98/Hu8W5TpZV43RbX87KPd 8c5Hab6cVrNiefHZR+v2fPvgo7Rps+UsK6tl/tlH13nz0e9x9PjqUZO3LTVqUgKwbB4tpp99NG/b 1aO7d5vpPF9kzbha5Uv68ryqF1lLf9YXdxdZ/Xa92p5Wi1XWFpOiLNrru3s7O59+pGAq6rRePlIQ 24tiWldNdd7ilUfV+XkxzfWHeaO+Tb/yytNqul7ky5Z7vFvnJeFQLZt5sWoMtMXXhUZfzg2Qy02D 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 AAsACwDBAgAAbCwAAAAA"; #endregion char[] base64CharArray = base64.Where(c => c != '\r' && c != '\n').ToArray(); byte[] byteArray = System.Convert.FromBase64CharArray(base64CharArray, 0, base64CharArray.Length); memoryStream.Write(byteArray, 0, byteArray.Length); using (WordprocessingDocument defaultDotx = WordprocessingDocument.Open(memoryStream, true)) { //Get the specified style from Default.dotx template for paragraph Style templateStyle = defaultDotx.MainDocumentPart.StyleDefinitionsPart.Styles.Elements <Style>().Where(s => s.StyleId == styleName && s.Type == StyleValues.Paragraph).FirstOrDefault(); //Check if the style is proper style. Ex, Heading1, Heading2 if (templateStyle == null) { throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified style name {0} is unsupported, Please specify the valid style. Ex, Heading1, Heading2, Title", styleName)); } else { part.Styles.Append((templateStyle.CloneNode(true))); } } } } paragraph.ParagraphProperties = new ParagraphProperties(new ParagraphStyleId() { Val = styleName }); } run.AppendChild(runProperties); run.AppendChild(new Text(strParagraph)); if (sectionProperties != null) { body.InsertBefore(paragraph, sectionProperties); } else { body.AppendChild(paragraph); } } return(streamDoc.GetModifiedWmlDocument()); } }
/// <summary> /// Inserts a watermark text inside a document /// </summary> /// <param name="watermarkText">text to show in the watermark</param> /// <param name="diagonalOrientation">specify that the text orientation will be in a diagonal way</param> public static OpenXmlPowerToolsDocument InsertWatermark(WmlDocument doc, string watermarkText, bool diagonalOrientation) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { Collection<XDocument> headers = new Collection<XDocument>(); if (HeaderAccessor.GetHeaderReference(document, HeaderType.First, 0) == null) headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.First)); else headers.Add(HeaderAccessor.GetHeader(document, HeaderType.First, 0)); if (HeaderAccessor.GetHeaderReference(document, HeaderType.Even, 0) == null) headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.Even)); else headers.Add(HeaderAccessor.GetHeader(document, HeaderType.Even, 0)); if (HeaderAccessor.GetHeaderReference(document, HeaderType.Default, 0) == null) headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.Default)); else headers.Add(HeaderAccessor.GetHeader(document, HeaderType.Default, 0)); foreach (XDocument header in headers) { var runElement = header.Descendants(ns + "r").FirstOrDefault(); if (runElement == null) { header.Root.Add( new XElement(ns + "sdt", new XElement(ns + "sdtContent", new XElement(ns + "p", new XElement(ns + "pPr", new XElement(ns + "pStyle", new XAttribute(ns + "val", "Header") ) ), runElement = new XElement(ns + "r") ) ) ) ); } runElement.AddBeforeSelf(CreateWatermarkVml(watermarkText, diagonalOrientation)); } HeaderAccessor.GetHeaderPart(document, HeaderType.First, 0).PutXDocument(); HeaderAccessor.GetHeaderPart(document, HeaderType.Even, 0).PutXDocument(); HeaderAccessor.GetHeaderPart(document, HeaderType.Default, 0).PutXDocument(); } return streamDoc.GetModifiedDocument(); } }
/// <summary> /// Inserts a watermark text inside a document /// </summary> /// <param name="watermarkText">text to show in the watermark</param> /// <param name="diagonalOrientation">specify that the text orientation will be in a diagonal way</param> public static OpenXmlPowerToolsDocument InsertWatermark(WmlDocument doc, string watermarkText, bool diagonalOrientation) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { Collection <XDocument> headers = new Collection <XDocument>(); if (HeaderAccessor.GetHeaderReference(document, HeaderType.First, 0) == null) { headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.First)); } else { headers.Add(HeaderAccessor.GetHeader(document, HeaderType.First, 0)); } if (HeaderAccessor.GetHeaderReference(document, HeaderType.Even, 0) == null) { headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.Even)); } else { headers.Add(HeaderAccessor.GetHeader(document, HeaderType.Even, 0)); } if (HeaderAccessor.GetHeaderReference(document, HeaderType.Default, 0) == null) { headers.Add(HeaderAccessor.AddNewHeader(document, HeaderType.Default)); } else { headers.Add(HeaderAccessor.GetHeader(document, HeaderType.Default, 0)); } foreach (XDocument header in headers) { var runElement = header.Descendants(ns + "r").FirstOrDefault(); if (runElement == null) { header.Root.Add( new XElement(ns + "sdt", new XElement(ns + "sdtContent", new XElement(ns + "p", new XElement(ns + "pPr", new XElement(ns + "pStyle", new XAttribute(ns + "val", "Header") ) ), runElement = new XElement(ns + "r") ) ) ) ); } runElement.AddBeforeSelf(CreateWatermarkVml(watermarkText, diagonalOrientation)); } HeaderAccessor.GetHeaderPart(document, HeaderType.First, 0).PutXDocument(); HeaderAccessor.GetHeaderPart(document, HeaderType.Even, 0).PutXDocument(); HeaderAccessor.GetHeaderPart(document, HeaderType.Default, 0).PutXDocument(); } return(streamDoc.GetModifiedDocument()); } }
public static bool HasTrackedRevisions(WmlDocument document) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(document)) { using (WordprocessingDocument wdoc = streamDoc.GetWordprocessingDocument()) { return RevisionAccepter.HasTrackedRevisions(wdoc); } } }
public static WmlDocument MergeComments(WmlDocument document1, WmlDocument document2, bool ensureLocked) { WmlDocument cDoc1 = new WmlDocument(document1); WmlDocument cDoc2 = new WmlDocument(document2); using (OpenXmlMemoryStreamDocument streamDoc1 = new OpenXmlMemoryStreamDocument(cDoc1)) using (WordprocessingDocument doc1 = streamDoc1.GetWordprocessingDocument()) using (OpenXmlMemoryStreamDocument streamDoc2 = new OpenXmlMemoryStreamDocument(cDoc2)) using (WordprocessingDocument doc2 = streamDoc2.GetWordprocessingDocument()) { SimplifyMarkupSettings mss = new SimplifyMarkupSettings() { RemoveProof = true, RemoveRsidInfo = true, RemoveGoBackBookmark = true, }; MarkupSimplifier.SimplifyMarkup(doc1, mss); MarkupSimplifier.SimplifyMarkup(doc2, mss); // If documents don't contain the same content, then don't attempt to merge comments. bool same = DocumentComparer.CompareDocuments(doc1, doc2); if (!same) { throw new CommentMergerDifferingContentsException( "Documents do not contain the same content"); } if (doc1.MainDocumentPart.WordprocessingCommentsPart == null && doc2.MainDocumentPart.WordprocessingCommentsPart == null) { return(new WmlDocument(document1)); } if (doc1.MainDocumentPart.WordprocessingCommentsPart != null && doc2.MainDocumentPart.WordprocessingCommentsPart == null) { return(new WmlDocument(document1)); } if (doc1.MainDocumentPart.WordprocessingCommentsPart == null && doc2.MainDocumentPart.WordprocessingCommentsPart != null) { return(new WmlDocument(document2)); } // If either of the documents have no comments, then return the other one. if (!doc1.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root .Elements(W.comment).Any()) { return(new WmlDocument(document2)); } if (!doc2.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root .Elements(W.comment).Any()) { return(new WmlDocument(document1)); } if (ensureLocked) { // If either document is not locked (allowing only commenting), don't attempt to // merge comments. if (doc1.ExtendedFilePropertiesPart.GetXDocument().Root .Element(EP.DocSecurity).Value != "8") { throw new CommentMergerUnlockedDocumentException( "Document1 is not locked"); } if (doc2.ExtendedFilePropertiesPart.GetXDocument().Root .Element(EP.DocSecurity).Value != "8") { throw new CommentMergerUnlockedDocumentException( "Document2 is not locked"); } } RenumberCommentsInDoc2(doc1, doc2); WmlDocument destDoc = new WmlDocument(document1); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(destDoc)) { using (WordprocessingDocument destWDoc = streamDoc.GetWordprocessingDocument()) { // Merge the comments part. XDocument commentsPartXDoc = new XDocument( new XElement(W.comments, new XAttribute(XNamespace.Xmlns + "w", W.w), doc1.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root.Elements(), doc2.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root.Elements())); destWDoc.MainDocumentPart.WordprocessingCommentsPart.PutXDocument(commentsPartXDoc); MergeCommentsInPart(doc1.MainDocumentPart, doc2.MainDocumentPart, destWDoc.MainDocumentPart, commentsPartXDoc); } return(streamDoc.GetModifiedWmlDocument()); } } }
/// <summary> /// Gets the document theme /// </summary> public static OpenXmlPowerToolsDocument GetTheme(WmlDocument doc) { using (OpenXmlMemoryStreamDocument sourceStreamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = sourceStreamDoc.GetWordprocessingDocument()) { // Loads the theme part main file ThemePart theme = document.MainDocumentPart.ThemePart; if (theme != null) { XDocument themeDocument = theme.GetXDocument(); // Creates the theme package (thmx file) using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreatePackage()) { using (Package themePackage = streamDoc.GetPackage()) { // Creates the theme manager part on the new package and loads default content PackagePart newThemeManagerPart = themePackage.CreatePart(new Uri("/theme/theme/themeManager.xml", UriKind.RelativeOrAbsolute), "application/vnd.openxmlformats-officedocument.themeManager+xml"); themePackage.CreateRelationship(newThemeManagerPart.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); using (XmlWriter xWriter = XmlWriter.Create(newThemeManagerPart.GetStream(FileMode.Create, FileAccess.Write))) { CreateEmptyThemeManager().WriteTo(xWriter); xWriter.Flush(); } // Creates the main theme part PackagePart newThemePart = themePackage.CreatePart(new Uri("/theme/theme/" + theme.Uri.OriginalString.Substring(theme.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), theme.ContentType); newThemeManagerPart.CreateRelationship(newThemePart.Uri, TargetMode.Internal, theme.RelationshipType); // Gets embeded part references var embeddedItems = themeDocument .Descendants() .Attributes(relationshipns + "embed"); foreach (IdPartPair partId in theme.Parts) { OpenXmlPart part = partId.OpenXmlPart; // Creates the new media part inside the destination package PackagePart newPart = themePackage.CreatePart(new Uri("/theme/media/" + part.Uri.OriginalString.Substring(part.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), part.ContentType); PackageRelationship relationship = newThemePart.CreateRelationship(newPart.Uri, TargetMode.Internal, part.RelationshipType); // Copies binary content from original part to destination part Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read); Stream newPartStream = newPart.GetStream(FileMode.Create, FileAccess.Write); byte[] fileContent = new byte[partStream.Length]; partStream.Read(fileContent, 0, (int)partStream.Length); newPartStream.Write(fileContent, 0, (int)partStream.Length); newPartStream.Flush(); // Replaces old embed part reference with the freshly created one XAttribute relationshipAttribute = embeddedItems.FirstOrDefault(e => e.Value == theme.GetIdOfPart(part)); if (relationshipAttribute != null) relationshipAttribute.Value = relationship.Id; } // Writes the updated theme XDocument into the destination package using (XmlWriter newThemeWriter = XmlWriter.Create(newThemePart.GetStream(FileMode.Create, FileAccess.Write))) themeDocument.WriteTo(newThemeWriter); } return streamDoc.GetModifiedDocument(); } } return null; } }
/// <summary> /// Set a new footer in a document /// </summary> /// <param name="footer">XDocument containing the footer to add in the document</param> /// <param name="type">The footer part type</param> public static OpenXmlPowerToolsDocument SetFooter(WmlDocument doc, XDocument footer, FooterType type, int sectionIndex) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { // Removes the reference in the document.xml and the footer part if those already // exist XElement footerReferenceElement = GetFooterReference(document, type, sectionIndex); if (footerReferenceElement != null) { GetFooterPart(document, type, sectionIndex).RemovePart(); footerReferenceElement.Remove(); } // Add the new footer FooterPart footerPart = document.MainDocumentPart.AddNewPart <FooterPart>(); footerPart.PutXDocument(footer); // If the document does not have a property section a new one must be created if (SectionPropertiesElements(document).Count() == 0) { AddDefaultSectionProperties(document); } // Creates the relationship of the footer inside the section properties in the document string relID = document.MainDocumentPart.GetIdOfPart(footerPart); string kindName = ""; switch ((FooterType)type) { case FooterType.First: kindName = "first"; break; case FooterType.Even: kindName = "even"; break; case FooterType.Default: kindName = "default"; break; } XElement sectionPropertyElement = SectionPropertiesElements(document).Skip(sectionIndex).FirstOrDefault(); if (sectionPropertyElement != null) { sectionPropertyElement.Add( new XElement(ns + "footerReference", new XAttribute(ns + "type", kindName), new XAttribute(relationshipns + "id", relID))); if (sectionPropertyElement.Element(ns + "titlePg") == null) { sectionPropertyElement.Add( new XElement(ns + "titlePg") ); } } document.MainDocumentPart.PutXDocument(); // add in the settings part the EvendAndOddHeaders. this element // allow to see the odd and even footers and headers in the document. SettingAccessor.AddEvenAndOddHeadersElement(document); } return(streamDoc.GetModifiedDocument()); } }
public static OpenXmlPowerToolsDocument Insert(WmlDocument doc, string xpathInsertionPoint, Image pictureToInsert, string name) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument xmlMainDocument = document.MainDocumentPart.GetXDocument(); ImagePart picturePart = null; XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable()); namespaceManager.AddNamespace("w", mainns.NamespaceName); IEnumerable <XElement> insertionPoints = xmlMainDocument.XPathSelectElements(xpathInsertionPoint, namespaceManager); //make the insertion for each insertion point specified in the xpath query foreach (XElement insertionPoint in insertionPoints) { if (picturePart == null) { // Create the picture part in the package picturePart = document.MainDocumentPart.AddImagePart(GetImagePartType(pictureToInsert.RawFormat)); } // the pictures in the main document part goes in a very long xml, wich specifies the way the picture // has to be placed using drawingXml. insertionPoint.AddAfterSelf( new XElement(mainns + "p", new XElement(mainns + "r", new XElement(mainns + "drawing", new XElement(wordprocessingDrawingns + "inline", new XElement(wordprocessingDrawingns + "extent", new XAttribute("cx", pictureToInsert.Width * pixelsPerEmu), new XAttribute("cy", pictureToInsert.Height * pixelsPerEmu) ), new XElement(wordprocessingDrawingns + "docPr", new XAttribute("name", name), new XAttribute("id", "1") ), new XElement(drawingmlMainns + "graphic", new XAttribute(XNamespace.Xmlns + "a", drawingmlMainns.NamespaceName), new XElement(drawingmlMainns + "graphicData", new XAttribute("uri", picturens.NamespaceName), new XElement(picturens + "pic", new XAttribute(XNamespace.Xmlns + "pic", picturens.NamespaceName), new XElement(picturens + "nvPicPr", new XElement(picturens + "cNvPr", new XAttribute("id", "0"), new XAttribute("name", name) ), new XElement(picturens + "cNvPicPr") ), new XElement(picturens + "blipFill", new XElement(drawingmlMainns + "blip", new XAttribute(relationshipns + "embed", document.MainDocumentPart.GetIdOfPart(picturePart)) ), new XElement(drawingmlMainns + "stretch", new XElement(drawingmlMainns + "fillRect") ) ), new XElement(picturens + "spPr", new XElement(drawingmlMainns + "xfrm", new XElement(drawingmlMainns + "off", new XAttribute("x", "0"), new XAttribute("y", "0") ), new XElement(drawingmlMainns + "ext", new XAttribute("cx", pictureToInsert.Width * pixelsPerEmu), new XAttribute("cy", pictureToInsert.Height * pixelsPerEmu) ) ), new XElement(drawingmlMainns + "prstGeom", new XAttribute("prst", "rect") ) ) ) ) ) ) ) ) ) ); } if (picturePart != null) { Stream partStream = picturePart.GetStream(FileMode.Create, FileAccess.ReadWrite); pictureToInsert.Save(partStream, pictureToInsert.RawFormat); } else { throw new ArgumentException("The xpath query did not return a valid location."); } document.MainDocumentPart.PutXDocument(); } return(streamDoc.GetModifiedDocument()); } }
private static void BuildDocument(List<Source> sources, WordprocessingDocument output) { if (RelationshipMarkup == null) RelationshipMarkup = new Dictionary<XName, XName[]>() { //{ button, new [] { image }}, { A.blip, new [] { R.embed, R.link }}, { A.hlinkClick, new [] { R.id }}, { A.relIds, new [] { R.cs, R.dm, R.lo, R.qs }}, //{ a14:imgLayer, new [] { R.embed }}, //{ ax:ocx, new [] { R.id }}, { C.chart, new [] { R.id }}, { C.externalData, new [] { R.id }}, { C.userShapes, new [] { R.id }}, { DGM.relIds, new [] { R.cs, R.dm, R.lo, R.qs }}, { O.OLEObject, new [] { R.id }}, { VML.fill, new [] { R.id }}, { VML.imagedata, new [] { R.href, R.id, R.pict }}, { VML.stroke, new [] { R.id }}, { W.altChunk, new [] { R.id }}, { W.attachedTemplate, new [] { R.id }}, { W.control, new [] { R.id }}, { W.dataSource, new [] { R.id }}, { W.embedBold, new [] { R.id }}, { W.embedBoldItalic, new [] { R.id }}, { W.embedItalic, new [] { R.id }}, { W.embedRegular, new [] { R.id }}, { W.footerReference, new [] { R.id }}, { W.headerReference, new [] { R.id }}, { W.headerSource, new [] { R.id }}, { W.hyperlink, new [] { R.id }}, { W.printerSettings, new [] { R.id }}, { W.recipientData, new [] { R.id }}, // Mail merge, not required { W.saveThroughXslt, new [] { R.id }}, { W.sourceFileName, new [] { R.id }}, // Framesets, not required { W.src, new [] { R.id }}, // Mail merge, not required { W.subDoc, new [] { R.id }}, // Sub documents, not required //{ w14:contentPart, new [] { R.id }}, { WNE.toolbarData, new [] { R.id }}, }; // This list is used to eliminate duplicate images List<ImageData> images = new List<ImageData>(); XDocument mainPart = output.MainDocumentPart.GetXDocument(); mainPart.Declaration.Standalone = "yes"; mainPart.Declaration.Encoding = "UTF-8"; mainPart.Root.ReplaceWith( new XElement(W.document, NamespaceAttributes, new XElement(W.body))); if (sources.Count > 0) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(sources[0].WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { CopyStartingParts(doc, output, images); } int sourceNum = 0; foreach (Source source in sources) { if (source.InsertId != null) { while (true) { XDocument mainXDoc = output.MainDocumentPart.GetXDocument(); if (!mainXDoc.Descendants(PtOpenXml.Insert).Any(d => (string)d.Attribute(PtOpenXml.Id) == source.InsertId)) break; using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { #if TestForUnsupportedDocuments // throws exceptions if a document contains unsupported content TestForUnsupportedDocument(doc, sources.IndexOf(source)); #endif List<XElement> contents = doc.MainDocumentPart.GetXDocument() .Root .Element(W.body) .Elements() .Skip(source.Start) .Take(source.Count) .ToList(); try { AppendDocument(doc, output, contents, source.KeepSections, source.InsertId, images); } catch (DocumentBuilderInternalException dbie) { if (dbie.Message.Contains("{0}")) throw new DocumentBuilderException(string.Format(dbie.Message, sourceNum)); else throw dbie; } } } } else { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { #if TestForUnsupportedDocuments // throws exceptions if a document contains unsupported content TestForUnsupportedDocument(doc, sources.IndexOf(source)); #endif List<XElement> contents = doc.MainDocumentPart.GetXDocument() .Root .Element(W.body) .Elements() .Skip(source.Start) .Take(source.Count) .ToList(); try { AppendDocument(doc, output, contents, source.KeepSections, null, images); } catch (DocumentBuilderInternalException dbie) { if (dbie.Message.Contains("{0}")) throw new DocumentBuilderException(string.Format(dbie.Message, sourceNum)); else throw dbie; } } } ++sourceNum; } if (!sources.Any(s => s.KeepSections)) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(sources[0].WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { var sectPr = doc.MainDocumentPart.GetXDocument().Root.Element(W.body) .Elements().Last(); if (sectPr.Name == W.sectPr) { AddSectionAndDependencies(doc, output, sectPr, images); output.MainDocumentPart.GetXDocument().Root.Element(W.body).Add(sectPr); } } } else FixUpSectionProperties(output); } foreach (var part in output.GetAllParts()) if (part.Annotation<XDocument>() != null) part.PutXDocument(); }
/// <summary> /// Insert a style into a given xmlpath inside the document part /// </summary> /// <param name="xpathInsertionPoint">place where we are going to put the style</param> /// <param name="styleValue">name of the style</param> /// <param name="stylesSource">XDocument containing styles</param> public static OpenXmlPowerToolsDocument Insert(WmlDocument doc, string xpathInsertionPoint, string styleValue, XDocument stylesSource) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument xDocument = document.MainDocumentPart.GetXDocument(); XmlDocument xmlMainDocument = new XmlDocument(); xmlMainDocument.Load(xDocument.CreateReader()); // create the style element to add in the document, based upon the style name. // this is an example of an style element // <w:pStyle w:val="Heading1" /> // so, in order to construct this, we have to know already if the style will be placed inside // a run or inside a paragraph. to know this we have to verify against the xpath, and know if // the query want to access a 'run' or a paragraph XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xmlMainDocument.NameTable); namespaceManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); XmlNodeList insertionPoints = xmlMainDocument.SelectNodes(xpathInsertionPoint, namespaceManager); if (insertionPoints.Count == 0) { throw new ArgumentException("The xpath query did not return a valid location."); } foreach (XmlNode insertionPoint in insertionPoints) { XmlElement xmlStyle = null; if (insertionPoint.LocalName == "r" || insertionPoint.LocalName == "p") { XmlNode propertiesElement = insertionPoint.SelectSingleNode(@"w:pPr|w:rPr", namespaceManager); //if (propertiesElement != null) //{ if (insertionPoint.Name == "w:p") { xmlStyle = xmlMainDocument.CreateElement("w", "pStyle", namespaceManager.LookupNamespace("w")); // retrieve the suffix from the styleAccesor class xmlStyle.SetAttribute("val", namespaceManager.LookupNamespace("w"), styleValue + newStyleNameSuffix); // check if the rPr or pPr element exist, if so, then add the style xml element // inside, if not, then add a new rPr or pPr element if (propertiesElement != null) { // check if there is already a style node and remove it XmlNodeList xmlStyleList = propertiesElement.SelectNodes("w:pStyle", namespaceManager); for (int i = 0; i < xmlStyleList.Count; i++) { propertiesElement.RemoveChild(xmlStyleList[i]); } propertiesElement.PrependChild(xmlStyle); } else { propertiesElement = xmlMainDocument.CreateElement("w", "pPr", namespaceManager.LookupNamespace("w")); propertiesElement.PrependChild(xmlStyle); insertionPoint.PrependChild(propertiesElement); } } if (insertionPoint.Name == "w:r") { xmlStyle = xmlMainDocument.CreateElement("w", "rStyle", namespaceManager.LookupNamespace("w")); xmlStyle.SetAttribute("val", namespaceManager.LookupNamespace("w"), styleValue + newStyleNameSuffix); if (propertiesElement != null) { // check if there is already a style node and remove it XmlNodeList xmlStyleList = propertiesElement.SelectNodes("w:rStyle", namespaceManager); for (int i = 0; i < xmlStyleList.Count; i++) { propertiesElement.RemoveChild(xmlStyleList[i]); } propertiesElement.PrependChild(xmlStyle); } else { propertiesElement = xmlMainDocument.CreateElement("w", "rPr", namespaceManager.LookupNamespace("w")); propertiesElement.PrependChild(xmlStyle); insertionPoint.PrependChild(propertiesElement); } } //} } else { throw new ArgumentException("The xpath query did not return a valid location."); } XDocument xNewDocument = new XDocument(); using (XmlWriter xWriter = xNewDocument.CreateWriter()) xmlMainDocument.WriteTo(xWriter); document.MainDocumentPart.PutXDocument(xNewDocument); // the style has been added in the main document part, but now we have to add the // style definition in the styles definitions part. the style definition need to be // extracted from the given inputStyle file. // Because a style can be linked with other styles and // can also be based on other styles, all the complete hierarchy of styles has // to be added Collection <XElement> styleHierarchy = StyleAccessor.GetStyleHierarchy(styleValue, stylesSource, newStyleNameSuffix); // open the styles file in the document XDocument xmlStylesDefinitionDocument = StyleAccessor.GetStylesDocument(document); XDocument xElem = new XDocument(); xElem.Add(xmlStylesDefinitionDocument.Root); //insert the new style foreach (XElement xmlStyleDefinition in styleHierarchy) { xElem.Root.Add(xmlStyleDefinition); } document.MainDocumentPart.StyleDefinitionsPart.PutXDocument(xElem); } } return(streamDoc.GetModifiedDocument()); } }
static public Commands.MatchInfo[] SearchInDocument(WmlDocument doc, IEnumerable <string> styleSearchString, IEnumerable <string> contentSearchString, bool isRegularExpression, bool caseInsensitive) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; XName r = w + "r"; XName ins = w + "ins"; RegexOptions options; Regex[] regularExpressions = null; if (isRegularExpression && contentSearchString != null) { if (caseInsensitive) { options = RegexOptions.IgnoreCase | RegexOptions.Compiled; } else { options = RegexOptions.Compiled; } regularExpressions = contentSearchString .Select(s => new Regex(s, options)).ToArray(); } var defaultStyleName = (string)document .MainDocumentPart .StyleDefinitionsPart .GetXDocument() .Root .Elements(w + "style") .Where(style => (string)style.Attribute(w + "type") == "paragraph" && (string)style.Attribute(w + "default") == "1") .First() .Attribute(w + "styleId"); var q1 = document .MainDocumentPart .GetXDocument() .Root .Element(w + "body") .Elements() .Select((p, i) => { var styleNode = p .Elements(w + "pPr") .Elements(w + "pStyle") .FirstOrDefault(); var styleName = styleNode != null ? (string)styleNode.Attribute(w + "val") : defaultStyleName; return(new { Element = p, Index = i, StyleName = styleName }); } ); var q2 = q1 .Select(i => { string text = null; if (i.Element.Name == w + "p") { text = i.Element.Elements() .Where(z => z.Name == r || z.Name == ins) .Descendants(w + "t") .StringConcatenate(element => (string)element); } else { text = i.Element .Descendants(w + "p") .StringConcatenate(p => p .Elements() .Where(z => z.Name == r || z.Name == ins) .Descendants(w + "t") .StringConcatenate(element => (string)element), Environment.NewLine ); } return(new { Element = i.Element, StyleName = i.StyleName, Index = i.Index, Text = text }); } ); var q3 = q2 .Select(i => new Commands.MatchInfo { ElementNumber = i.Index + 1, Content = i.Text, Style = ContainsAnyStyles(GetAllStyleIdsAndNames(document, i.StyleName).Distinct(), styleSearchString), Pattern = ContainsAnyContent(i.Text, contentSearchString, regularExpressions, isRegularExpression, caseInsensitive), IgnoreCase = caseInsensitive } ) .Where(i => (styleSearchString == null || i.Style != null) && (contentSearchString == null || i.Pattern != null)); return(q3.ToArray()); } }
/// <summary> /// Removes personal information from the document. /// </summary> /// <param name="document"></param> public static OpenXmlPowerToolsDocument RemovePersonalInformation(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XNamespace x = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"; XDocument extendedFileProperties = document.ExtendedFilePropertiesPart.GetXDocument(); extendedFileProperties.Elements(x + "Properties").Elements(x + "Company").Remove(); XElement totalTime = extendedFileProperties.Elements(x + "Properties").Elements(x + "TotalTime").FirstOrDefault(); if (totalTime != null) { totalTime.Value = "0"; } document.ExtendedFilePropertiesPart.PutXDocument(); XNamespace dc = "http://purl.org/dc/elements/1.1/"; XNamespace cp = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"; XDocument coreFileProperties = document.CoreFilePropertiesPart.GetXDocument(); foreach (var textNode in coreFileProperties.Elements(cp + "coreProperties") .Elements(dc + "creator") .Nodes() .OfType <XText>()) { textNode.Value = ""; } foreach (var textNode in coreFileProperties.Elements(cp + "coreProperties") .Elements(cp + "lastModifiedBy") .Nodes() .OfType <XText>()) { textNode.Value = ""; } foreach (var textNode in coreFileProperties.Elements(cp + "coreProperties") .Elements(dc + "title") .Nodes() .OfType <XText>()) { textNode.Value = ""; } XElement revision = coreFileProperties.Elements(cp + "coreProperties").Elements(cp + "revision").FirstOrDefault(); if (revision != null) { revision.Value = "1"; } document.CoreFilePropertiesPart.PutXDocument(); // add w:removePersonalInformation, w:removeDateAndTime to DocumentSettingsPart XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; XDocument documentSettings = document.MainDocumentPart.DocumentSettingsPart.GetXDocument(); // add the new elements in the right position. Add them after the following three elements // (which may or may not exist in the xml document). XElement settings = documentSettings.Root; XElement lastOfTop3 = settings.Elements() .Where(e => e.Name == w + "writeProtection" || e.Name == w + "view" || e.Name == w + "zoom") .InDocumentOrder() .LastOrDefault(); if (lastOfTop3 == null) { // none of those three exist, so add as first children of the root element settings.AddFirst( settings.Elements(w + "removePersonalInformation").Any() ? null : new XElement(w + "removePersonalInformation"), settings.Elements(w + "removeDateAndTime").Any() ? null : new XElement(w + "removeDateAndTime") ); } else { // one of those three exist, so add after the last one lastOfTop3.AddAfterSelf( settings.Elements(w + "removePersonalInformation").Any() ? null : new XElement(w + "removePersonalInformation"), settings.Elements(w + "removeDateAndTime").Any() ? null : new XElement(w + "removeDateAndTime") ); } document.MainDocumentPart.DocumentSettingsPart.PutXDocument(); } return(streamDoc.GetModifiedDocument()); } }
/// <summary> /// Sets the document theme /// </summary> /// <param name="theme">Theme package</param> public static OpenXmlPowerToolsDocument SetTheme(WmlDocument doc, OpenXmlPowerToolsDocument themeDoc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { using (OpenXmlMemoryStreamDocument themeStream = new OpenXmlMemoryStreamDocument(themeDoc)) using (Package theme = themeStream.GetPackage()) { // Gets the theme manager part PackageRelationship themeManagerRelationship = theme.GetRelationshipsByType(mainDocumentRelationshipType).FirstOrDefault(); if (themeManagerRelationship != null) { PackagePart themeManagerPart = theme.GetPart(themeManagerRelationship.TargetUri); // Gets the theme main part PackageRelationship themeRelationship = themeManagerPart.GetRelationshipsByType(themeRelationshipType).FirstOrDefault(); if (themeRelationship != null) { PackagePart themePart = theme.GetPart(themeRelationship.TargetUri); XDocument newThemeDocument = XDocument.Load(XmlReader.Create(themePart.GetStream(FileMode.Open, FileAccess.Read))); // Removes existing theme part from document if (document.MainDocumentPart.ThemePart != null) document.MainDocumentPart.DeletePart(document.MainDocumentPart.ThemePart); // Creates a new theme part ThemePart documentThemePart = document.MainDocumentPart.AddNewPart<ThemePart>(); var embeddedItems = newThemeDocument .Descendants() .Attributes(relationshipns + "embed"); foreach (PackageRelationship imageRelationship in themePart.GetRelationships()) { // Adds an image part to the theme part and stores contents inside PackagePart imagePart = theme.GetPart(imageRelationship.TargetUri); ImagePart newImagePart = documentThemePart.AddImagePart(GetImagePartType(imagePart.ContentType)); newImagePart.FeedData(imagePart.GetStream(FileMode.Open, FileAccess.Read)); // Updates relationship references into the theme XDocument XAttribute relationshipAttribute = embeddedItems.FirstOrDefault(e => e.Value == imageRelationship.Id); if (relationshipAttribute != null) relationshipAttribute.Value = documentThemePart.GetIdOfPart(newImagePart); } documentThemePart.PutXDocument(newThemeDocument); } } } } return streamDoc.GetModifiedDocument(); } }
public static IEnumerable<WmlDocument> SplitOnSections(WmlDocument doc) { List<TempSource> tempSourceList; using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainDocument = document.MainDocumentPart.GetXDocument(); var divs = mainDocument .Root .Element(W.body) .Elements() .Select((p, i) => new { BlockLevelContent = p, Index = i, }) .Rollup(new { BlockLevelContent = (XElement)null, Index = -1, Div = 0, }, (b, p) => { XElement elementBefore = b.BlockLevelContent .ElementsBeforeSelfReverseDocumentOrder() .FirstOrDefault(); if (elementBefore != null && elementBefore.Descendants(W.sectPr).Any()) return new { BlockLevelContent = b.BlockLevelContent, Index = b.Index, Div = p.Div + 1, }; return new { BlockLevelContent = b.BlockLevelContent, Index = b.Index, Div = p.Div, }; }); var groups = divs .GroupAdjacent(b => b.Div); tempSourceList = groups .Select(g => new TempSource { Start = g.First().Index, Count = g.Count(), }) .ToList(); foreach (var ts in tempSourceList) { List<Source> sources = new List<Source>() { new Source(doc, ts.Start, ts.Count, true) }; WmlDocument newDoc = DocumentBuilder.BuildDocument(sources); newDoc = AdjustSectionBreak(newDoc); yield return newDoc; } } }
private static void BuildDocument(List<Source> sources, WordprocessingDocument output) { if (RelationshipMarkup == null) RelationshipMarkup = new Dictionary<XName, XName[]>() { //{ button, new [] { image }}, { A.blip, new [] { R.embed, R.link }}, { A.hlinkClick, new [] { R.id }}, { A.relIds, new [] { R.cs, R.dm, R.lo, R.qs }}, //{ a14:imgLayer, new [] { R.embed }}, //{ ax:ocx, new [] { R.id }}, { C.chart, new [] { R.id }}, { C.externalData, new [] { R.id }}, { C.userShapes, new [] { R.id }}, { DGM.relIds, new [] { R.cs, R.dm, R.lo, R.qs }}, { O.OLEObject, new [] { R.id }}, { VML.fill, new [] { R.id }}, { VML.imagedata, new [] { R.href, R.id, R.pict }}, { VML.stroke, new [] { R.id }}, { W.altChunk, new [] { R.id }}, { W.attachedTemplate, new [] { R.id }}, { W.control, new [] { R.id }}, { W.dataSource, new [] { R.id }}, { W.embedBold, new [] { R.id }}, { W.embedBoldItalic, new [] { R.id }}, { W.embedItalic, new [] { R.id }}, { W.embedRegular, new [] { R.id }}, { W.footerReference, new [] { R.id }}, { W.headerReference, new [] { R.id }}, { W.headerSource, new [] { R.id }}, { W.hyperlink, new [] { R.id }}, { W.printerSettings, new [] { R.id }}, { W.recipientData, new [] { R.id }}, // Mail merge, not required { W.saveThroughXslt, new [] { R.id }}, { W.sourceFileName, new [] { R.id }}, // Framesets, not required { W.src, new [] { R.id }}, // Mail merge, not required { W.subDoc, new [] { R.id }}, // Sub documents, not required //{ w14:contentPart, new [] { R.id }}, { WNE.toolbarData, new [] { R.id }}, }; // This list is used to eliminate duplicate images List<ImageData> images = new List<ImageData>(); XDocument mainPart = output.MainDocumentPart.GetXDocument(); mainPart.Declaration.Standalone = "yes"; mainPart.Declaration.Encoding = "UTF-8"; mainPart.Root.ReplaceWith( new XElement(W.document, NamespaceAttributes, new XElement(W.body))); if (sources.Count > 0) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(sources[0].WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { CopyStartingParts(doc, output, images); } int sourceNum = 0; foreach (Source source in sources) { if (source.InsertId != null) { while (true) { XDocument mainXDoc = output.MainDocumentPart.GetXDocument(); if (!mainXDoc.Descendants(PtOpenXml.Insert).Any(d => (string)d.Attribute(PtOpenXml.Id) == source.InsertId)) break; using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { #if TestForUnsupportedDocuments // throws exceptions if a document contains unsupported content TestForUnsupportedDocument(doc, sources.IndexOf(source)); #endif if (source.KeepSections && source.DiscardHeadersAndFootersInKeptSections) RemoveHeadersAndFootersFromSections(doc); else if (source.KeepSections) ProcessSectionsForLinkToPreviousHeadersAndFooters(doc); List<XElement> contents = doc.MainDocumentPart.GetXDocument() .Root .Element(W.body) .Elements() .Skip(source.Start) .Take(source.Count) .ToList(); try { AppendDocument(doc, output, contents, source.KeepSections, source.InsertId, images); } catch (DocumentBuilderInternalException dbie) { if (dbie.Message.Contains("{0}")) throw new DocumentBuilderException(string.Format(dbie.Message, sourceNum)); else throw dbie; } } } } else { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { #if TestForUnsupportedDocuments // throws exceptions if a document contains unsupported content TestForUnsupportedDocument(doc, sources.IndexOf(source)); #endif if (source.KeepSections && source.DiscardHeadersAndFootersInKeptSections) RemoveHeadersAndFootersFromSections(doc); else if (source.KeepSections) ProcessSectionsForLinkToPreviousHeadersAndFooters(doc); List<XElement> contents = doc.MainDocumentPart.GetXDocument() .Root .Element(W.body) .Elements() .Skip(source.Start) .Take(source.Count) .ToList(); try { AppendDocument(doc, output, contents, source.KeepSections, null, images); } catch (DocumentBuilderInternalException dbie) { if (dbie.Message.Contains("{0}")) throw new DocumentBuilderException(string.Format(dbie.Message, sourceNum)); else throw dbie; } } } ++sourceNum; } if (!sources.Any(s => s.KeepSections)) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(sources[0].WmlDocument)) using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument()) { var sectPr = doc.MainDocumentPart.GetXDocument().Root.Element(W.body) .Elements().Last(); if (sectPr.Name == W.sectPr) { AddSectionAndDependencies(doc, output, sectPr, images); output.MainDocumentPart.GetXDocument().Root.Element(W.body).Add(sectPr); } } } else { FixUpSectionProperties(output); // Any sectPr elements that do not have headers and footers should take their headers and footers from the *next* section, // i.e. from the running section. var mxd = output.MainDocumentPart.GetXDocument(); var sections = mxd.Descendants(W.sectPr).Reverse().ToList(); CachedHeaderFooter[] cachedHeaderFooter = new[] { new CachedHeaderFooter() { Ref = W.headerReference, Type = "first" }, new CachedHeaderFooter() { Ref = W.headerReference, Type = "even" }, new CachedHeaderFooter() { Ref = W.headerReference, Type = "default" }, new CachedHeaderFooter() { Ref = W.footerReference, Type = "first" }, new CachedHeaderFooter() { Ref = W.footerReference, Type = "even" }, new CachedHeaderFooter() { Ref = W.footerReference, Type = "default" }, }; bool firstSection = true; foreach (var sect in sections) { if (firstSection) { foreach (var hf in cachedHeaderFooter) { var referenceElement = sect.Elements(hf.Ref).FirstOrDefault(z => (string)z.Attribute(W.type) == hf.Type); if (referenceElement != null) hf.CachedPartRid = (string)referenceElement.Attribute(R.id); } firstSection = false; continue; } else { CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.headerReference, "first"); CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.headerReference, "even"); CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.headerReference, "default"); CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.footerReference, "first"); CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.footerReference, "even"); CopyOrCacheHeaderOrFooter(output, cachedHeaderFooter, sect, W.footerReference, "default"); } } } } foreach (var part in output.GetAllParts()) if (part.Annotation<XDocument>() != null) part.PutXDocument(); }
public static IEnumerable<ValidationErrorInfo> GetOpenXmlValidationErrors(string fileName, string officeVersion) { #if !NET35 FileFormatVersions fileFormatVersion = FileFormatVersions.Office2013; #else FileFormatVersions fileFormatVersion = FileFormatVersions.Office2010; #endif try { fileFormatVersion = (FileFormatVersions)Enum.Parse(fileFormatVersion.GetType(), officeVersion); } catch (Exception) { #if !NET35 fileFormatVersion = FileFormatVersions.Office2013; #else fileFormatVersion = FileFormatVersions.Office2010; #endif } FileInfo fi = new FileInfo(fileName); if (Util.IsWordprocessingML(fi.Extension)) { WmlDocument wml = new WmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wml)) using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return errors.ToList(); } } else if (Util.IsSpreadsheetML(fi.Extension)) { SmlDocument Sml = new SmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Sml)) using (SpreadsheetDocument wDoc = streamDoc.GetSpreadsheetDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return errors.ToList(); } } else if (Util.IsPresentationML(fi.Extension)) { PmlDocument Pml = new PmlDocument(fileName); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Pml)) using (PresentationDocument wDoc = streamDoc.GetPresentationDocument()) { OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion); var errors = validator.Validate(wDoc); return errors.ToList(); } } return Enumerable.Empty<ValidationErrorInfo>(); }
private static WmlDocument AdjustSectionBreak(WmlDocument doc) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (WordprocessingDocument document = streamDoc.GetWordprocessingDocument()) { XDocument mainXDoc = document.MainDocumentPart.GetXDocument(); XElement lastElement = mainXDoc.Root .Element(W.body) .Elements() .LastOrDefault(); if (lastElement != null) { if (lastElement.Name != W.sectPr && lastElement.Descendants(W.sectPr).Any()) { mainXDoc.Root.Element(W.body).Add(lastElement.Descendants(W.sectPr).First()); lastElement.Descendants(W.sectPr).Remove(); if (!lastElement.Elements() .Where(e => e.Name != W.pPr) .Any()) lastElement.Remove(); document.MainDocumentPart.PutXDocument(); } } } return streamDoc.GetModifiedWmlDocument(); } }
public static WmlDocument AppendParagraphToDocument( WmlDocument wmlDoc, string strParagraph, bool isBold, bool isItalic, bool isUnderline, string foreColor, string backColor, string styleName) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wmlDoc)) { using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument()) { StyleDefinitionsPart part = wDoc.MainDocumentPart.StyleDefinitionsPart; Body body = wDoc.MainDocumentPart.Document.Body; SectionProperties sectionProperties = body.Elements<SectionProperties>().FirstOrDefault(); Paragraph paragraph = new Paragraph(); Run run = paragraph.AppendChild(new Run()); RunProperties runProperties = new RunProperties(); if (isBold) runProperties.AppendChild(new Bold()); if (isItalic) runProperties.AppendChild(new Italic()); if (!string.IsNullOrEmpty(foreColor)) { int colorValue = System.Drawing.Color.FromName(foreColor).ToArgb(); if (colorValue == 0) throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor)); string ColorHex = string.Format("{0:x6}", colorValue); runProperties.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = ColorHex.Substring(2) }); } if (isUnderline) runProperties.AppendChild(new Underline() { Val = UnderlineValues.Single }); if (!string.IsNullOrEmpty(backColor)) { int colorShade = System.Drawing.Color.FromName(backColor).ToArgb(); if (colorShade == 0) throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor)); string ColorShadeHex = string.Format("{0:x6}", colorShade); runProperties.AppendChild(new Shading() { Fill = ColorShadeHex.Substring(2), Val = ShadingPatternValues.Clear }); } if (!string.IsNullOrEmpty(styleName)) { Style style = part.Styles.Elements<Style>().Where(s => s.StyleId == styleName).FirstOrDefault(); //if the specified style is not present in word document add it if (style == null) { using (MemoryStream memoryStream = new MemoryStream()) { #region Default.dotx Template has been used to get all the paragraph styles string base64 = @"UEsDBBQABgAIAAAAIQDTMB8uXgEAACAFAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbLSUy27CMBBF 95X6D5G3VWLooqoqAos+li1S6QcYewJW/ZI9vP6+EwKoqiCRCmwiJTP33jNWxoPR2ppsCTFp70rW L3osAye90m5Wsq/JW/7IsoTCKWG8g5JtILHR8PZmMNkESBmpXSrZHDE8cZ7kHKxIhQ/gqFL5aAXS a5zxIOS3mAG/7/UeuPQOwWGOtQcbDl6gEguD2euaPjckEUxi2XPTWGeVTIRgtBRIdb506k9Kvkso SLntSXMd0h01MH40oa6cDtjpPuhoolaQjUXEd2Gpi698VFx5ubCkLNptjnD6qtISDvraLUQvISU6 c2sKBBtoAiis0G7Pf5Ij4cZAujxF49sdD4gkuAbAzrkTYQXTz6tR/DLvBKkodyKmBi6PcbDuhEDa QGie/bM5tjZtkdQ5jj4k2uj4j7H3K1urcxo4QETd/tcdEsn67Pmgvg0UqCPZfHu/DX8AAAD//wMA UEsDBBQABgAIAAAAIQAekRq37wAAAE4CAAALAAAAX3JlbHMvLnJlbHOsksFqwzAMQO+D/YPRvVHa wRijTi9j0NsY2QcIW0lME9vYatf+/TzY2AJd6WFHy9LTk9B6c5xGdeCUXfAallUNir0J1vlew1v7 vHgAlYW8pTF41nDiDJvm9mb9yiNJKcqDi1kVis8aBpH4iJjNwBPlKkT25acLaSIpz9RjJLOjnnFV 1/eYfjOgmTHV1mpIW3sHqj1FvoYdus4ZfgpmP7GXMy2Qj8Lesl3EVOqTuDKNain1LBpsMC8lnJFi rAoa8LzR6nqjv6fFiYUsCaEJiS/7fGZcElr+54rmGT827yFZtF/hbxucXUHzAQAA//8DAFBLAwQU AAYACADRagZB/Fz9fNYBAAALAwAAEAAAAGRvY1Byb3BzL2FwcC54bWztvQdgHEmWJSYvbcp7f0r1 StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n 99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J5 8dlH6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0OFs9ellXq7xui7xJCcayeXTZfvbRvG1Xj+7ebabz fJE1Y2qxpC/Pq3qRtfRnfXG3Oj8vpvnTarpe5Mv27t7Ozqd3Z9UU0JqffHO9IvgKL1t9XXj5uzZf zvLZ9sri+BHj/CZfrMqszY8e3w3+wh9Vm5VvikV+tCNf2r95sNlF3hzt8jfyOz79blXPGm0vv+PT k3lWZ9OWaKpfeR/g++PVqiymWUsUP/qimNZVU5236Zc8jhRg+CW/Fd6iEb7Op+u6aK8VrP8JWjwv lrnpUn4XzOvsos5Wc/OV9wG+fz3NyvyE6HR0npVNzk3cZwr3bfPV6k31FLRyrcLPw5F/t2jnr1fZ 1CIU/Yr7py/yGY3F799+hhbfJqaoS3RGQJYX+cxr2f9OKfyTwtJHu/fHO/QYkpqPhRKWO47+H1BL AwQUAAYACADRagZBUsP9QroBAABvAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1s7b0HYBxJliUmL23K e39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6 O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iHv8e7xZlepnXTVEtP/tod7zzUZovp9WsWF58 9tFXb55tH3yUNm22nGVltcw/++g6bz76PY6Sx9PVo2lV5y/rapXXbZE3KQFaNo+mq88+mrft6tHd u810ni+yZkwtlvTleVUvspb+rC/urrLp2+wiv7u3s/Pp3UXeZrOsze4C4PbKQvxIQc6mFuRqXZcM YDa9m5f5Il+2zd3d8e5d17bN60UTfYG/8VouivZ6lUebmi9t63dNYRteXV2Nr+5xU8J/9+7v/cXz 1zzU7WIJUk3zj44ez6aPpnWetVV9dJIVbVks0+NmXubX26+qslxky8d3vSYgZ5k17RdE+PMinz25 vsuf1fllgZk52n181//zsY5TAOSzlPB7JKMx33z33snTN88+Otrb2d3b3nmwvXf/ze6DR3v3H+3s /BT6Dt53ABeKwW0g3nuzt/tovwPRADhijEMeOfp/AFBLAwQUAAYACAAAACEA1mSzUfQAAAAxAwAA HAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHOskstqwzAQRfeF/oOYfS07fVBC5GxKIdvW /QBFHj+oLAnN9OG/r0hJ69BguvByrphzz4A228/BineM1HunoMhyEOiMr3vXKnipHq/uQRBrV2vr HSoYkWBbXl5sntBqTkvU9YFEojhS0DGHtZRkOhw0ZT6gSy+Nj4PmNMZWBm1edYtyled3Mk4ZUJ4w xa5WEHf1NYhqDPgftm+a3uCDN28DOj5TIT9w/4zM6ThKWB1bZAWTMEtEkOdFVkuK0B+LYzKnUCyq wKPFqcBhnqu/XbKe0y7+th/G77CYc7hZ0qHxjiu9txOPn+goIU8+evkFAAD//wMAUEsDBBQABgAI ANFqBkF65TN3MwIAAJAFAAARAAAAd29yZC9kb2N1bWVudC54bWztvQdgHEmWJSYvbcp7f0r1Stfg dKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99// P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J58dlH 6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0+OrRrJquF/myTQnAsnl0tZp+9tG8bVeP7t5tpvN8kTXj RTGtq6Y6b8fTanG3Oj8vpvndq6qe3d3b2d3h31Z1Nc2bhno7yZaXWfORglv0oVWrfElfnlf1Imvp z/ri7iKr365X2wR9lbXFpCiL9ppg73xqwFQ0hnr5SEFsW4TwyiNBSH+YN+rb9CuvPFUKcI9367wk HKplMy9WbhhfFxp9OTdALjcN4nJRmnZXq939D5uDp3V2RT8cwNugP5OXFqVgvhni7s4tZgQg7Bu3 QSHs02CyyIql6/hrkcYj7u799wOw1wWwung/AN3J+byu1isHrfgwaGfLtxYW5Po9YOkk+0Nr3gtA D5nX82xFEriYPjq7WFZ1NikJI5qylKiegq0/gsaZVLNr/Fyld/Gjyafty5o/uHj9g/QKrLK7t7dP Guzq0Zx+v3+A3+9Kiy+ymj5uK2Lp3X1pUxcX89b9Oanatlq4v8v83Pt2nmeznJTDgz3+87yqWu/P i3XLf5r+plXZ0MfNKpvm2og+v+uQvmuGc9dp0qP/B1BLAwQUAAYACADRagZB3iZxVZoCAAAzBwAA EgAAAHdvcmQvZm9udFRhYmxlLnhtbO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3m kuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrI Hz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KO0abPlLCurZf7Z R9d589HvcfT46tF5tWyblN5eNo8W088+mrft6tHdu810ni+yZlyt8iV9eV7Vi6ylP+uLu4usfrte bU+rxSpri0lRFu313b2dnU8/UjD1baBU5+fFNH9aTdeLfNny+3frvCSI1bKZF6vGQLu6DbSrqp6t 6mqaNw2NeFEKvEVWLC2Y3f0eoEUxraumOm/HNBjFiEHR67s7/NuidADuvx+APQtgMX10drGs6mxS EukJk5SAfWSon149WmYL+uIkK4tJXfAXq2xZNfkufXeZlZ99tLO382znPv2L//Z37uHfj9K7aDmd Z3WTt7bljn5+ni2K8tp83FwVTaPfrIp2OjdfXGZ1Abz0u6a4oG/WzWTns49Od+jZe/bsI/lk97OP 9umD4xP7yR6642dXP7lnP9nBJ1OGIy0ePtNPdv021OldIUOPHK+Lxev1kqmRle0L+szg/J//DX/s f/b3/6lmND1K7e58SrDv0U/9L06pg0+jlMrWbfWehNLR3HOE2js4eGaI4BNq99MbCAUK774noY4J sXKAa54QLfaVb/Z+aFyzd+xzzQl98uBg35DHcc3Dm7nm2ftyjQpR+ry4mLeDonTPkOOHJErHwHvv tCNKezsPnvSIYnhmmCg77y1Kb4pF3qQv8qv0VbXIlgNk2SNeuUdaZp81zb33JEvNkN+PLD9sXtFf mqP/B1BLAwQUAAQACADRagZBhoJdSR0EAAB5CQAAEQAAAHdvcmQvc2V0dGluZ3MueG1s7b0HYBxJ liUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z2899577733 3nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8i/se/9x98/Hu8W5TpZV43RbX87KPd 8c5Hab6cVrNiefHZR+v2fPvgo7Rps+UsK6tl/tlH13nz0e9x9PjqUZO3LTVqUgKwbB4tpp99NG/b 1aO7d5vpPF9kzbha5Uv68ryqF1lLf9YXdxdZ/Xa92p5Wi1XWFpOiLNrru3s7O59+pGAq6rRePlIQ 24tiWldNdd7ilUfV+XkxzfWHeaO+Tb/yytNqul7ky5Z7vFvnJeFQLZt5sWoMtMXXhUZfzg2Qy02D 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 AAsACwDBAgAAbCwAAAAA"; #endregion char[] base64CharArray = base64.Where(c => c != '\r' && c != '\n').ToArray(); byte[] byteArray = System.Convert.FromBase64CharArray(base64CharArray, 0, base64CharArray.Length); memoryStream.Write(byteArray, 0, byteArray.Length); using (WordprocessingDocument defaultDotx = WordprocessingDocument.Open(memoryStream, true)) { //Get the specified style from Default.dotx template for paragraph Style templateStyle = defaultDotx.MainDocumentPart.StyleDefinitionsPart.Styles.Elements<Style>().Where(s => s.StyleId == styleName && s.Type == StyleValues.Paragraph).FirstOrDefault(); //Check if the style is proper style. Ex, Heading1, Heading2 if (templateStyle == null) throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified style name {0} is unsupported, Please specify the valid style. Ex, Heading1, Heading2, Title", styleName)); else part.Styles.Append((templateStyle.CloneNode(true))); } } } paragraph.ParagraphProperties = new ParagraphProperties(new ParagraphStyleId() { Val = styleName }); } run.AppendChild(runProperties); run.AppendChild(new Text(strParagraph)); if (sectionProperties != null) body.InsertBefore(paragraph, sectionProperties); else body.AppendChild(paragraph); } return streamDoc.GetModifiedWmlDocument(); } }
public static WmlDocument MergeComments(WmlDocument document1, WmlDocument document2, bool ensureLocked) { WmlDocument cDoc1 = new WmlDocument(document1); WmlDocument cDoc2 = new WmlDocument(document2); using (OpenXmlMemoryStreamDocument streamDoc1 = new OpenXmlMemoryStreamDocument(cDoc1)) using (WordprocessingDocument doc1 = streamDoc1.GetWordprocessingDocument()) using (OpenXmlMemoryStreamDocument streamDoc2 = new OpenXmlMemoryStreamDocument(cDoc2)) using (WordprocessingDocument doc2 = streamDoc2.GetWordprocessingDocument()) { SimplifyMarkupSettings mss = new SimplifyMarkupSettings() { RemoveProof = true, RemoveRsidInfo = true, RemoveGoBackBookmark = true, }; MarkupSimplifier.SimplifyMarkup(doc1, mss); MarkupSimplifier.SimplifyMarkup(doc2, mss); // If documents don't contain the same content, then don't attempt to merge comments. bool same = DocumentComparer.CompareDocuments(doc1, doc2); if (!same) throw new CommentMergerDifferingContentsException( "Documents do not contain the same content"); if (doc1.MainDocumentPart.WordprocessingCommentsPart == null && doc2.MainDocumentPart.WordprocessingCommentsPart == null) return new WmlDocument(document1); if (doc1.MainDocumentPart.WordprocessingCommentsPart != null && doc2.MainDocumentPart.WordprocessingCommentsPart == null) return new WmlDocument(document1); if (doc1.MainDocumentPart.WordprocessingCommentsPart == null && doc2.MainDocumentPart.WordprocessingCommentsPart != null) return new WmlDocument(document2); // If either of the documents have no comments, then return the other one. if (! doc1.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root .Elements(W.comment).Any()) return new WmlDocument(document2); if (! doc2.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root .Elements(W.comment).Any()) return new WmlDocument(document1); if (ensureLocked) { // If either document is not locked (allowing only commenting), don't attempt to // merge comments. if (doc1.ExtendedFilePropertiesPart.GetXDocument().Root .Element(EP.DocSecurity).Value != "8") throw new CommentMergerUnlockedDocumentException( "Document1 is not locked"); if (doc2.ExtendedFilePropertiesPart.GetXDocument().Root .Element(EP.DocSecurity).Value != "8") throw new CommentMergerUnlockedDocumentException( "Document2 is not locked"); } RenumberCommentsInDoc2(doc1, doc2); WmlDocument destDoc = new WmlDocument(document1); using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(destDoc)) { using (WordprocessingDocument destWDoc = streamDoc.GetWordprocessingDocument()) { // Merge the comments part. XDocument commentsPartXDoc = new XDocument( new XElement(W.comments, new XAttribute(XNamespace.Xmlns + "w", W.w), doc1.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root.Elements(), doc2.MainDocumentPart.WordprocessingCommentsPart.GetXDocument().Root.Elements())); destWDoc.MainDocumentPart.WordprocessingCommentsPart.PutXDocument(commentsPartXDoc); MergeCommentsInPart(doc1.MainDocumentPart, doc2.MainDocumentPart, destWDoc.MainDocumentPart, commentsPartXDoc); } return streamDoc.GetModifiedWmlDocument(); } } }
/// <summary> /// Gets the document theme /// </summary> public static OpenXmlPowerToolsDocument GetTheme(WmlDocument doc) { using (OpenXmlMemoryStreamDocument sourceStreamDoc = new OpenXmlMemoryStreamDocument(doc)) using (WordprocessingDocument document = sourceStreamDoc.GetWordprocessingDocument()) { // Loads the theme part main file ThemePart theme = document.MainDocumentPart.ThemePart; if (theme != null) { XDocument themeDocument = theme.GetXDocument(); // Creates the theme package (thmx file) using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreatePackage()) { using (Package themePackage = streamDoc.GetPackage()) { // Creates the theme manager part on the new package and loads default content PackagePart newThemeManagerPart = themePackage.CreatePart(new Uri("/theme/theme/themeManager.xml", UriKind.RelativeOrAbsolute), "application/vnd.openxmlformats-officedocument.themeManager+xml"); themePackage.CreateRelationship(newThemeManagerPart.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); using (XmlWriter xWriter = XmlWriter.Create(newThemeManagerPart.GetStream(FileMode.Create, FileAccess.Write))) { CreateEmptyThemeManager().WriteTo(xWriter); xWriter.Flush(); } // Creates the main theme part PackagePart newThemePart = themePackage.CreatePart(new Uri("/theme/theme/" + theme.Uri.OriginalString.Substring(theme.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), theme.ContentType); newThemeManagerPart.CreateRelationship(newThemePart.Uri, TargetMode.Internal, theme.RelationshipType); // Gets embeded part references var embeddedItems = themeDocument .Descendants() .Attributes(relationshipns + "embed"); foreach (IdPartPair partId in theme.Parts) { OpenXmlPart part = partId.OpenXmlPart; // Creates the new media part inside the destination package PackagePart newPart = themePackage.CreatePart(new Uri("/theme/media/" + part.Uri.OriginalString.Substring(part.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), part.ContentType); PackageRelationship relationship = newThemePart.CreateRelationship(newPart.Uri, TargetMode.Internal, part.RelationshipType); // Copies binary content from original part to destination part Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read); Stream newPartStream = newPart.GetStream(FileMode.Create, FileAccess.Write); byte[] fileContent = new byte[partStream.Length]; partStream.Read(fileContent, 0, (int)partStream.Length); newPartStream.Write(fileContent, 0, (int)partStream.Length); newPartStream.Flush(); // Replaces old embed part reference with the freshly created one XAttribute relationshipAttribute = embeddedItems.FirstOrDefault(e => e.Value == theme.GetIdOfPart(part)); if (relationshipAttribute != null) { relationshipAttribute.Value = relationship.Id; } } // Writes the updated theme XDocument into the destination package using (XmlWriter newThemeWriter = XmlWriter.Create(newThemePart.GetStream(FileMode.Create, FileAccess.Write))) themeDocument.WriteTo(newThemeWriter); } return(streamDoc.GetModifiedDocument()); } } return(null); } }