FormFields to mergeFields


#1

I was trying to change formfields to mergeFields. The problem was, how to set cursor near the formfield i am currently trying to change.
In help i found: Note that some bookmarks in the document are assigned to form fields. Moving to
such a bookmark and inserting text there inserts the text into the form field
code.

According to text found in help it can not be done but i still managed to do it with the following code:
dF = all form fields
builder.MoveToBookmark(dF[0].Name, false, false);
builder.InsertField(“MERGEFIELD " + dF[0].Name + @” * MERGEFORMAT", “a”);
doc.Range.FormFields.Remove(dF[0]);

is the code correct?


#2

I would rather suggest using the following code:

string filename1 = Application.StartupPath + @"\TestReplaceFormFieldsWithMergeFields.doc";

string filename2 = Application.StartupPath + @"\TestReplaceFormFieldsWithMergeFields Out.doc";

Document doc = new Document(filename1);

DocumentBuilder builder = new DocumentBuilder(doc);

// Collect all FormField names.

ArrayList formFieldNames = new ArrayList();

foreach (FormField formField in doc.Range.FormFields)

{

formFieldNames.Add(formField.Name);

}

// Iterate through all bookmarks

foreach (Bookmark bookmark in doc.Range.Bookmarks)

{

foreach (string formFieldName in formFieldNames)

{

// If bookmark corresponds to a FormField

if (bookmark.Name == formFieldName)

{

// Remove FormField and insert merge field with the same name instead.

doc.Range.FormFields.Remove(formFieldName);

builder.MoveToBookmark(bookmark.Name);

builder.InsertField("MERGEFIELD " + formFieldName + @" \* MERGEFORMAT", string.Format("«{0}»", formFieldName));

break;

}

}

}

// Remove bookmarks corresponding to former formfields (not (eally necessary, just for aesthetic purposes).

foreach (string formFieldName in formFieldNames)

{

doc.Range.Bookmarks[formFieldName].Remove();

}

// Save resulting document.

doc.Save(filename2);

// Open saved document in MS Word.

System.Diagnostics.Process.Start(filename2);

Best regards,


#3

The code works fine, theresult is the same, when comparing with my old code (ok, i believe this code is better) but one problem still remains. Some formfields still don’t want to change. I noticed that if i open my template in word an then edit/goto/bookmarks, there are some bookmarks missing. There is a formfield but no bookmark with this name and this formfields are exactly those, which do not want to change to mergefield. If I double-click on each of those formfields and clik ok, then bookmark begins to exists.
any solution (i have too many documents to fix them manualy)?


#4

Please provide the sample document. I will check what could be done.


#5

I reduced size of the document. In this document the problem is with the PP_KRAJ and PP_POSTA. If you open the document, you will notice that there is no bookmark for them. If you try Edit/Goto/bookmark they are not listed. If you double-click on each of them and then clik ok, bookmark starts to exist.


#6

The code for that one gets much trickier. Although there is little that Aspose.Words cannot handle.Smile [:)]

string filename1 = Application.StartupPath + @"NP3.dot";

string filename2 = Application.StartupPath + @"NP3 Out.dot";

Document doc = new Document(filename1);

DocumentBuilder builder = new DocumentBuilder(doc);

// Collect all formfields.

ArrayList formFields = new ArrayList();

foreach (FormField formField in doc.Range.FormFields)

{

formFields.Add(formField);

}

// Iterate through formfield collection.

foreach (FormField formField in formFields)

{

Node node = formField;

while (node != null)

{

// seek field end for this formfield

if (node.NodeType == NodeType.FieldEnd)

{

// DocumentBuilder.InsertField method inserts field BEFORE the DocumentBuilder.CurrentNode.

// So to insert merge field field AFTER formfield we need inserting and moving to a dummy node (empty run).

// create dummy node

Run emptyRun = new Run(doc, "");

// insert it after formfield end

node.ParentNode.InsertAfter(emptyRun, node);

// position DocumentBuilder before dummy node.

builder.MoveTo(emptyRun);

// insert merge field

builder.InsertField("MERGEFIELD " + formField.Name + @" \* MERGEFORMAT", string.Format("«{0}»", formField.Name));

// remove dummy node as we don't need it anymore

emptyRun.Remove();

// remove formfield

doc.Range.FormFields.Remove(formField);

// remove bookmark for this formfield (if it exists)

if (doc.Range.Bookmarks[formField.Name] != null)

doc.Range.Bookmarks[formField.Name].Remove();

// exit while

break;

}

node = node.NextSibling;

}

}

// Save resulting document.

doc.Save(filename2);

// Open saved document in MS Word.

System.Diagnostics.Process.Start(filename2);


#7

THANK YOU!!!