利用Java写一个工具类使用documents4j将某个文件夹中的多个DOCX文档自动转为pdf格式且保存到另一个文件夹中,如果DOCX文档已转换,自动跳过,给出详细并优化后的代码.
时间: 2024-12-12 11:22:54 浏览: 31
在Java中,我们可以利用Apache POI库处理DOCX文档,然后通过documents4j将其转换为PDF,并结合java.nio.file包来操作文件和目录。以下是一个基本的示例代码,展示了如何创建一个工具类来完成这个任务:
```java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.wml.P;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class DocumentConverter {
private static final String DOCX_FORMAT = ".docx";
private static final String PDF_FORMAT = ".pdf";
public void convertDocxToPdf(String sourceFolder, String targetFolder) {
File sourceDir = new File(sourceFolder);
if (!sourceDir.exists() || !sourceDir.isDirectory()) {
throw new IllegalArgumentException("Invalid source folder path.");
}
File targetDir = new File(targetFolder);
if (!targetDir.exists() || !targetDir.mkdir()) {
throw new RuntimeException("Failed to create target folder.");
}
List<String> existingFiles = getExistingFiles(sourceFolder, DOCX_FORMAT);
for (String fileName : existingFiles) {
try {
Resource docxResource = new FileSystemResource(new File(sourceFolder + File.separator + fileName));
XWPFDocument document = new XWPFDocument(docxResource.getInputStream());
// Create the pdf file path based on the original docx name
Path pdfPath = Paths.get(targetFolder, fileName.replace(DOCX_FORMAT, PDF_FORMAT));
if (!pdfPath.toFile().exists()) {
Context context = Context.createForCurrentThread();
context.loadModels();
P bodyParagraph = document.getBody().getFirstChild();
// Convert content and save as PDF
documents4j.convert(bodyParagraph, new FileOutputStream(pdfPath.toFile()));
System.out.println("Converted " + fileName + " to " + pdfPath);
} else {
System.out.println(fileName + " already converted, skipping...");
}
} catch (IllegalArgumentException | Docx4JException e) {
System.err.println("Error converting " + fileName + ": " + e.getMessage());
}
}
}
private List<String> getExistingFiles(String folder, String extension) {
List<String> result = new ArrayList<>();
Files.walk(Paths.get(folder))
.filter(path -> path.toString().endsWith(extension))
.forEach(path -> result.add(path.subpath(folder.length(), path.getNameCount())));
return result;
}
}
```
在这个代码中,我们首先检查输入的源文件夹是否存在且是否为文件夹,接着创建目标文件夹。然后遍历源文件夹中的所有DOCX文件,对每个DOCX文件执行转换操作。如果目标PDF文件已经存在,则跳过;如果不存在则进行转换。
注意:这只是一个基础示例,实际生产环境中可能需要添加错误处理、日志记录以及资源释放等更复杂的功能。同时,由于Apache POI和documents4j处理大文档可能会有性能问题,对于大量文件转换,可以考虑异步处理或者分批处理。
阅读全文