Delete fields after evaluation

Hi,
I tried this code :
[…]

document.MailMerge.ExecuteWithRegions(ds);
document.UpdateFields();
document.MailMerge.DeleteFields();

[…]
But it seems that “DeleteFields();” only delete mergefields like “{ MERGEFIELD …}”, and not evalation fiel like “{ = …}” or “{ IF … }”.
Did I forget something ? Is there any way to delete these fields and replace them by their corresponding value ?
Thanks
Max

Hi Max,

Thanks for your request. MS Word document field looks like the following:
[FieldStart] here is field code [FieldSeparator] here is field value [FieldEnd]
You can also open your document using DocumentExplorer (Aspose.Words demo application) to investigate your document’s structure. DocumentExplorer is included to Aspose.Words installation package. You can find it here:
C:\Program Files\Aspose\Aspose.Words\Demos\CSharp\DocumentExplorer
I think, in your case, you can use DocumentVisitor to achieve what you need. Please follow the link to learn more
https://docs.aspose.com/words/net/how-to-extract-selected-content-between-nodes-in-a-document/
You can find some code example here:
https://forum.aspose.com/t/76601
Best regards,

Hi AndreyN,
Thanks for these informations.
Do you plan to add a method like DeleteEvaluationFields() in a next release ? It could be usefull for Aspose fields evaluation users.

Hi Max,
Thanks for your request. We will consider adding this functionality. Your request has been linked to the appropriate issue. You will be notified as soon as it is supported.
Maybe, in your case, it would be enough just to protect your document. In this case, the end user will not be able to see field code:
https://docs.aspose.com/words/net/protect-or-encrypt-a-document/
Best regards,

Hi AndreyN,
I can’t protect my document in my case.
I used DocumentVisitor to delete nested evaluation fields.
Ex : { IF { = OR ( 0 ; 1) } = 1 { MERGEFIELD msgok } { MERGEFIELD msgnok } } => msgok
Code :
- Visitor class :

public class RemoveIFFields: DocumentVisitor
{
    private int n = 0;
    private bool res = false;

    public override VisitorAction VisitFieldStart(Aspose.Words.Fields.FieldStart fieldStart)
    {
        if ((fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldCompare))
        {
            n += 1;
            res = false;
            fieldStart.Remove();
        }
        return VisitorAction.Continue;
    }

    public override VisitorAction VisitFieldSeparator(Aspose.Words.Fields.FieldSeparator fieldSeparator)
    {
        if ((fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldCompare))
        {
            res = true;
            fieldSeparator.Remove();
        }
        return VisitorAction.Continue;
    }

    public override VisitorAction VisitFieldEnd(Aspose.Words.Fields.FieldEnd fieldEnd)
    {
        if ((fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldCompare))
        {
            n -= 1;
            res = false;
            fieldEnd.Remove();
        }
        return VisitorAction.Continue;
    }

    public override VisitorAction VisitRun(Run run)
    {
        if (n> 1 || (n == 1 && !res))
            run.Remove();
        return VisitorAction.Continue;
    }
}

- Main class :
[…]

Document document = new Document(PathTmpModele);
document.MailMerge.RemoveEmptyParagraphs = res;
if (ds.Tables.Count> 0)
{
    if (ds.Tables.Count == 1)
        document.MailMerge.Execute(ds.Tables[0]);
    else
        document.MailMerge.ExecuteWithRegions(ds);
}
document.UpdateFields();
document.MailMerge.DeleteFields();
RemoveIFFields rif = new RemoveIFFields();
document.Accept(rif);

[…]
It seems that this works fine, but Image are not deleted.
ex : { IF 1 = 1 “[IMG]ok” “[IMG]ko” } => [IMG][IMG][IMG]ok
Could you help me to delete image in fields ?
Thanks

Hi

Thanks for your inquiry. In this case, you should just add the following piece of code into your RemoveIFFields class:

