The MailMerge.MergeImageField occurs during mail merge when an image mail merge field is encountered in the document. An image mail merge field is a merge field named like Image:MyFieldName. You can respond to this event to return a file name, stream, or an Image object to the mail merge engine so that it is inserted into the document.
Use the MergeImageFieldEventHandler delegate representing the method that will handle the MergeImageField event. The event handler receives an argument of type MergeImageFieldEventArgs. There are three properties available ImageFileName, ImageStream and Image to specify from where the image must be taken. Set only one of these properties.
Example MailMergeImageFromBlob
Shows how to insert images stored in a database BLOB field into a report.
[C#]
public void MailMergeImageFromBlob()
{
Document doc = new Document(MyDir + "MailMerge.MergeImage.doc");
// Set up the event handler for image fields.
doc.MailMerge.MergeImageField += new MergeImageFieldEventHandler(HandleMergeImageFieldFromBlob);
// Open a database connection.
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DatabaseDir + "Northwind.mdb";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
// Open the data reader. It needs to be in the normal mode that reads all record at once.
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Employees", conn);
IDataReader dataReader = cmd.ExecuteReader();
// Perform mail merge.
doc.MailMerge.ExecuteWithRegions(dataReader, "Employees");
// Close the database.
conn.Close();
doc.Save(MyDir + "MailMerge.MergeImage Out.doc");
}
/// <summary>
/// This is called when mail merge engine encounters Image:XXX merge field in the document.
/// You have a chance to return an Image object, file name or a stream that contains the image.
/// </summary>
private static void HandleMergeImageFieldFromBlob(object sender, MergeImageFieldEventArgs e)
{
// The field value is a byte array, just cast it and create a stream on it.
MemoryStream imageStream = new MemoryStream((byte[])e.FieldValue);
// Now the mail merge engine will retrieve the image from the stream.
e.ImageStream = imageStream;
}
[Visual Basic]
Public Sub MailMergeImageFromBlob()
Dim doc As Document = New Document(MyDir & "MailMerge.MergeImage.doc")
' Set up the event handler for image fields.
AddHandler doc.MailMerge.MergeImageField, AddressOf HandleMergeImageFieldFromBlob
' Open a database connection.
Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DatabaseDir & "Northwind.mdb"
Dim conn As OleDbConnection = New OleDbConnection(connString)
conn.Open()
' Open the data reader. It needs to be in the normal mode that reads all record at once.
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM Employees", conn)
Dim dataReader As IDataReader = cmd.ExecuteReader()
' Perform mail merge.
doc.MailMerge.ExecuteWithRegions(dataReader, "Employees")
' Close the database.
conn.Close()
doc.Save(MyDir & "MailMerge.MergeImage Out.doc")
End Sub
''' <summary>
''' This is called when mail merge engine encounters Image:XXX merge field in the document.
''' You have a chance to return an Image object, file name or a stream that contains the image.
''' </summary>
Private Shared Sub HandleMergeImageFieldFromBlob(ByVal sender As Object, ByVal e As MergeImageFieldEventArgs)
' The field value is a byte array, just cast it and create a stream on it.
Dim imageStream As MemoryStream = New MemoryStream(CType(e.FieldValue, Byte()))
' Now the mail merge engine will retrieve the image from the stream.
e.ImageStream = imageStream
End Sub
[Java]
public void MailMergeImageFromBlob() throws Exception
{
Document doc = new Document(getMyDir() + "MailMerge.MergeImage.doc");
// Set up the event handler for image fields and perform mail merge.
doc.getMailMerge().addMergeImageFieldEventHandler(new HandleMergeImageFieldFromBlob());
// Open a DSN-less connection.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String connString = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};" +
"DBQ=" + getDatabaseDir() + "Northwind.mdb;UID=Admin";
Connection conn = DriverManager.getConnection(connString);
// Load a data table.
Statement statement = conn.createStatement();
ResultSet employeesTable = statement.executeQuery("SELECT * FROM Employees");
// Execute mail merge.
doc.getMailMerge().executeWithRegions("Employees", employeesTable);
// Close the database.
conn.close();
doc.save(getMyDir() + "MailMerge.MergeImage Out.doc");
}
/// <summary>
/// This is called when mail merge engine encounters Image:XXX merge field in the document.
/// You have a chance to return an Image object, file name or a stream that contains the image.
/// </summary>
private class HandleMergeImageFieldFromBlob implements MergeImageFieldEventHandler
{
public void mergeImageField(Object sender, MergeImageFieldEventArgs e)
{
// The field value is a byte array, just cast it and create a stream on it.
InputStream imageStream = new ByteArrayInputStream((byte[])e.getFieldValue());
// Now the mail merge engine will retrieve the image from the stream.
e.setImageStream(imageStream);
}
}