You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中合并多张Spring MultiPartFile格式图片为单个文件?

免费解决方案:垂直拼接图片为PDF或单张图片

一、生成PDF格式(优先推荐)

使用Apache PDFBox,这是Apache基金会旗下的开源PDF处理库,完全免费且可商用,无付费授权要求。

实现步骤与代码示例

  1. 添加Maven依赖:
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.32</version> <!-- 可替换为最新稳定版 -->
</dependency>
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:15:08