如何在Java中合并多张Spring MultiPartFile格式图片为单个文件?
免费解决方案:垂直拼接图片为PDF或单张图片
一、生成PDF格式(优先推荐)
使用Apache PDFBox,这是Apache基金会旗下的开源PDF处理库,完全免费且可商用,无付费授权要求。
实现步骤与代码示例
- 添加Maven依赖:
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.32</version> <!-- 可替换为最新稳定版 --> </dependency>
- Spring环境下核心代码:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; public MultipartFile mergeImagesToPdf(List<MultipartFile> imageFiles) throws IOException { try (PDDocument document = new PDDocument()) { for (MultipartFile file : imageFiles) { // 加载图片为PDF可识别对象 PDImageXObject image = PDImageXObject.createFromByteArray(document, file.getBytes(), file.getOriginalFilename()); // 创建与图片尺寸匹配的PDF页面 PDPage page = new PDPage(new org.apache.pdfbox.pdmodel.common.PDRectangle(image.getWidth(), image.getHeight())); document.addPage(page); // 将图片绘制到PDF页面 try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) { contentStream.drawImage(image, 0, 0, image.getWidth(), image.getHeight()); } } // 将PDF写入字节流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); document.save(baos); baos.close(); // 转换为MultipartFile返回 return new MockMultipartFile("merged.pdf", "merged.pdf", "application/pdf", new ByteArrayInputStream(baos.toByteArray())); } }
注:
MockMultipartFile来自spring-test模块,若生产环境不想引入该模块,可自行实现MultipartFile接口封装字节流。
二、生成单张拼接图片(备选方案)
使用JDK自带的ImageIO,无需额外依赖,完全免费,适合不需要PDF格式的场景。
实现步骤与代码示例
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; public MultipartFile mergeImagesVertically(List<MultipartFile> imageFiles) throws IOException { // 读取所有图片并计算拼接后尺寸 List<BufferedImage> images = new ArrayList<>(); int totalHeight = 0; int maxWidth = 0; for (MultipartFile file : imageFiles) { BufferedImage img = ImageIO.read(file.getInputStream()); images.add(img); totalHeight += img.getHeight(); maxWidth = Math.max(maxWidth, img.getWidth()); } // 创建拼接后的空白画布 BufferedImage mergedImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = mergedImage.createGraphics(); // 逐张绘制图片 int currentY = 0; for (BufferedImage img : images) { // 水平居中绘制(左对齐则x=0) int x = (maxWidth - img.getWidth()) / 2; g2d.drawImage(img, x, currentY, null); currentY += img.getHeight(); } g2d.dispose(); // 将拼接后的图片写入字节流(以PNG为例,可改为JPG) ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(mergedImage, "PNG", baos); baos.close(); // 转换为MultipartFile返回 return new MockMultipartFile("merged.png", "merged.png", "image/png", new ByteArrayInputStream(baos.toByteArray())); }
注:若需生成JPG格式,只需将
ImageIO.write的第二个参数改为"JPG",同时调整MultipartFile的contentType为"image/jpeg"。
内容的提问来源于stack exchange,提问作者mar3g
相关产品推荐
相关产品推荐

