Append Comments while Find and Replace in Word Document | C# .NET

Hi,

How can we append comments while find and replace operation?

@kkumaranil485,

Please compress the following resources into ZIP format and attach the .zip file here for testing:

  • A simplified source Word document
  • Your expected DOCX file showing the desired output. You can create this output file manually by using MS Word.

As soon as you get these pieces of information ready, we will then start further investigation into your particular scenario and provide you code to achieve the same expected output by using Aspose.Words.

Hi,

PFA of docs expectedOutputdoc.zip (13.3 KB)

@kkumaranil485,

Please see these input/output Word DOCX files (samples.zip (19.9 KB)) and try running the following code:

Document doc = new Document("C:\\Temp\\expectedOutputdoc\\input.docx");

doc.StartTrackRevisions("Awais");

FindReplaceOptions opts = new FindReplaceOptions();
opts.ReplacingCallback = new FindReplaceHandler();
doc.Range.Replace("year", "Year", opts);

doc.StopTrackRevisions();

doc.Save("C:\\Temp\\expectedOutputdoc\\21.9.docx");

private class FindReplaceHandler : IReplacingCallback
{
    ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e)
    {
        // This is a Run node that contains either the beginning or the complete match.
        Node currentNode = e.MatchNode;

        // The first (and may be the only) run can contain text before the match,
        // in this case it is necessary to split the run.
        if (e.MatchOffset > 0)
            currentNode = SplitRun((Run)currentNode, e.MatchOffset);

        // This array is used to store all nodes of the match for further removing.
        ArrayList runs = new ArrayList();

        // Find all runs that contain parts of the match string.
        int remainingLength = e.Match.Value.Length;
        while (
            (remainingLength > 0) &&
            (currentNode != null) &&
            (currentNode.GetText().Length <= remainingLength))
        {
            runs.Add(currentNode);
            remainingLength = remainingLength - currentNode.GetText().Length;

            // Select the next Run node.
            // Have to loop because there could be other nodes such as BookmarkStart etc.
            do
            {
                currentNode = currentNode.NextSibling;
            }
            while ((currentNode != null) && (currentNode.NodeType != NodeType.Run));
        }

        // Split the last run that contains the match if there is any text left.
        if ((currentNode != null) && (remainingLength > 0))
        {
            SplitRun((Run)currentNode, remainingLength);
            runs.Add(currentNode);
        }


        Document doc = (Document)e.MatchNode.Document;

        Run startRun = (Run)runs[0];
        Run endRun = (Run)runs[runs.Count - 1];

        Comment comment = new Comment(doc, "Awais Hafeez", "AH", DateTime.Today);
        comment.Paragraphs.Add(new Paragraph(doc));
        comment.FirstParagraph.Runs.Add(new Run(doc, "This text is Capitalized from " + e.Match.Value + " to " + e.Replacement + "."));

        CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.Id);
        CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.Id);

        startRun.ParentParagraph.InsertBefore(commentRangeStart, startRun);
        endRun.ParentParagraph.InsertAfter(commentRangeEnd, endRun);
        commentRangeEnd.ParentNode.InsertAfter(comment, commentRangeEnd);


        return ReplaceAction.Replace;
    }

    private static Run SplitRun(Run run, int position)
    {
        ((Document)run.Document).StopTrackRevisions();
        Run afterRun = (Run)run.Clone(true);
        afterRun.Text = run.Text.Substring(position);
        run.Text = run.Text.Substring((0), (0) + (position));
        run.ParentNode.InsertAfter(afterRun, run);
        ((Document)run.Document).StartTrackRevisions("Awais");
        return afterRun;
    }
}