Вставка Checkbox файлов, ввод текста или изображений
Механизм слияния принимает документ в качестве входных данных, ищет в нем поля MERGEFIELD
и заменяет их данными, полученными из источника данных. Обычно вставляется обычный текст и HTML, но пользователи Aspose.Words также могут создать документ, который обрабатывает более необычные сценарии для полей Mail Merge.
Мощная функциональность Aspose.Words позволяет расширить процесс Mail Merge:
- вставьте checkboxes и поля формы ввода текста в документ во время mail merge
- вставляйте изображения из любого пользовательского хранилища (файлы, поля BLOB и т.д.)
Вставка Checkbox строк и ввод текста во время Mail Merge
Иногда необходимо выполнить операцию Mail Merge, чтобы в поле слияния был заменен не текст, а поле checkbox или поле ввода текста. Хотя это и не самый распространенный сценарий, он очень удобен для некоторых задач.
На следующем снимке экрана документа Word показан шаблон с полями для объединения:
На этом скриншоте документа Word, приведенном ниже, показан уже созданный документ:
Subject
было заменено полем текстового ввода.
В следующем примере кода показано, как вставлять checkbox строки и вводить текстовые поля в документ во время 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; | |
} |
Вставлять изображения во время Mail Merge
При выполнении операции Mail Merge вы можете вставлять изображения из базы данных в документ, используя специальные поля image Mail Merge. Поле image Mail Merge является полем объединения с именем Image:MyFieldName.
Вставка изображений из базы данных
Во время mail merge, когда в документе встречается поле Mail Merge с изображением, запускается событие FieldMergingCallback. Вы можете отреагировать на это событие, чтобы вернуть имя файла, поток или объект изображения в механизм Mail Merge, чтобы его можно было вставить в документ.
В следующем примере кода показано, как вставить изображения, хранящиеся в поле базы данных BLOB, в отчет:
// 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); | |
} | |
} |
Установите свойства изображения во время Mail Merge
При объединении поля объединения изображений иногда может потребоваться управлять различными свойствами изображения, такими как WrapType.
В настоящее время, используя ImageFieldMergingArgs, вы можете задать только параметры ширины или высоты изображения соответственно. Чтобы решить эту проблему, Aspose.Words предоставляет свойство Shape, которое позволяет получить полный контроль над вставляемым изображением или любой другой формой.
В следующем примере кода показано, как задать различные свойства изображения:
// 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); | |
} | |
} |