Checkboxes, Texteingaben oder Bilder einfügen

Die Merge-Engine nimmt ein Dokument als Eingabe, sucht darin nach MERGEFIELD -Feldern und ersetzt sie durch die aus der Datenquelle erhaltenen Daten. Normalerweise werden Klartext und HTML eingefügt, aber Aspose.Words -Benutzer können auch ein Dokument generieren, das ungewöhnlichere Szenarien für Mail Merge -Felder behandelt.

Die leistungsstarke Aspose.Words -Funktionalität ermöglicht es Ihnen, den Mail Merge-Prozess zu erweitern:

  • fügen Sie checkboxes- und Texteingabeformularfelder während eines mail merge-Vorgangs in das Dokument ein
  • fügen Sie Bilder aus einem beliebigen benutzerdefinierten Speicher (Dateien, BLOB -Felder usw.) ein.)

Checkboxes und Texteingabe während Mail Merge einfügen

Manchmal ist es erforderlich, eine Mail Merge -Operation auszuführen, damit im Seriendruckfeld kein Text ersetzt wird, sondern ein checkbox - oder Texteingabefeld. Auch wenn dies nicht das häufigste Szenario ist, ist es für einige Aufgaben sehr praktisch.

Der folgende Screenshot eines Word-Dokuments zeigt eine Vorlage mit Seriendruckfeldern:

insert-checkboxes-or-images-mail-merge-aspose-words

Dieser Screenshot des Word -Dokuments unten zeigt das bereits generierte Dokument:

insert-checkboxes-html-or-images-mail-merge-aspose-words

Das folgende Codebeispiel zeigt, wie checkboxes eingefügt und Textfelder während einer mail merge in ein Dokument eingegeben werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Mail merge destinations - Fax.docx");
// Setup mail merge event handler to do the custom work.
doc.MailMerge.FieldMergingCallback = new HandleMergeField();
// Trim trailing and leading whitespaces mail merge values.
doc.MailMerge.TrimWhitespaces = false;
string[] fieldNames = {
"RecipientName", "SenderName", "FaxNumber", "PhoneNumber",
"Subject", "Body", "Urgent", "ForReview", "PleaseComment"
};
object[] fieldValues = {
"Josh", "Jenny", "123456789", "", "Hello",
"<b>HTML Body Test message 1</b>", true, false, true
};
doc.MailMerge.Execute(fieldNames, fieldValues);
doc.Save(ArtifactsDir + "WorkingWithFields.MailMergeFormFields.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
private class HandleMergeField : IFieldMergingCallback
{
/// <summary>
/// This handler is called for every mail merge field found in the document,
/// for every record found in the data source.
/// </summary>
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
if (mBuilder == null)
mBuilder = new DocumentBuilder(e.Document);
// We decided that we want all boolean values to be output as check box form fields.
if (e.FieldValue is bool)
{
// Move the "cursor" to the current merge field.
mBuilder.MoveToMergeField(e.FieldName);
string checkBoxName = $"{e.FieldName}{e.RecordIndex}";
mBuilder.InsertCheckBox(checkBoxName, (bool) e.FieldValue, 0);
return;
}
switch (e.FieldName)
{
case "Body":
mBuilder.MoveToMergeField(e.FieldName);
mBuilder.InsertHtml((string) e.FieldValue);
break;
case "Subject":
{
mBuilder.MoveToMergeField(e.FieldName);
string textInputName = $"{e.FieldName}{e.RecordIndex}";
mBuilder.InsertTextInput(textInputName, TextFormFieldType.Regular, "", (string) e.FieldValue, 0);
break;
}
}
}
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
args.ImageFileName = "Image.png";
args.ImageWidth.Value = 200;
args.ImageHeight = new MergeFieldImageDimension(200, MergeFieldImageDimensionUnit.Percent);
}
private DocumentBuilder mBuilder;
}

Bilder während Mail Merge einfügen

