Hi,
How can we append comments while find and replace operation?
Hi,
How can we append comments while find and replace operation?
Please compress the following resources into ZIP format and attach the .zip file here for testing:
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.
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;
}
}