原始需求:
用户分别上传身份证正反面照片,后台合并成一张照片或一个pdf文件;
为方便业务扩展,可支持多张照片合并:
方式1:多图合成一张图片
package com.solar.common.util;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;
import javax.imageio.ImageIO;
import org.springframework.util.Assert;
public class Test {
/**
* 合并图片
* @Title:merge
* @date 2022年12月12日 上午9:59:33
* @author yqwang
* @param files 源图
* @param distPath 合并后图片存放位置
*/
public static void merge(List<File> files, String distPath) {
Assert.notEmpty(files,"源图参数不能为空。");
Assert.isTrue(files.size()>=2,"源图不得少于2张。");
int dstHeight = 0;
int dstWidth = 0;
// 获取需要拼接的图片长度
int len = files.size();
// 判断长度是否大于0
BufferedImage[] images = new BufferedImage[len];
int[][] ImageArrays = new int[len][];
for (int i = 0; i < len; i++) {
try {
Assert.isTrue(files.get(i)!=null,"图片文件为空");
images[i] = ImageIO.read(files.get(i));
int width = images[i].getWidth();
int height = images[i].getHeight();
Assert.isTrue(width>=1,"源图高度太小。");
Assert.isTrue(height>=1,"源图宽度太小。");
// 从图片中读取RGB 像素
ImageArrays[i] = new int[width * height];
ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
// 计算合并的宽度和高度
dstWidth = dstWidth > width ? dstWidth : width;
dstHeight += height;
} catch (Exception e) {
e.printStackTrace();
Assert.isTrue(false,"读取图片信息失败:"+e.getMessage());
}
}
// 合成图片像素
//System.out.println("宽度:" + dstWidth);
//System.out.println("高度:" + dstHeight);
// 生成新图片
try {
BufferedImage imageNew = new BufferedImage(dstWidth, dstHeight, BufferedImage.TYPE_INT_RGB);
int height_i = 0;
for (int i = 0; i < images.length; i++) {
int width = images[i].getWidth();
int height = images[i].getHeight();
imageNew.setRGB(0, height_i, width, height, ImageArrays[i], 0, width);
height_i += height;
}
File outFile = new File(distPath);
// 写图片,输出到硬盘
ImageIO.write(imageNew, "jpg", outFile);
} catch (Exception e) {
e.printStackTrace();
Assert.isTrue(false,e.getMessage());
}
}
}
方式2:多图合成一个pdf文件
需要使用包
itextpdf
:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>xxxxxxx</version>
</dependency>
package com.solar.common.util;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.springframework.util.Assert;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.solar.util.FileHelper;
import com.solar.util.ListUtil;
public class Test {
private final static List<String> imgFileTypes=ListUtil.split("bmp,jpg,jpeg,gif,png", ",");
/**
* 多个图片生成pdf文件
* @Title:buildPdfByImgs
* @Description: TODO
* @date 2022年12月12日 下午2:27:40
* @author yqwang
* @param imgs 图片文件列表
* @param distPath 目标路径
* @throws Exception
*/
public static void buildPdfByImgs(List<File> imgs,String distPath) throws Exception{
// 1:创建一个document对象。
Document document = new Document();
try {
// 2创建一个PdfWriter实例,
PdfWriter.getInstance(document, new FileOutputStream(new File(distPath)));
// 3:打开文档。
document.open();
// 4:在文档中增加图片。
document.setPageSize(PageSize.A4);
String ext;
Image img;
for (File file : imgs) {
ext = FileHelper.getFileExtName(file.getName());
//只管图片文件
if(!imgFileTypes.contains(ext.toLowerCase())){
continue;
}
//document.newPage(); 如果每张图片要放独立的一页,这需要每次newPage()
img = Image.getInstance(FileHelper.readFileToByteArray(file));
//img = Image.getInstance(filePath);可以使用路径方式读取图像文件
img.setAlignment(Image.ALIGN_CENTER);
//可能需要将图像缩放到一定百分比。
Float wPercent = PageSize.A4.getWidth()/img.getWidth();
Float hPercent = PageSize.A4.getHeight()/img.getHeight();
if(wPercent<1 || hPercent<1){
img.scalePercent(Math.min(wPercent, hPercent)*100);
}else{
img.scalePercent(100);
}
//在文档中增加图片
document.add(img);
}
} catch (Exception e) {
e.printStackTrace();
Assert.isTrue(false,e.getMessage());
}finally{
try {
document.close();
} catch (Exception e) {
}
}
}
}
版权声明:本文为yqwang75457原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。