I am using example from Range.replace question But I still loose all the original doc formatting…
My code is like:
Document efDoc = new Document(filename);
ReplaceEvaluator RE = new ReplaceEvaluator(ReplaceEvaluator);
efDoc.Range.Replace(new Regex(@"[PATIENTFIRST]"), RE, false);
…
dr.Document = efDoc;
dr.PrinterSettings.PrinterName = printerName;
dr.Print();
private ReplaceAction ReplaceEvaluator(object sender, ReplaceEvaluatorArgs args)
{
DocumentBuilder builder = new DocumentBuilder(args.MatchNode.Document);
builder.MoveTo(args.MatchNode);
DataRowView row2 = (DataRowView)PatientbindingSource.Current;
String RepValue = "";
// MessageBox.Show(args.Match.Value.ToString());
switch (args.Match.Value.ToString())
{
case "[PATIENTFIRST]":
RepValue = row2["FirstName"].ToString();
break;
// ...
}
SplitRun(builder, args.MatchOffset, args.Match.Value.Length, RepValue);
return ReplaceAction.Skip;
}
private void SplitRun(DocumentBuilder builder, int offset, int length, string replacement)
{
Run firstRun = (Run)builder.CurrentNode;
Run prevRun = new Run(firstRun.Document, firstRun.Text.Substring(0, offset));
int total;
ArrayList runs = GetRunsToRemove(firstRun, length, out total);
Run lastRun = (Run)runs[runs.Count - 1];
int lastRunLength = lastRun.Text.Length;
int lastRunOffset = (offset + length) - (total - lastRunLength);
Run nextRun = new Run(lastRun.Document, lastRun.Text.Substring(lastRunOffset, lastRunLength - lastRunOffset));
builder.InsertNode(prevRun);
// builder.Font.HighlightColor = Color.Red;
builder.Write(replacement);
builder.MoveTo(lastRun);
builder.InsertNode(nextRun);
foreach (Run run in runs)
run.Remove();
}
private ArrayList GetRunsToRemove(Run firstRun, int matchLength, out int total)
{
total = 0;
Run run = firstRun;
ArrayList runs = new ArrayList();
while (total < matchLength)
{
total += run.Text.Length;
runs.Add(run);
run = (Run)run.NextSibling;
}
return runs;
}
attached is word doc. Most important it looses the blank lines?