Java Spring Boot PDF, DOC, PPT 文件转图片并保存:完整示例和代码
以下是一个使用 Java 8 Spring Boot 实现接收 PDF、DOC、PPT 文件并将每一页转换为图片并保存到指定目录的完整示例代码。
依赖项
首先,您需要在 pom.xml 文件中添加以下依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<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>
</dependencies>
控制器类
创建一个名为 FileUploadController 的控制器类,并在其中添加一个处理文件上传请求的 POST 方法:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
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.FileInputStream;
import java.io.IOException;
import java.util.UUID;
@Controller
public class FileUploadController {
@Value('${upload.dir}')
private String uploadDir;
@PostMapping('/upload')
public String uploadFile(@RequestParam('file') MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase();
switch (extension) {
case 'pdf':
return savePdf(file);
case 'doc':
return saveDoc(file);
case 'docx':
return saveDocx(file);
case 'ppt':
return savePpt(file);
case 'pptx':
return savePptx(file);
default:
throw new IllegalArgumentException('Unsupported file type: ' + extension);
}
}
private String savePdf(MultipartFile file) throws IOException {
String filename = UUID.randomUUID().toString() + '.pdf';
String filepath = uploadDir + File.separator + filename;
file.transferTo(new File(filepath));
PDDocument document = PDDocument.load(new File(filepath));
PDFRenderer renderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = renderer.renderImage(i);
String pageFilename = UUID.randomUUID().toString() + '.jpg';
String pageFilepath = uploadDir + File.separator + pageFilename;
ImageIO.write(image, 'jpg', new File(pageFilepath));
}
document.close();
return 'redirect:/gallery';
}
private String saveDoc(MultipartFile file) throws IOException {
String filename = UUID.randomUUID().toString() + '.doc';
String filepath = uploadDir + File.separator + filename;
file.transferTo(new File(filepath));
WordExtractor extractor = new WordExtractor(new FileInputStream(filepath));
String[] paragraphs = extractor.getParagraphText();
for (int i = 0; i < paragraphs.length; i++) {
BufferedImage image = TextToImageConverter.convertTextToImage(paragraphs[i]);
String pageFilename = UUID.randomUUID().toString() + '.jpg';
String pageFilepath = uploadDir + File.separator + pageFilename;
ImageIO.write(image, 'jpg', new File(pageFilepath));
}
return 'redirect:/gallery';
}
private String saveDocx(MultipartFile file) throws IOException {
String filename = UUID.randomUUID().toString() + '.docx';
String filepath = uploadDir + File.separator + filename;
file.transferTo(new File(filepath));
XWPFDocument document = new XWPFDocument(new FileInputStream(filepath));
String[] paragraphs = document.getParagraphs().stream().map(p -> p.getText()).toArray(String[]::new);
for (int i = 0; i < paragraphs.length; i++) {
BufferedImage image = TextToImageConverter.convertTextToImage(paragraphs[i]);
String pageFilename = UUID.randomUUID().toString() + '.jpg';
String pageFilepath = uploadDir + File.separator + pageFilename;
ImageIO.write(image, 'jpg', new File(pageFilepath));
}
return 'redirect:/gallery';
}
private String savePpt(MultipartFile file) throws IOException {
String filename = UUID.randomUUID().toString() + '.ppt';
String filepath = uploadDir + File.separator + filename;
file.transferTo(new File(filepath));
XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream(filepath));
for (XSLFSlide slide : slideShow.getSlides()) {
BufferedImage image = slide.getThumbnail(1, 1);
String pageFilename = UUID.randomUUID().toString() + '.jpg';
String pageFilepath = uploadDir + File.separator + pageFilename;
ImageIO.write(image, 'jpg', new File(pageFilepath));
}
return 'redirect:/gallery';
}
private String savePptx(MultipartFile file) throws IOException {
String filename = UUID.randomUUID().toString() + '.pptx';
String filepath = uploadDir + File.separator + filename;
file.transferTo(new File(filepath));
XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream(filepath));
for (XSLFSlide slide : slideShow.getSlides()) {
BufferedImage image = slide.getThumbnail(1, 1);
String pageFilename = UUID.randomUUID().toString() + '.jpg';
String pageFilepath = uploadDir + File.separator + pageFilename;
ImageIO.write(image, 'jpg', new File(pageFilepath));
}
return 'redirect:/gallery';
}
}
辅助类
创建一个名为 TextToImageConverter 的辅助类,用于将文本转换为图像:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
public class TextToImageConverter {
public static BufferedImage convertTextToImage(String text) {
int width = 500;
int height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setBackground(Color.WHITE);
g2d.clearRect(0, 0, width, height);
g2d.setColor(Color.BLACK);
Font font = new Font('Serif', Font.BOLD, 18);
g2d.setFont(font);
int x = 10;
int y = 20;
for (String line : text.split('
')) {
g2d.drawString(line, x, y);
y += g2d.getFontMetrics().getHeight();
}
g2d.dispose();
return image;
}
}
配置文件
最后,在 application.properties 文件中添加一个配置,以指定上传文件的目标目录:
upload.dir=/path/to/upload/directory
运行程序
现在,您已经准备好运行这个程序了。您可以使用任何 HTTP 客户端(例如 Postman)向 /upload 端点发送文件上传请求。程序会将每个文件转换为图像并将其保存到指定的目录中。
注意: 确保您已经配置了 upload.dir 属性,并且您的应用程序具有写入该目录的权限。
代码说明
- 该示例代码使用 Apache POI 和 Apache PDFBox 库来读取和转换文档。
- 代码中使用
UUID来生成随机文件名,以避免文件名冲突。 TextToImageConverter辅助类用于将文本转换为图像。- 您可以根据需要修改代码,例如更改图片格式、添加错误处理等。
总结
本文详细介绍了如何使用 Java 8 Spring Boot 实现接收 PDF、DOC、PPT 文件并将每一页转换为图片并保存到指定目录。希望本文能帮助您快速上手。
原文地址: https://www.cveoy.top/t/topic/mg7J 著作权归作者所有。请勿转载和采集!