//
// This code is part of Document Solutions for Word demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using GrapeCity.Documents.Word;
namespace DsWordWeb.Demos
{
// NOTE: this sample is obsolete, use the RangeBase.Replace()
// extension method instead (see ReplaceTextFmt).
//
// This sample loads an existing document, finds all occurrences
// of a certain string in it, and replaces that string with another one,
// also changing the character format of the replacement string.
// This sample is almost identical to ReplaceTextFmt
// but uses PersistentRange instead of Range.
// Its primary purpose is to illustrate the differences between
// Range and PersistentRange.
public class ReplaceTextFmt2
{
public GcWordDocument CreateDocx()
{
// The document to replace text in:
var path = Path.Combine("Resources", "WordDocs", "JsFrameworkExcerpt.docx");
// The text to find:
const string tFind = "javascript";
// The replacement:
const string tRepl = "ArabicaScroll";
var doc = new GcWordDocument();
doc.Load(path);
var runs = doc.Body.Runs;
List<PersistentRange> runRanges = new List<PersistentRange>(runs.Count);
foreach (var run in runs)
runRanges.Add(run.GetPersistentRange());
foreach (var rr in runRanges)
{
var str = rr.Text;
var matches = Regex.Matches(str, tFind, RegexOptions.IgnoreCase);
if (matches.Count == 0)
continue;
var color = rr.ParentRun.Font.Color.RGB;
rr.Clear();
var pos = 0;
foreach (Match m in matches)
{
rr.Runs.Add(str.Substring(pos, m.Index - pos)).Font.Color.RGB = color;
rr.Runs.Add(tRepl).Font.Color.RGB = Color.Red;
pos = m.Index + m.Length;
}
rr.Runs.Add(str.Substring(pos)).Font.Color.RGB = color;
if (!string.IsNullOrEmpty(rr.Runs.First.GetRange().Text))
throw new Exception("Unexpected");
rr.Runs.First.Delete();
// PersistentRange is kept up to date when the document changes,
// so it should be disposed when no longer needed to improve
// performance and reduce memory consumption:
rr.Dispose();
}
// Not strictky necessary but a good practice:
runRanges.Clear();
// Add a note at the end of the document:
doc.Body.Sections.Last.GetRange().Paragraphs.Add(
$"DsWord replaced '{tFind}' with '{tRepl}' on {Util.TimeNow():r)}.");
// Done:
return doc;
}
}
}