上传.PDF文件转为.DOCX文件

上传.PDF文件转为.DOCX文件,pdf中文件包含了图片和样式,转换为docx后的格式不错乱。

依赖了破解版的jar包:aspose-pdf-22.4.cracked.jar。该jar包可以在我的资源里下载。

代码如下:

复制代码
package io.cxwm.commons.tools.utils;
import com.aspose.pdf.Document;
import com.aspose.pdf.SaveFormat;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

public class PdfUtil {

    public static void main(String[] args) {
        String pdf = "C:\\Users\\Wxian\\Desktop\\商务文件.pdf";
        pdf2docx(pdf);
    }

    /**
     * pdf转doc
     * @param pdfPath pdf文件路径
     */
    public static String pdf2docx(String pdfPath) {
        long old = System.currentTimeMillis();
        String wordPath = "";
        try {
            //新建一个word文档
            wordPath = pdfPath.substring(0,pdfPath.lastIndexOf("."))+".docx";
            FileOutputStream os = new FileOutputStream(wordPath);
            //doc是将要被转化的word文档
            Document doc = new Document(pdfPath);
            //全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            doc.save(os, SaveFormat.DocX);
            os.close();
            //转化用时
            long now = System.currentTimeMillis();
            System.out.println("Pdf 转 Word 共耗时:" + ((now - old) / 1000.0) + "秒");
        } catch (Exception e) {
            System.out.println("Pdf 转 Word 失败...");
            e.printStackTrace();
        }
        return wordPath;
    }

    /**
     * 删除本地文件
     * @param filePath 本地文件路径
     */
    public static void delete(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            if (file.canWrite()) {
                boolean deleted = file.delete();
                if (deleted) {
                    System.out.println("文件删除成功");
                } else {
                    System.out.println("文件删除失败");
                }
            } else {
                System.out.println("文件不可写,无法删除");
            }
        } else {
            System.out.println("文件不存在,无法删除");
        }
    }

    /**
     * pdf文件转doc文件
     * @param file pdf文件
     * @return
     * @throws IOException
     */
    public static MultipartFile pdfCoverDocx(MultipartFile file) throws IOException {
        String projectPath = System.getProperty("user.dir");
        String pdfPath = projectPath + File.separator + file.getOriginalFilename();
        saveMultipartFileToLocal(file,pdfPath);
        String wordPath = PdfUtil.pdf2docx(pdfPath);
        File targetFile = new File(wordPath);
        file = convertFileToMultipartFile(targetFile);
        PdfUtil.delete(pdfPath);
        PdfUtil.delete(wordPath);
        return file;
    }

    /**
     * multipartFile转File
     * @param multipartFile
     * @return
     * @throws IOException
     */
    public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
        File file = new File(multipartFile.getOriginalFilename());
        file.createNewFile();
        FileCopyUtils.copy(multipartFile.getInputStream(), new FileOutputStream(file));
        return file;
    }

    /**
     * File转multipartFile
     * @param file
     * @return
     * @throws IOException
     */
    public static MultipartFile convertFileToMultipartFile(File file) throws IOException {
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file",
                file.getName(), "application/octet-stream", input);
        return multipartFile;
    }

    /**
     * 保存文件到本地
     * @param multipartFile 文件
     * @param targetPath 本地路径
     * @throws IOException
     */
    public static void saveMultipartFileToLocal(MultipartFile multipartFile, String targetPath) throws IOException {
        File targetFile = new File(targetPath);
        try (InputStream inputStream = multipartFile.getInputStream();
             OutputStream outputStream = new FileOutputStream(targetFile)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        }
    }

}
相关推荐
敢敢J的憨憨L31 分钟前
GPTL(General Purpose Timing Library)使用教程
java·服务器·前端·c++·轻量级计时工具库
sg_knight1 小时前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
hsjkdhs1 小时前
C++之类的继承与派生
开发语言·c++
lly2024062 小时前
HTML 元素:构建网页的基础
开发语言
低调小一2 小时前
LRU缓存科普与实现(Kotlin 与 Swift)
开发语言·缓存·kotlin
爱好学习的青年人2 小时前
一文详解Go语言字符串
开发语言·后端·golang
Chan162 小时前
批处理优化:从稳定性、性能、数据一致性、健壮性、可观测性五大维度,优化批量操作
java·spring boot·后端·性能优化·java-ee·intellij-idea·优化
行者阿毅2 小时前
langchain4j+DashScope (通义千问)文生图
java·ai作画
Bug退退退1232 小时前
Java 网络流式编程
java·服务器·spring·sse
IT机器猫2 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq