首先需要引入以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

然后创建一个控制器类来接收文件并处理:

import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;

@Controller
public class FileController {

    @Value('${file.upload-dir}')
    private String uploadDir;

    @PostMapping('/upload')
    public ResponseEntity<String> uploadFile(@RequestParam('file') MultipartFile file) throws IOException {
        // 判断文件是否为空
        if (file.isEmpty()) {
            return new ResponseEntity<'File is empty', HttpStatus.BAD_REQUEST>;
        }
        // 获取文件名和扩展名
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        String fileExtension = StringUtils.getFilenameExtension(fileName).toLowerCase();
        // 判断文件类型
        if (!fileExtension.equals('pdf') && !fileExtension.equals('docx') && !fileExtension.equals('pptx')) {
            return new ResponseEntity<'Unsupported file type', HttpStatus.BAD_REQUEST>;
        }
        // 创建文件夹
        File dir = new File(uploadDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 保存文件
        File uploadedFile = new File(uploadDir + File.separator + fileName);
        FileUtils.writeByteArrayToFile(uploadedFile, file.getBytes());
        // 转换文件并保存图片
        if (fileExtension.equals('pdf')) {
            convertPdfToImages(uploadedFile);
        } else if (fileExtension.equals('docx')) {
            convertDocxToImages(uploadedFile);
        } else if (fileExtension.equals('pptx')) {
            convertPptxToImages(uploadedFile);
        }
        return new ResponseEntity<'File uploaded successfully', HttpStatus.OK>;
    }

    private void convertPdfToImages(File file) throws IOException {
        PDDocument document = PDDocument.load(file);
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        for (int i = 0; i < document.getNumberOfPages(); i++) {
            BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300);
            String fileName = file.getName().substring(0, file.getName().lastIndexOf('.')) + '_' + (i + 1) + '.jpg';
            File outputFile = new File(uploadDir + File.separator + fileName);
            ImageIO.write(image, 'jpg', outputFile);
        }
        document.close();
    }

    private void convertDocxToImages(File file) throws IOException {
        XWPFDocument document = new XWPFDocument(FileUtils.openInputStream(file));
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (int i = 0; i < paragraphs.size(); i++) {
            List<XWPFRun> runs = paragraphs.get(i).getRuns();
            for (int j = 0; j < runs.size(); j++) {
                XWPFRun run = runs.get(j);
                BufferedImage image = run.getPictureData().getImage();
                if (image != null) {
                    String fileName = file.getName().substring(0, file.getName().lastIndexOf('.')) + '_' + (i + 1) + '_' + (j + 1) + '.jpg';
                    File outputFile = new File(uploadDir + File.separator + fileName);
                    ImageIO.write(image, 'jpg', outputFile);
                }
            }
        }
        document.close();
    }

    private void convertPptxToImages(File file) throws IOException {
        XMLSlideShow document = new XMLSlideShow(FileUtils.openInputStream(file));
        List<XSLFSlide> slides = document.getSlides();
        for (int i = 0; i < slides.size(); i++) {
            BufferedImage image = slides.get(i).getThumbnail(1, 1);
            String fileName = file.getName().substring(0, file.getName().lastIndexOf('.')) + '_' + (i + 1) + '.jpg';
            File outputFile = new File(uploadDir + File.separator + fileName);
            ImageIO.write(image, 'jpg', outputFile);
        }
        document.close();
    }
}

其中,@Value('${file.upload-dir}')注解用来获取文件保存目录的配置,需要在application.properties文件中添加以下配置:

file.upload-dir=/path/to/upload/dir

最后在启动类上添加@EnableConfigurationProperties注解,使得@ConfigurationProperties注解生效:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
Java8 Spring Boot 实现 PDF、DOC、PPT 文件转图片并保存

原文地址: https://www.cveoy.top/t/topic/mgSa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录