Java8 Spring Boot 实现 PDF、DOC、PPT 文件转图片并保存
首先需要引入以下依赖:
<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);
}
}
原文地址: https://www.cveoy.top/t/topic/mgSa 著作权归作者所有。请勿转载和采集!