Hi,
I’m using the technique explained in the https://docs.aspose.com/words/net/updating-and-removing-a-field/ url, to convert fields of a particular type to static text.
That technique produce an Object reference not set to an instance of an object Error, when the Field of a particular type has not a FieldSeparator.
The ReplaceFields.doc attached file was used for my test scenario. It contains 2 fields : one for FieldIf type and another one for FieldListNum type
Error only occured when converting field of FieldListNum Type because there is no FieldSeparator for field
vb.net
code used
Dim doc As New Document(dataDir & "ReplaceFields.doc")
FieldsHelper.ConvertFieldsToStaticText(doc, FieldType.FieldIf)
FieldsHelper.ConvertFieldsToStaticText(doc, FieldType.FieldListNum)
doc.Save(dataDir & "ReplaceFields.doc")
the FieldsHelper Class can be found in the
https://docs.aspose.com/words/net/updating-and-removing-a-field/ link
How can i resolve that issue?
Any idea will help
thanks in advance
Hi Stephane,
Thanks for your inquiry. We are working over your query and will get back to you soon.
Best regards,
Thanks, I am looking forward to your response
Hi Stephane,
Thanks for being patient. The problem occurs because such fields do not have field values, and Microsoft Word calculates and displays their values on the fly. So, the only way to replace such fields with actual values is looping through all fields, and calculate the values of the “ListNum” fields. For example see the following code:
Dim doc As New Document(MyDir & "ReplaceFields.doc")
FieldsHelper.ConvertFieldsToStaticText(doc, FieldType.FieldIf)
UnlinkFields(doc)
doc.Save(MyDir & "out.doc")
Public Sub UnlinkFields(ByVal doc As Document)
' Create DocumentBuilder, it will be needed to update autonum fields.
Dim builder As New DocumentBuilder(doc)
Dim autoNumber As Integer = 1
Dim listNumber As Integer = 1
'Get collection of FieldStart nodes
Dim fieldStarts As NodeCollection = doc.GetChildNodes(Aspose.Words.NodeType.FieldStart, True)
'Get collection of FieldSeparator nodes
Dim fieldSeparators As NodeCollection = doc.GetChildNodes(Aspose.Words.NodeType.FieldSeparator, True)
'And get collection of FieldEnd nodes
Dim fieldEnds As NodeCollection = doc.GetChildNodes(Aspose.Words.NodeType.FieldEnd, True)
'Loop through all FieldStart nodes
For Each start As FieldStart In fieldStarts
' Insert value of Autonum fields.
If start.FieldType = FieldType.FieldAutoNum OrElse start.FieldType = FieldType.FieldAutoNumLegal OrElse start.FieldType = FieldType.FieldAutoNumOutline OrElse start.FieldType = FieldType.FieldListNum Then
builder.MoveTo(start)
Dim val As String = If(start.FieldType = FieldType.FieldListNum, String.Format("{0})", System.Math.Max(System.Threading.Interlocked.Increment(listNumber), listNumber - 1)), String.Format("{0}.", System.Math.Max(System.Threading.Interlocked.Increment(autoNumber), autoNumber - 1)))
builder.Write(val)
End If
'Search for FieldSeparator node. it is needed to remove field code from the document
Dim curNode As Node = start
While curNode.NodeType <> Aspose.Words.NodeType.FieldSeparator AndAlso curNode.NodeType <> Aspose.Words.NodeType.FieldEnd
curNode = curNode.NextPreOrder(doc)
If curNode Is Nothing Then
Exit While
End If
End While
'Remove all nodes between Fieldstart and FieldSeparator (of FieldEnd, depending from field type)
If curNode IsNot Nothing Then
RemoveSequence(start, curNode)
End If
Next
'Now we can remove FieldStart, FieldSeparator and FieldEnd nodes
fieldStarts.Clear()
fieldSeparators.Clear()
fieldEnds.Clear()
End Sub
'/
'/ Remove all nodes between start and end nodes, except start and end nodes
'/
'/ The start node
'/ The end node
Public Sub RemoveSequence(ByVal start As Node, ByVal [end] As Node)
Dim curNode As Node = start.NextPreOrder(start.Document)
While curNode IsNot Nothing AndAlso Not curNode.Equals([end])
'Move to next node
Dim nextNode As Node = curNode.NextPreOrder(start.Document)
'Check whether current contains end node
If curNode.IsComposite Then
If Not TryCast(curNode, CompositeNode).GetChildNodes(Aspose.Words.NodeType.Any, True).Contains([end]) AndAlso Not TryCast(curNode, CompositeNode).GetChildNodes(Aspose.Words.NodeType.Any, True).Contains(start) Then
nextNode = curNode.NextSibling
curNode.Remove()
End If
Else
curNode.Remove()
End If
curNode = nextNode
End While
End Sub
I hope, this helps.
Best regards,