Replace mail merge field with scaled image using Aspose.Words for Java

Is it possible to replace a Mail Merge Image field with a scaled image?

Hi Gloria,

Thanks for your inquiry. Sure, you can use the MailMerge.FieldMergingCallback event that 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 Scaled Image object to the mail merge engine so that it is inserted into the document. For more information, please read the complete topic here:
How to Insert Images from a Database

Please let me know if I can be of any further assistance.

Best Regards,

I was able to create a scaled image, and then convert to BufferedImage. The quality of images is not as good as scaling image when printing though.


public class MyFieldMergingCallback implements IFieldMergingCallback
{
public void fieldMerging(FieldMergingArgs args) throws Exception
{
}

public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception
{
BufferedImage img = ImageIO.read(new File(“C:\images\icon_standard_hr.gif”));
Image dimg = img.getScaledInstance(12, 12, Image.SCALE_SMOOTH);
BufferedImage bimg = toBufferedImage(dimg);
args.setImage(bimg);
}
public static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {return (BufferedImage)image;}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
// Determine if the image has transparent pixels
boolean hasAlpha = hasAlpha(image);
// Create a buffered image with a format that’s compatible with the screen
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
// Determine the type of transparency of the new buffered image
int transparency = Transparency.OPAQUE;
if (hasAlpha == true) {transparency = Transparency.BITMASK;}
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
}
catch (HeadlessException e) {} //No screen
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha == true) {type = BufferedImage.TYPE_INT_ARGB;}
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
public static boolean hasAlpha(Image image) {
// If buffered image, the color model is readily available
if (image instanceof BufferedImage) {return ((BufferedImage)image).getColorModel().hasAlpha();}
// Use a pixel grabber to retrieve the image’s color model;
// grabbing a single pixel is usually sufficient
PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
try {pg.grabPixels();} catch (InterruptedException e) {}
// Get the image’s color model
return pg.getColorModel().hasAlpha();
}
}

Hi Gloria,

Thanks for the additional information. But, could you please attach your image file (icon_standard_hr.gif) here for testing? I will investigate the issue on my side and provide you more information.

Moreover, the new version of Aspose.Words i.e. 11.5.0 just came out; please download the latest version from the following link and let us know how it goes on your side?