Java Spring Boot 实现 Doc/PDF 文件按页数转换为图片并重命名保存
可以使用 Apache PDFBox 和 Apache POI 库来实现将 doc 和 pdf 文件转换为图片并按页数重命名保存的功能。
首先,在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.23</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
然后,编写一个方法来实现文件上传并转换为图片的功能:
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.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class FileService {
public List<String> uploadFile(MultipartFile file) throws IOException {
List<String> filenames = new ArrayList<>();
String originalFilename = file.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1);
if (extension.equalsIgnoreCase('doc') || extension.equalsIgnoreCase('docx')) {
filenames = convertDocToImages(file);
} else if (extension.equalsIgnoreCase('pdf')) {
filenames = convertPdfToImages(file);
}
return filenames;
}
private List<String> convertDocToImages(MultipartFile file) throws IOException {
List<String> filenames = new ArrayList<>();
XWPFDocument docx = new XWPFDocument(file.getInputStream());
List<XWPFParagraph> paragraphs = docx.getParagraphs();
int pageNum = 1;
for (XWPFParagraph para : paragraphs) {
List<XWPFRun> runs = para.getRuns();
BufferedImage image = new BufferedImage(612, 792, BufferedImage.TYPE_INT_RGB);
for (XWPFRun run : runs) {
run.setFontSize(10);
run.setFontFamily('Arial');
run.setBold(false);
run.setItalic(false);
run.setUnderline(false);
String text = run.getText(0);
if (text != null) {
int width = image.getWidth();
int height = image.getHeight();
image.getGraphics().drawString(text, width / 2, height / 2);
}
}
String filename = 'page_' + pageNum + '.png';
File outputfile = new File(filename);
ImageIO.write(image, 'png', outputfile);
filenames.add(filename);
pageNum++;
}
docx.close();
return filenames;
}
private List<String> convertPdfToImages(MultipartFile file) throws IOException {
List<String> filenames = new ArrayList<>();
PDDocument pdf = PDDocument.load(file.getInputStream());
PDFRenderer renderer = new PDFRenderer(pdf);
int pageNum = 1;
for (int i = 0; i < pdf.getNumberOfPages(); i++) {
String filename = 'page_' + pageNum + '.png';
BufferedImage image = renderer.renderImageWithDPI(i, 300);
File outputfile = new File(filename);
ImageIO.write(image, 'png', outputfile);
filenames.add(filename);
pageNum++;
}
pdf.close();
return filenames;
}
}
在这个方法中,我们首先检查文件扩展名,如果是 doc 或 docx 文件,则使用 POI 库将文件转换为图片。如果是 pdf 文件,则使用 PDFBox 库进行转换。在转换的过程中,我们使用循环遍历每个页,并将每个页转换为一个图片,并按页数重命名为 page_1.png,page_2.png 等等。最后,将每个文件名添加到一个列表中,并将该列表返回。
请注意,这个方法返回一个列表,其中包含每个页的文件名。您可以使用这些文件名来保存图片到磁盘或数据库中。
原文地址: https://www.cveoy.top/t/topic/l3fv 著作权归作者所有。请勿转载和采集!