The data for the image is contained in a dataset.
In Debug-Mode I can see that in my dataSet the byteArray with the imageData is filled.
But in the MailMerge_MergeImageField-Function the field.FieldValue is empty.
Below is the code we use.
- Code: Select all
private static Document FillTemplateFromCore(byte[] template, DataSet dataSet)
{
//...
document.MailMerge.ClearFields = true;
document.MailMerge.HideEmptyParagraphs = true;
document.MailMerge.MergeField += MailMerge_MergeField;
document.MailMerge.MergeImageField += MailMerge_MergeImageField;
//Executing Mailmerge for Multiple Datasets so that Multiple Repeat Table in Target Object are Possible
var dataTableRelationShips = BuildRelationShipEntries(dataSet);
document.MailMerge.ExecuteWidthNestedRegion(dataSet, dataTableRelationShips);
return document;
void MailMerge_MergeField(object sender, MergeFieldEventArgs field)
{
var CurrentMergeFieldOwner = field.CurrentMergeField.Owner.Clone();
var FieldRowIndex = field.RowIndex;
//Create Dictionaries to Prevent Null Exception Error
if (!iteratedFieldnames.ContainsKey(CurrentMergeFieldOwner)) iteratedFieldnames.Add(CurrentMergeFieldOwner, new Dictionary<int, List<string>>());
if (!iteratedFieldnames[CurrentMergeFieldOwner].ContainsKey(FieldRowIndex)) iteratedFieldnames[CurrentMergeFieldOwner].Add(FieldRowIndex, new List<string>());
bool alreadyIterated = iteratedFieldnames[CurrentMergeFieldOwner][FieldRowIndex].Contains(field.FieldName);
//The merge fields that expect HTML data should be marked with some prefix, for instance,'[Html]'.
if (field.FieldValue is string && (field.FieldValue as string).StartsWith(HTMLPREFIX))
{
if (!alreadyIterated)
{
var fieldWithoutPrefix = (field.FieldValue as string).Replace(HTMLPREFIX, String.Empty);
field.CurrentMergeField.OwnerParagraph.AppendHTML(fieldWithoutPrefix);
if (!iteratedFieldnames.ContainsKey(CurrentMergeFieldOwner)) throw new Exception(String.Format("Key '{0}' not Present in IteratedFieldnames", CurrentMergeFieldOwner));
if (!iteratedFieldnames[CurrentMergeFieldOwner].ContainsKey(FieldRowIndex)) throw new Exception(String.Format("Key '{0}' not Present in IteratedFieldnames[{1}]", FieldRowIndex, CurrentMergeFieldOwner));
iteratedFieldnames[CurrentMergeFieldOwner][FieldRowIndex].Add(field.FieldName);
}
//Needs to be set to Empty String in every Iteration otherwise Text will be shown
field.Text = "";
}
else if (field.FieldValue is DateTime)
{
MergeField mergefield = field.CurrentMergeField as MergeField;
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("de-DE");
DateTime d = Convert.ToDateTime(field.Text);
string s = d.ToString(mergefield.DateFormat, culture);
field.Text = s;
}
else if (field.FieldValue is Decimal)
{
MergeField mergefield = field.CurrentMergeField as MergeField;
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
decimal d = Convert.ToDecimal(field.Text);
string s = d.ToString(mergefield.NumberFormat, culture);
field.Text = s;
}
}
void MailMerge_MergeImageField(object sender, MergeImageFieldEventArgs field)
{
var CurrentMergeFieldOwner = field.CurrentMergeField.Owner.Clone();
var FieldRowIndex = field.RowIndex;
if (!iteratedFieldnames.ContainsKey(CurrentMergeFieldOwner)) iteratedFieldnames.Add(CurrentMergeFieldOwner, new Dictionary<int, List<string>>());
if (!iteratedFieldnames[CurrentMergeFieldOwner].ContainsKey(FieldRowIndex)) iteratedFieldnames[CurrentMergeFieldOwner].Add(FieldRowIndex, new List<string>());
if (field.FieldValue is byte[])
{
var imageStream = new MemoryStream(field.FieldValue as byte[]);
field.SetImage(imageStream);
}
}
}
private static List<DictionaryEntry> BuildRelationShipEntries(DataSet dataSet, IEnumerable<MailMergeRelation> relationships)
{
List<DictionaryEntry> resultEntries = new List<DictionaryEntry>();
IEnumerable<DataTable> dataTables = EnumerableOf(dataSet.Tables);
foreach (var dataTable in dataTables.Where(tbl => !relationships.Any(rel => rel.childEntity == tbl.TableName)))
{
resultEntries.Add(new DictionaryEntry(dataTable.TableName, string.Empty));
}
foreach (var relationship in relationships)
{
var childTable = dataTables.SingleOrDefault(tbl => tbl.TableName == relationship.childEntity);
if (childTable == null) throw new ArgumentException("childTable not found: " + relationship.childEntity);
var childColumnIndex = childTable.Columns.IndexOf(relationship.childField);
if (childColumnIndex == -1) throw new ArgumentException("chieldField not found: " + relationship.childField);
var childColumn = childTable.Columns[childColumnIndex];
var parentTable = dataTables.SingleOrDefault(tbl => tbl.TableName == relationship.parentEntity);
if (parentTable == null) throw new ArgumentException("parentTable not found: " + relationship.parentEntity);
var parentColumnIndex = parentTable.Columns.IndexOf(relationship.parentField);
if (parentColumnIndex == -1) throw new ArgumentException("parentField not found: " + relationship.parentField);
var parentColumn = parentTable.Columns[parentColumnIndex];
resultEntries.Add(new DictionaryEntry(relationship.childEntity, string.Format("{0} = %{1}.{2}%", relationship.childField, relationship.parentEntity, relationship.parentField)));
}
return resultEntries;
}