请帮我用java18使用springboot 设计一套docpdf上传后每一页按页数重命名后保存为图片到本地的方法
以下是一个基本的实现:
- 在Spring Boot项目中添加依赖项org.apache.pdfbox和org.apache.poi,以便处理pdf和doc文件。
- 创建一个名为FileUploadController的控制器类,其中包含一个处理上传文件的POST方法。此方法将使用MultipartFile对象接收上传的文件,并将其保存在本地文件系统上。然后,它将检查文件类型并使用适当的库将文件转换为图片。最后,它将重命名并保存所有生成的图像。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
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.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class FileUploadController {
@Value("${file.upload-dir}")
private String fileUploadDir;
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 保存上传的文件
String fileName = file.getOriginalFilename();
String filePath = fileUploadDir + File.separator + fileName;
File dest = new File(filePath);
file.transferTo(dest);
// 检查文件类型并使用相应的库将其转换为图片
List<String> imagePaths = new ArrayList<>();
if (fileName.endsWith(".pdf")) {
PDDocument document = PDDocument.load(dest);
PDFRenderer pdfRenderer = new PDFRenderer(document);
int numPages = document.getNumberOfPages();
for (int i = 0; i < numPages; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300);
String imagePath = fileUploadDir + File.separator + "page" + (i + 1) + ".png";
ImageIO.write(image, "png", new File(imagePath));
imagePaths.add(imagePath);
}
document.close();
} else if (fileName.endsWith(".doc")) {
WordExtractor extractor = new WordExtractor(dest);
String text = extractor.getText();
String[] pages = text.split("\f");
for (int i = 0; i < pages.length; i++) {
BufferedImage image = TextToImageConverter.convertTextToImage(pages[i]);
String imagePath = fileUploadDir + File.separator + "page" + (i + 1) + ".png";
ImageIO.write(image, "png", new File(imagePath));
imagePaths.add(imagePath);
}
} else if (fileName.endsWith(".docx")) {
XWPFWordExtractor extractor = new XWPFWordExtractor(new FileInputStream(dest));
String text = extractor.getText();
String[] pages = text.split("\f");
for (int i = 0; i < pages.length; i++) {
BufferedImage image = TextToImageConverter.convertTextToImage(pages[i]);
String imagePath = fileUploadDir + File.separator + "page" + (i + 1) + ".png";
ImageIO.write(image, "png", new File(imagePath));
imagePaths.add(imagePath);
}
} else {
// 不支持的文件类型
return new ResponseEntity<>("Unsupported file type", HttpStatus.BAD_REQUEST);
}
// 重命名并保存所有生成的图像
for (int i = 0; i < imagePaths.size(); i++) {
String oldPath = imagePaths.get(i);
String newPath = fileUploadDir + File.separator + "page" + (i + 1) + ".png";
File oldFile = new File(oldPath);
File newFile = new File(newPath);
oldFile.renameTo(newFile);
}
return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity<>("Error uploading file", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
- 创建一个名为TextToImageConverter的帮助类,它将给定的文本转换为包含该文本的BufferedImage对象。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public class TextToImageConverter {
private static final int FONT_SIZE = 12;
public static BufferedImage convertTextToImage(String text) {
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("Courier New", Font.PLAIN, FONT_SIZE));
String[] lines = text.split("\n");
int y = FONT_SIZE;
for (String line : lines) {
g2d.drawString(line, 0, y);
y += FONT_SIZE;
}
g2d.dispose();
return image;
}
}
- 在application.properties文件中添加一个名为file.upload-dir的属性,指定上传文件的保存路径。
file.upload-dir=/path/to/upload/dir
- 运行Spring Boot应用程序并使用POST请求上传pdf或doc文件。每一页都将转换为一个png图像,并在本地文件系统上保存。图像将按页数重命名,例如page1.png,page2.png等等。
原文地址: http://www.cveoy.top/t/topic/LHY 著作权归作者所有。请勿转载和采集!