Wiki
Clone wikiAspose for OpenXML / Insert a comment into a word processing document
OpenXML SDK
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; namespace OpenXML_SDK { class Program { static void Main(string[] args) { AddCommentOnFirstParagraph("Insert a Comment in Word Processing document.docx", "author", "initials", "This is my comment."); } // Insert a comment on the first paragraph. public static void AddCommentOnFirstParagraph(string fileName, string author, string initials, string comment) { // Use the file name and path passed in as an // argument to open an existing Wordprocessing document. using (WordprocessingDocument document = WordprocessingDocument.Open(fileName, true)) { // Locate the first paragraph in the document. Paragraph firstParagraph = document.MainDocumentPart.Document.Descendants<Paragraph>().First(); Comments comments = null; string id = "0"; // Verify that the document contains a // WordProcessingCommentsPart part; if not, add a new one. if (document.MainDocumentPart.GetPartsCountOfType<WordprocessingCommentsPart>() > 0) { comments = document.MainDocumentPart.WordprocessingCommentsPart.Comments; if (comments.HasChildren) { // Obtain an unused ID. id = comments.Descendants<Comment>().Select(e => e.Id.Value).Max(); } } else { // No WordprocessingCommentsPart part exists, so add one to the package. WordprocessingCommentsPart commentPart = document.MainDocumentPart.AddNewPart<WordprocessingCommentsPart>(); commentPart.Comments = new Comments(); comments = commentPart.Comments; } // Compose a new Comment and add it to the Comments part. Paragraph p = new Paragraph(new Run(new Text(comment))); Comment cmt = new Comment() { Id = id, Author = author, Initials = initials, Date = DateTime.Now }; cmt.AppendChild(p); comments.AppendChild(cmt); comments.Save(); // Specify the text range for the Comment. // Insert the new CommentRangeStart before the first run of paragraph. firstParagraph.InsertBefore(new CommentRangeStart() { Id = id }, firstParagraph.GetFirstChild<Run>()); // Insert the new CommentRangeEnd after last run of paragraph. var cmtEnd = firstParagraph.InsertAfter(new CommentRangeEnd() { Id = id }, firstParagraph.Elements<Run>().Last()); // Compose a run with CommentReference and insert it. firstParagraph.InsertAfter(new Run(new CommentReference() { Id = id }), cmtEnd); } } } }
Aspose.Words
using Aspose.Words; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Aspose_Word { class Program { static void Main(string[] args) { // Create an empty document and DocumentBuilder object. Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); // Create a Comment. Comment comment = new Comment(doc); // Insert some text into the comment. Paragraph commentParagraph = new Paragraph(doc); commentParagraph.AppendChild(new Run(doc, "This is comment!!!")); comment.AppendChild(commentParagraph); // Create CommentRangeStart and CommentRangeEnd. int commentId = 0; CommentRangeStart start = new CommentRangeStart(doc, commentId); CommentRangeEnd end = new CommentRangeEnd(doc, commentId); // Insert some text into the document. builder.Write("This is text before comment "); // Insert comment and comment range start. builder.InsertNode(comment); builder.InsertNode(start); // Insert some more text. builder.Write("This is commented text "); // Insert end of comment range. builder.InsertNode(end); // And finaly insert some more text. builder.Write("This is text aftr comment"); // Save output document. doc.Save("Insert a Comment in Word Processing document.docx"); } } }
Download
Updated