Hi there,
Thanks for your patience.
You can achieve your requirement by implementing
IReplacingCallback interface.
Please use the same approach shared at following documentation link to
find text and insert the { QUOTE 34 } field. See the highlighted code snippet
below.
You can use the same approach to replace “ and ” with { QUOTE 34 } in whole document. Hope this helps you.
Hope this helps you. Please let us know if you have any more queries.
private void ProcessItem(string
fieldCode, Field field, object fieldValue)
{
if
(fieldCode.ToLowerInvariant().Contains("html"))
{
Node
fieldNode = field.Remove();
Builder.MoveTo(fieldNode);
String html = fieldValue.ToString();
if (html.Contains("“"))
{
html = html.Replace("“", "QUOTE34").Replace("”", "QUOTE34");
;
}
Builder.InsertHtml(html);
Regex regex = new Regex("QUOTE34", RegexOptions.IgnoreCase);
Builder.Document.Range.Replace(regex, new
FindandInsertField(), false);
}
public class FindandInsertField
: 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 highlighting.
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);
}
// Create
Document Buidler aond insert MergeField
DocumentBuilder
builder = new DocumentBuilder(e.MatchNode.Document
as Document);
builder.MoveTo((Run)runs[runs.Count
- 1]);
Field
field = builder.InsertField("QUOTE 34");
builder.Write(" ");
field.Update();
foreach
(Run run in
runs)
run.Remove();
// Signal
to the replace engine to do nothing because we have already done all what we
wanted.
return
ReplaceAction.Skip;
}
///
/// Splits text of the specified run into two runs.
/// Inserts the new run just after the specified run.
///
private
static Run
SplitRun(Run run, int
position)
{
Run
afterRun = (Run)run.Clone(true);
afterRun.Text =
run.Text.Substring(position);
run.Text = run.Text.Substring(0,
position);
run.ParentNode.InsertAfter(afterRun, run);
return
afterRun;
}
}