public override VisitorAction VisitShapeStart(Aspose.Words.Drawing.Shape shape)
{
    if (n> 1 || (n == 1 && !res))
        shape.Remove();
    return VisitorAction.Continue;
}

Best regards,

Hi,
Thank you for your help, it works
Max

HI,
I’ve a problem to delete fields with table in values.
code :

class Program
{
    static void Main(string[] args)
    {
        Aspose.Words.License Lica = new Aspose.Words.License();
        Lica.SetLicense(@\\ fidji\ Travail\ venayre - m\ N03\ Aspose.Total.lic);
        string fichier = @"F:\Travail\venayre-m\temp\CRIF-FICHEPROJET-01.dot";
        Aspose.Words.Document doc = new Document(fichier);
        DataSet ds = new DataSet();
        ds.ReadXml(@"F:\Travail\venayre-m\temp\ds.xml", XmlReadMode.ReadSchema);
        doc.MailMerge.ExecuteWithRegions(ds);
        doc.UpdateFields();
        doc.MailMerge.DeleteFields();
        // DELETE IF FIELDS
        DvRemoveIFFields rif = new DvRemoveIFFields();
        doc.Accept(rif);
        // END DELETE FIELDS
        doc.Save(@"F:\Travail\venayre-m\temp\out.doc");
    }
}
public class DvRemoveIFFields: DocumentVisitor
{
    // n correspond au niveau
    private int n = 0;
    // res indique si on est dans la zone rsultat
    private bool res = false;
    public override VisitorAction VisitFieldStart(Aspose.Words.Fields.FieldStart fieldStart)
    {
        if ((fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
            (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
        {
            n += 1;
            res = false;
            fieldStart.Remove();
        }
        return VisitorAction.Continue;
    }
    public override VisitorAction VisitFieldSeparator(Aspose.Words.Fields.FieldSeparator fieldSeparator)
    {
        if ((fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
            (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
        {
            res = true;
            fieldSeparator.Remove();
        }
        return VisitorAction.Continue;
    }
    public override VisitorAction VisitFieldEnd(Aspose.Words.Fields.FieldEnd fieldEnd)
    {
        if ((fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldIf) ||
            (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
            (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
            (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
        {
            n -= 1;
            res = false;
            fieldEnd.Remove();
        }
        return VisitorAction.Continue;
    }
    public override VisitorAction VisitRun(Run run)
    {
        // on ne garde que ce qui est dans la zone resultat du 1er niveau
        if (n> 1 || (n == 1 && !res))
            run.Remove();
        return VisitorAction.Continue;
    }
    public override VisitorAction VisitShapeStart(Aspose.Words.Drawing.Shape shape)
    {
        // on ne garde que ce qui est dans la zone resultat du 1er niveau (gestion des images)
        if (n> 1 || (n == 1 && !res))
            shape.Remove();
        return VisitorAction.Continue;
    }
}

Dataset and template are attached. I attached output with and without deleting fields. When I delete IF fields, I get duplicated table, and data are missing.
Could you please help me to modify DvRemoveIFFields to support this type of template ?
Thanks

Hi

Thanks for your request. I think in this case you should add the following piece of code into the DvRemoveIFFields class:

public override VisitorAction VisitTableStart(Table table)
{
    if (n> 1 || (n == 1 && !res))
        table.Remove();
    return VisitorAction.Continue;
}
public override VisitorAction VisitParagraphStart(Paragraph paragraph)
{
    if (n> 1 || (n == 1 && !res))
        paragraph.Remove();
    return VisitorAction.Continue;
}

Best regards,

Thanks,
I’ve modified my code. It seems to works fine, If and Formula fields are deleted and replaced by their values, but there is still a problem.
I should have this in the cell :
“Ligne1.
Ligne2.
Ligne3.”
But I get
"
Ligne2.
Ligne3."
I don’t see why this line is not displayed.
Code :

class Program
{
    static void Main(string[] args)
    {
        // license
        Aspose.Words.License Lica = new Aspose.Words.License();
        Lica.SetLicense(@file: //fidji/Travail/venayre-m/N03/Aspose.Total.lic);
            // template
            string fichier = @"F:\Travail\venayre-m\temp\template.dot"; Aspose.Words.Document doc = new Document(fichier);
            // data
            DataSet ds = new DataSet(); ds.ReadXml(@"F:\Travail\venayre-m\temp\ds.xml", XmlReadMode.ReadSchema);
            // mailmerge
            doc.MailMerge.ExecuteWithRegions(ds); doc.UpdateFields(); doc.MailMerge.DeleteFields();
            // remove formula fields
            DvRemoveFormulaFields rff = new DvRemoveFormulaFields(); doc.Accept(rff);
            // remove if fields
            DvRemoveIFFields rif = new DvRemoveIFFields(); doc.Accept(rif);
            // save
            doc.Save(@"F:\Travail\venayre-m\temp\out.doc");
        }
    }
    public class DvRemoveIFFields: DocumentVisitor
    {
        List <bool> res = new List <bool> ();

        public override VisitorAction VisitFieldStart(Aspose.Words.Fields.FieldStart fieldStart)
        {
            if (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldIf)
            {
                res.Add(false);
                fieldStart.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitFieldSeparator(Aspose.Words.Fields.FieldSeparator fieldSeparator)
        {
            if (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldIf)
            {
                res[res.Count - 1] = true;
                fieldSeparator.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitFieldEnd(Aspose.Words.Fields.FieldEnd fieldEnd)
        {
            if (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldIf)
            {
                res.RemoveAt(res.Count - 1);
                fieldEnd.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitRun(Run run)
        {
            if (!fres())
                run.Remove();
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitShapeStart(Aspose.Words.Drawing.Shape shape)
        {
            if (!fres())
                shape.Remove();
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitTableStart(Table table)
        {
            if (!fres())
                table.Remove();
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitParagraphStart(Paragraph paragraph)
        {
            if (!fres())
                paragraph.Remove();
            return VisitorAction.Continue;
        }
        private bool fres()
        {
            bool tmp = true;
            foreach(bool val in res)
            tmp = tmp && val;
            return tmp;
        }
    }
    public class DvRemoveFormulaFields: DocumentVisitor
    {
        private int n = 0;
        private bool res = false;

        public override VisitorAction VisitFieldStart(Aspose.Words.Fields.FieldStart fieldStart)
        {
            if ((fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
                (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
                (fieldStart.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
            {
                n += 1;
                res = false;
                fieldStart.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitFieldSeparator(Aspose.Words.Fields.FieldSeparator fieldSeparator)
        {
            if ((fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
                (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
                (fieldSeparator.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
            {
                res = true;
                fieldSeparator.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitFieldEnd(Aspose.Words.Fields.FieldEnd fieldEnd)
        {
            if ((fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldFormula) ||
                (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldCompare) ||
                (fieldEnd.FieldType == Aspose.Words.Fields.FieldType.FieldNone))
            {
                n -= 1;
                res = false;
                fieldEnd.Remove();
            }
            return VisitorAction.Continue;
        }
        public override VisitorAction VisitRun(Run run)
        {
            if (n> 1 || (n == 1 && !res))
                run.Remove();
            return VisitorAction.Continue;
        }
    }

I attached a simplified template and corresponding output.

Hi

Thank you for additional information. You should just change VisitParagraphStart to VisitParagraphEnd. After this manipulation the output document looks fine.
Best regards,

Thanks a lot, it works fine

The issues you have found earlier (filed as WORDSNET-976) have been fixed in this Aspose.Words for .NET 16.10.0 update and this Aspose.Words for Java 16.10.0 update.

This message was posted using Notification2Forum from Downloads module by aspose.notifier.
(13)