Wenn Sie eine Mail Merge -Operation ausführen, können Sie Bilder aus der Datenbank mithilfe spezieller Bildfelder Mail Merge in das Dokument einfügen. Das Feld Bild Mail Merge ist ein Seriendruckfeld mit dem Namen Bild:MyFieldName.

Bilder aus einer Datenbank einfügen

Wenn während eines mail merge ein Bild Mail Merge -Feld in einem Dokument gefunden wird, wird das FieldMergingCallback -Ereignis ausgelöst. Sie können auf dieses Ereignis reagieren, um einen Dateinamen, einen Stream oder ein Bildobjekt an die Mail Merge-Engine zurückzugeben, damit es in das Dokument eingefügt werden kann.

Das folgende Codebeispiel zeigt, wie Bilder, die in einem Datenbankfeld BLOB gespeichert sind, in einen Bericht eingefügt werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Mail merge destination - Northwind employees.docx");
doc.MailMerge.FieldMergingCallback = new HandleMergeImageFieldFromBlob();
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DatabaseDir + "Northwind.accdb";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Employees", conn);
IDataReader dataReader = cmd.ExecuteReader();
doc.MailMerge.ExecuteWithRegions(dataReader, "Employees");
conn.Close();
doc.Save(ArtifactsDir + "WorkingWithFields.MailMergeImageFromBlob.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
public class HandleMergeImageFieldFromBlob : IFieldMergingCallback
{
void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
{
// Do nothing.
}
/// <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>
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs 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;
}
}

Bildeigenschaften während Mail Merge festlegen

Beim Zusammenführen eines Bild-Seriendruckfelds müssen Sie möglicherweise manchmal verschiedene Bildeigenschaften steuern, z. B. WrapType.

Derzeit können Sie mit ImageFieldMergingArgs nur die Eigenschaften für die Bildbreite bzw. -höhe festlegen. Um dieses Problem zu beheben, stellt Aspose.Words die Eigenschaft Shape bereit, mit der Sie die vollständige Kontrolle über das eingefügte Bild oder eine andere Form erhalten.

Das folgende Codebeispiel zeigt, wie verschiedene Bildeigenschaften festgelegt werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Writeln("{{#foreach example}}");
builder.Writeln("{{Image(126pt;126pt):stempel}}");
builder.Writeln("{{/foreach example}}");
doc.MailMerge.UseNonMergeFields = true;
doc.MailMerge.TrimWhitespaces = true;
doc.MailMerge.UseWholeParagraphAsRegion = false;
doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveEmptyTableRows
| MailMergeCleanupOptions.RemoveContainingFields
| MailMergeCleanupOptions.RemoveUnusedRegions
| MailMergeCleanupOptions.RemoveUnusedFields;
doc.MailMerge.FieldMergingCallback = new ImageFieldMergingHandler();
doc.MailMerge.ExecuteWithRegions(new DataSourceRoot());
doc.Save(ArtifactsDir + "WorkingWithFields.MailMergeImageField.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
private class ImageFieldMergingHandler : IFieldMergingCallback
{
void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
{
// Implementation is not required.
}
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
Shape shape = new Shape(args.Document, ShapeType.Image)
{
Width = 126, Height = 126, WrapType = WrapType.Square
};
shape.ImageData.SetImage(MyDir + "Mail merge image.png");
args.Shape = shape;
}
}
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
public class DataSourceRoot : IMailMergeDataSourceRoot
{
public IMailMergeDataSource GetDataSource(string s)
{
return new DataSource();
}
private class DataSource : IMailMergeDataSource
{
private bool next = true;
string IMailMergeDataSource.TableName => TableName();
private string TableName()
{
return "example";
}
public bool MoveNext()
{
bool result = next;
next = false;
return result;
}
public IMailMergeDataSource GetChildDataSource(string s)
{
return null;
}
public bool GetValue(string fieldName, out object fieldValue)
{
fieldValue = null;
return false;
}
}
}