当将多个 PDF 文件合并成单个 DOCX 文档时,利用 Java 中的 Apache PDFBox 和 Apache POI 库可以实现这一目标。这个过程可以分为几个步骤:
使用 Apache PDFBox 和 Apache POI 库来处理 PDF 和 DOCX 文件。你需要导入相关库,并确保在项目中使用了正确的依赖。
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
</dependency>
通过指定文件夹路径,遍历文件夹中的所有 PDF 文件,并将其存储在一个列表中。
使用 Apache POI 的 XWPFDocument
类创建一个新的空白 DOCX 文档对象。
对于每个 PDF 文件:
PDDocument
加载 PDF 文件。最后,将生成的 DOCX 文档保存到指定的输出路径。
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class MergePDFsToDOCX {
public static void main(String[] args) {
String pdfFolderPath = "\\mergePdfsTODocument"; // 替换为包含PDF文件的文件夹路径
String outputDOCXPath = "\\mergePdfsTODocument\\document.docx"; // 输出的DOCX文件路径
try {
List<File> pdfFiles = getPdfFilesInFolder(pdfFolderPath);
mergePDFsToDocx(pdfFiles, outputDOCXPath);
System.out.println("PDFs merged to DOCX successfully: " + outputDOCXPath);
} catch (IOException e) {
System.err.println("Failed to merge PDFs to DOCX.");
e.printStackTrace();
}
}
public static List<File> getPdfFilesInFolder(String folderPath) {
File folder = new File(folderPath);
List<File> pdfFiles = new ArrayList<>();
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile() && file.getName().toLowerCase().endsWith(".pdf")) {
pdfFiles.add(file);
}
}
}
} else {
System.err.println("Folder not found: " + folderPath);
}
return pdfFiles;
}
public static void mergePDFsToDocx(List<File> pdfFiles, String outputDOCXPath) throws IOException {
XWPFDocument doc = new XWPFDocument();
for (File pdfFile : pdfFiles) {
try (PDDocument pdf = PDDocument.load(pdfFile)) {
PDFRenderer pdfRenderer = new PDFRenderer(pdf);
int numPages = pdf.getNumberOfPages();
for (int pageIndex = 0; pageIndex < numPages; pageIndex++) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(pageIndex, 300); // 渲染PDF页面为图像
String imgFileName = pdfFile.getName() + "_page_" + (pageIndex + 1) + ".png"; // 图像文件名
File imageFile = new File(imgFileName);
ImageIO.write(bim, "png", imageFile); // 将图像写入文件
FileInputStream imageStream = new FileInputStream(imageFile);
XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(pdfFile.getName());
run.addBreak();
doc.createParagraph().createRun().addPicture(
imageStream, Document.PICTURE_TYPE_PNG, imgFileName, Units.toEMU(400), Units.toEMU(400));
imageStream.close();
imageFile.delete(); // 删除临时图像文件
}
} catch (IOException e) {
System.err.println("Failed to process file: " + pdfFile.getName());
e.printStackTrace();
} catch (InvalidFormatException e) {
throw new RuntimeException(e);
}
}
try (FileOutputStream fos = new FileOutputStream(outputDOCXPath)) {
doc.write(fos);
}
}
}