插入Checkboxes、文本输入或图像
合并引擎将文档作为输入,在其中查找MERGEFIELD
字段,并将其替换为从数据源获取的数据。 通常,插入纯文本和HTML,但Aspose.Words用户也可以生成处理Mail Merge字段更不寻常的情况的文档。
强大的Aspose.Words功能允许您扩展Mail Merge进程:
- 在mail merge期间将checkboxes和文本输入表单字段插入文档
- 从任何自定义存储(文件,BLOB字段等)插入图像。)
在Mail Merge期间插入Checkboxes和文本输入
有时需要执行Mail Merge操作,以便在合并字段中不是替换文本,而是替换checkbox或文本输入字段。 尽管这不是最常见的情况,但它对于某些任务来说非常方便。
Word文档的以下屏幕截图显示了具有合并字段的模板:
下面Word文档的此屏幕截图显示了已经生成的文档:
Subject
字段被替换为文本输入字段。
下面的代码示例演示如何在mail merge期间将checkboxes和输入文本字段插入到文档中:
// 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操作时,可以使用特殊的imageMail Merge字段将数据库中的图像插入到文档中。 ImageMail 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); | |
} | |
} |