请帮我用java18使用springboot 设计一套docdocxpptpdf上传后每一页按页数重命名后保存为图片到本地的方法
以下是一个基本的实现示例:
- 添加依赖
首先需要添加POI和Apache Commons FileUpload的依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
- 编写控制器
接下来,需要编写一个控制器来处理文件上传和转换为图片的逻辑。在这个示例中,我们将上传的文件存储在临时目录中,并将其转换为图片,并将每一页按页数重命名后保存在本地。
@RestController
@RequestMapping("/upload")
public class FileUploadController {
@PostMapping("/")
public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
// 创建临时目录
File tempDir = Files.createTempDirectory("temp").toFile();
// 保存上传的文件到临时目录
File uploadedFile = new File(tempDir, file.getOriginalFilename());
try (OutputStream os = new FileOutputStream(uploadedFile)) {
os.write(file.getBytes());
}
// 将文件转换为图片
List<File> imageFiles = convertToImages(uploadedFile);
// 重命名并保存每一页图片到本地
for (int i = 0; i < imageFiles.size(); i++) {
File imageFile = imageFiles.get(i);
String imageName = String.format("%s_%d.%s", FilenameUtils.getBaseName(imageFile.getName()), i + 1, FilenameUtils.getExtension(imageFile.getName()));
File renamedImageFile = new File(tempDir, imageName);
FileUtils.moveFile(imageFile, renamedImageFile);
}
// 删除临时目录及其内容
FileUtils.deleteDirectory(tempDir);
return ResponseEntity.ok().build();
}
private List<File> convertToImages(File file) throws IOException {
try (InputStream is = new FileInputStream(file)) {
String extension = FilenameUtils.getExtension(file.getName());
switch (extension) {
case "doc":
case "docx":
return convertWordToImages(is);
case "ppt":
case "pptx":
return convertPowerPointToImages(is);
case "pdf":
return convertPdfToImages(is);
default:
throw new IllegalArgumentException("Unsupported file type: " + extension);
}
}
}
private List<File> convertWordToImages(InputStream is) throws IOException {
XWPFDocument document = new XWPFDocument(is);
XWPFPictureData pictureData = document.getAllPictures().get(0);
byte[] pictureBytes = pictureData.getData();
BufferedImage image = ImageIO.read(new ByteArrayInputStream(pictureBytes));
return Collections.singletonList(createImageFile(image, "png"));
}
private List<File> convertPowerPointToImages(InputStream is) throws IOException {
XMLSlideShow slideShow = new XMLSlideShow(is);
BufferedImage[] slides = new BufferedImage[slideShow.getSlides().size()];
for (int i = 0; i < slideShow.getSlides().size(); i++) {
XSLFSlide slide = slideShow.getSlides().get(i);
BufferedImage image = new BufferedImage(slideShow.getPageSize().width, slideShow.getPageSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
slide.draw(graphics);
slides[i] = image;
}
return Arrays.stream(slides).map(image -> createImageFile(image, "png")).collect(Collectors.toList());
}
private List<File> convertPdfToImages(InputStream is) throws IOException {
PDDocument document = PDDocument.load(is);
PDFRenderer renderer = new PDFRenderer(document);
BufferedImage[] pages = new BufferedImage[document.getNumberOfPages()];
for (int i = 0; i < document.getNumberOfPages(); i++) {
pages[i] = renderer.renderImage(i);
}
return Arrays.stream(pages).map(image -> createImageFile(image, "png")).collect(Collectors.toList());
}
private File createImageFile(BufferedImage image, String format) throws IOException {
File file = File.createTempFile("image", "." + format);
ImageIO.write(image, format, file);
return file;
}
}
- 测试
最后,可以使用任何HTTP客户端来测试上传文件和转换为图片的功能。以下是一个使用cURL的示例:
curl -F "file=@/path/to/file.docx" http://localhost:8080/upload/
如果一切正常,上传的文件将被存储在临时目录中,并被转换为图片,并且每一页按页数重命名后保存在本地。
原文地址: https://www.cveoy.top/t/topic/LPp 著作权归作者所有。请勿转载和采集!