【Java】多pdf文件合并为一个.docx文件

当将多个 PDF 文件合并成单个 DOCX 文档时,利用 Java 中的 Apache PDFBox 和 Apache POI 库可以实现这一目标。这个过程可以分为几个步骤:

1. 导入所需的库

使用 Apache PDFBox 和 Apache POI 库来处理 PDF 和 DOCX 文件。你需要导入相关库,并确保在项目中使用了正确的依赖。

<dependency>
     <groupId>org.apache.pdfbox</groupId>
     <artifactId>pdfbox</artifactId>
     <version>2.0.29</version>
</dependency>

2. 获取PDF文件列表

通过指定文件夹路径,遍历文件夹中的所有 PDF 文件,并将其存储在一个列表中。

3. 创建DOCX文档对象

使用 Apache POI 的 XWPFDocument 类创建一个新的空白 DOCX 文档对象。

4. 逐个处理PDF文件

对于每个 PDF 文件:

  • 使用 PDFBox 的 PDDocument 加载 PDF 文件。
  • 遍历 PDF 文件的每一页,将每一页渲染为图像(PNG 格式)。
  • 将图像插入到 DOCX 文档中对应的段落中,并保留文件名作为文字内容。
  • 创建一个空的XWPFDocument对象,即将用于存储合并后的文档内容。

5. 将结果保存为DOCX文件

最后,将生成的 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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值