Insérer Checkboxes, Saisie de texte ou Images

Le moteur de fusion prend un document en entrée, recherche les champs MERGEFIELD qu’il contient et les remplace par les données obtenues à partir de la source de données. En règle générale, du texte brut et HTML sont insérés, mais les utilisateurs Aspose.Words peuvent également générer un document qui gère des scénarios plus inhabituels pour les champs Mail Merge.

La puissante fonctionnalité Aspose.Words vous permet d’étendre le processus Mail Merge:

  • insérer des champs de formulaire checkboxes et de saisie de texte dans le document pendant un mail merge
  • insérez des images à partir de n’importe quel stockage personnalisé (fichiers, champs BLOB, etc.)

Insérer Checkboxes et la saisie de texte pendant Mail Merge

Parfois, il est nécessaire d’effectuer une opération Mail Merge pour que ce ne soit pas du texte qui soit substitué dans le champ de fusion, mais un champ de saisie checkbox ou texte. Même si ce n’est pas le scénario le plus courant, c’est très pratique pour certaines tâches.

La capture d’écran suivante d’un document Word montre un modèle avec des champs de fusion:

insert-checkboxes-html-or-images-during-mail-merge-aspose-words-java-1

Cette capture d’écran du document Word ci-dessous montre le document déjà généré:

insert-checkboxes-html-or-images-during-mail-merge-aspose-words-java-2

L’exemple de code suivant montre comment insérer checkboxes et saisir des champs de texte dans un document pendant un mail merge:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(getMyDir() + "Mail merge destinations - Fax.docx");
// Setup mail merge event handler to do the custom work.
doc.getMailMerge().setFieldMergingCallback(new HandleMergeField());
// Trim trailing and leading whitespaces mail merge values.
doc.getMailMerge().setTrimWhitespaces(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.getMailMerge().execute(fieldNames, fieldValues);
doc.save(getArtifactsDir() + "WorkingWithFields.MailMergeFormFields.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static class HandleMergeField implements IFieldMergingCallback
{
/// <summary>
/// This handler is called for every mail merge field found in the document,
/// for every record found in the data source.
/// </summary>
public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs e) throws Exception
{
if (mBuilder == null)
mBuilder = new DocumentBuilder(e.getDocument());
// We decided that we want all boolean values to be output as check box form fields.
if (e.getFieldValue() instanceof /*boolean*/Boolean)
{
// Move the "cursor" to the current merge field.
mBuilder.moveToMergeField(e.getFieldName());
String checkBoxName = MessageFormat.format("{0}{1}", e.getFieldName(), e.getRecordIndex());
mBuilder.insertCheckBox(checkBoxName, (Boolean) e.getFieldValue(), 0);
return;
}
switch (e.getFieldName())
{
case "Body":
mBuilder.moveToMergeField(e.getFieldName());
mBuilder.insertHtml((String) e.getFieldValue());
break;
case "Subject":
{
mBuilder.moveToMergeField(e.getFieldName());
String textInputName = MessageFormat.format("{0}{1}", e.getFieldName(), e.getRecordIndex());
mBuilder.insertTextInput(textInputName, TextFormFieldType.REGULAR, "", (String) e.getFieldValue(), 0);
break;
}
}
}
public void imageFieldMerging(ImageFieldMergingArgs args)
{
args.setImageFileName("Image.png");
args.getImageWidth().setValue(200.0);
args.setImageHeight(new MergeFieldImageDimension(200.0, MergeFieldImageDimensionUnit.PERCENT));
}
private DocumentBuilder mBuilder;
}

Insérer des images pendant Mail Merge

Lorsque vous effectuez une opération Mail Merge, vous pouvez insérer des images de la base de données dans le document à l’aide de champs spéciaux image Mail Merge. Le champ image Mail Merge est un champ de fusion nommé Image: MyFieldName.

Insérer des images à partir d’une base de données

Lors d’un mail merge, lorsqu’un champ image Mail Merge est rencontré dans un document, l’événement FieldMergingCallback est déclenché. Vous pouvez répondre à cet événement pour renvoyer un nom de fichier, un flux ou un objet image au moteur Mail Merge afin qu’il puisse être inséré dans le document.

L’exemple de code suivant montre comment insérer des images stockées dans un champ de base de données BLOB dans un rapport:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public void mailMergeImageFromBlob() throws Exception
{
Document doc = new Document(getMyDir() + "Mail merge destination - Northwind employees.docx");
doc.getMailMerge().setFieldMergingCallback(new HandleMergeImageFieldFromBlob());
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String connString = "jdbc:ucanaccess://" + getDatabaseDir() + "Northwind.mdb";
Connection connection = DriverManager.getConnection(connString, "Admin", "");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM Employees");
DataTable dataTable = new DataTable(resultSet, "Employees");
IDataReader dataReader = new DataTableReader(dataTable);
doc.getMailMerge().executeWithRegions(dataReader, "Employees");
connection.close();
doc.save(getArtifactsDir() + "WorkingWithFields.MailMergeImageFromBlob.docx");
}
public static class HandleMergeImageFieldFromBlob implements IFieldMergingCallback
{
public void 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>
public void imageFieldMerging(ImageFieldMergingArgs e) throws Exception
{
// The field value is a byte array, just cast it and create a stream on it.
ByteArrayInputStream imageStream = new ByteArrayInputStream((byte[]) e.getFieldValue());
// Now the mail merge engine will retrieve the image from the stream.
e.setImageStream(imageStream);
}
}

Définir les propriétés de l’image pendant Mail Merge

Lors de la fusion d’un champ de fusion d’image, vous devrez parfois contrôler diverses propriétés d’image, telles que WrapType.

Actuellement, en utilisant ImageFieldMergingArgs, vous ne pouvez définir que les propriétés de largeur ou de hauteur de l’image, respectivement. Pour surmonter ce problème, Aspose.Words fournit la propriété Shape, ce qui facilite le contrôle total de l’image insérée ou de toute autre forme.

L’exemple de code suivant montre comment définir diverses propriétés d’image:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("{{#foreach example}}");
builder.writeln("{{Image(126pt;126pt):stempel}}");
builder.writeln("{{/foreach example}}");
doc.getMailMerge().setUseNonMergeFields(true);
doc.getMailMerge().setTrimWhitespaces(true);
doc.getMailMerge().setUseWholeParagraphAsRegion(false);
doc.getMailMerge().setCleanupOptions(MailMergeCleanupOptions.REMOVE_EMPTY_TABLE_ROWS
| MailMergeCleanupOptions.REMOVE_CONTAINING_FIELDS
| MailMergeCleanupOptions.REMOVE_UNUSED_REGIONS
| MailMergeCleanupOptions.REMOVE_UNUSED_FIELDS);
doc.getMailMerge().setFieldMergingCallback(new ImageFieldMergingHandler());
doc.getMailMerge().executeWithRegions(new DataSourceRoot());
doc.save(getArtifactsDir() + "WorkingWithFields.MailMergeImageField.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static class ImageFieldMergingHandler implements IFieldMergingCallback
{
public void fieldMerging(FieldMergingArgs args)
{
// Implementation is not required.
}
public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception
{
Shape shape = new Shape(args.getDocument(), ShapeType.IMAGE);
{
shape.setWidth(126.0); shape.setHeight(126.0); shape.setWrapType(WrapType.SQUARE);
}
shape.getImageData().setImage(getMyDir() + "Mail merge image.png");
args.setShape(shape);
}
}