We have encountered problems when trying to use a MailMerge’s CleanupOptions to fully remove empty paragraphs. In most cases this works, but we found that if multiple MergeFields are embedded within a single If Field, any blank ones are NOT removed from the generated document. I suspect the Options don’t recognise any whitespace that falls outside a MergeField as ‘empty’.<?xml:namespace prefix = "o" ns = "urn:schemas-microsoft-com:office:office" />
If you examine the following code, we made 3 attempts to fully remove all empty paragraphs. #1, simply using the RemoveEmptyParagraphs setting, #2 by combining RemoveEmptyParagraphs, RemoveUnusedRegions, RemoveUnusedFields and RemoveContainingFields and #3 by implementing an IFieldMergingCallback. The only solution we got to work was #3 and then, only when the callback’s RemoveEmptyParagraphs method is invoked between MailMerge.Execute(…) and UpdateFields(); if it is invoked after UpdateFields() it doesn’t have any effect, even though I can see the code attempting to remove empty Paragraphs.
Note, this solution only attempts to remove Paragraphs that surround one or more MergeFields, that are left empty after any empty MergeFields have themselves been removed. Therefore, it has no effect on any empty Paragraphs that don’t have any MergeFields within them and is, therefore, relatively ‘safe’.
this.mailMergedDocument = new Document(letterFileName); // #1 this.mailMergedDocument.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveEmptyParagraphs;
/* #2 this.mailMergedDocument.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveEmptyParagraphs | MailMergeCleanupOptions.RemoveUnusedRegions | MailMergeCleanupOptions.RemoveUnusedFields | MailMergeCleanupOptions.RemoveContainingFields;*/
// #3 this.mailMergedDocument.MailMerge.FieldMergingCallback = new HandleMergeField(this.mailMergedDocument); HandleMergeField hmf = new HandleMergeField(this.mailMergedDocument); this.mailMergedDocument.MailMerge.FieldMergingCallback = hmf;
this.mailMergedDocument.MailMerge.Execute(dataTableDataSource);
/* Only works with this call in this position, between MailMerge.Execute(...) and UpdateFields(). * The CleanupOptions setting seems to be irrelevant; the RemoveEmptyParagraphs() works with or * without it. */ hmf.RemoveEmptyParagraphs();
/// <erge in of fixes: Converts MailMerge fields to static text. this.mailMergedDocument.UpdateFields();
FieldsHelper.ConvertFieldsToStaticText(this.mailMergedDocument, Aspose.Words.Fields.FieldType.FieldIf);
|
… |
/// /// HandleMergeField class /// public class HandleMergeField : IFieldMergingCallback {
/// /// DocumentBuilder object /// private readonly DocumentBuilder docBuilder;
/// /// Initializes a new instance of the class. /// /// The document internal HandleMergeField(Document doc) { this.docBuilder = new DocumentBuilder(doc); }
/// /// Called for every merge field encountered in the document. /// This simply captures the owning Paragraphs. /// /// Field Merging Arguments public void FieldMerging(FieldMergingArgs args) { if (args != null) { // Capture parent Paragraph. Paragraph p = args.Field.Start.ParentParagraph; if (!mPara.Contains(p)) { mPara.Add(p); } } }
/// /// Image field merging. /// /// Image Field Merging Arguments public void ImageFieldMerging(ImageFieldMergingArgs args) { // Do Nothing for the moment used it when we use images like signature }
public void RemoveEmptyParagraphs() { foreach (Paragraph p in mPara) { // Remove all empty MergeFields foreach(Field f in p.Range.Fields) { if (string.IsNullOrEmpty(f.Result)) { f.Remove(); } } // If the resulting Paragraph is left empty, remove it. if (string.IsNullOrEmpty(p.Range.Text.Trim()) && p.ParentNode != null) { p.Remove(); } } mPara.Clear(); }
private ArrayList mPara = new ArrayList(); }
|
Any comments are most welcome.
Regards,v