doc或docx(word)或image类型文件批量转PDF脚本

doc或docx(word)或image类型文件批量转PDF脚本

1.实际生产环境中遇到文件展示只能适配PDF版本的文件,奈何一万个文件有七千个都是word或者image类型的,由此搞个脚本批量转换下上传至OSS,为前端提供数据支撑。

2.环境准备,这里使用的是aspose-words-18.6-jdk16-crack.jar工具包,资源包就不提供了,网上百度一下即可。

3.javaMaven项目,jdk1.8.maven3.6

doc或docx(word)或image类型文件批量转PDF脚本

4.使用aspose-words-18.6-jdk16-crack.jar工具包会产生水印,需要配置resources下去除水印配置:

doc或docx(word)或image类型文件批量转PDF脚本doc或docx(word)或image类型文件批量转PDF脚本
<?xml version="1.0" encoding="UTF-8" ?>
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for JavaProduct>
            <Product>Aspose.Words for JavaProduct>
        Products>
        <EditionType>EnterpriseEditionType>
        <SubscriptionExpiry>20991231SubscriptionExpiry>
        <LicenseExpiry>20991231LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7SerialNumber>
    Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=Signature>
License>

license.xml

5.工具类编写:

doc或docx(word)或image类型文件批量转PDF脚本doc或docx(word)或image类型文件批量转PDF脚本
package org.utiles.dongl.tools;

import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.log4j.Logger;
import org.utiles.dongl.comment.WordTranPDF;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.List;

/**
 * @ClassName: FileTranPDFTool
 * @Description TODO
 * @Author: 东霖
 * @Date: 2022/7/23 10:50
 * @Version 1.0
 **/
public class FileTranPDFTool {
    private static Logger logger = Logger.getLogger(FileTranPDFTool.class);

    public static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = WordTranPDF.class.getClassLoader().getResourceAsStream("\\license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * ImageToPDF
     * 支持类型:jpg/tif/..

     *
     * @param source
     * @param target
     */
    public static void ImageToPDF(String source, String target) {
        Document document = new Document();
        //设置文档页边距
        document.setMargins(0, 0, 0, 0);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(target);
            PdfWriter.getInstance(document, fos);
            //打开文档
            document.open();
            //获取图片的宽高
            Image image = Image.getInstance(source);
            float imageHeight = image.getScaledHeight();
            float imageWidth = image.getScaledWidth();
            //设置页面宽高与图片一致
            Rectangle rectangle = new Rectangle(imageWidth, imageHeight);
            document.setPageSize(rectangle);
            //图片居中
            image.setAlignment(Image.ALIGN_CENTER);
            //新建一页添加图片
            document.newPage();
            document.add(image);
        } catch (Exception ioe) {
            System.out.println(ioe.getMessage());
        } finally {
            //关闭文档
            document.close();
            try {
                fos.flush();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * word 文档类型转pdf
     *
     * @param inPath
     * @param outPath
     * @return
     */
    public static boolean doc2pdf(String inPath, String outPath) {
        if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
            return false;
        }
        FileOutputStream os = null;
        try {
            File file = new File(outPath); // 新建一个空白pdf文档
            os = new FileOutputStream(file);
            com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
//            doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            doc.save(os, SaveFormat.DOCX);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            // EPUB, XPS, SWF 相互转换
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (os != null) {
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

    /**
     * 遍历指定目录取文件名称
     *
     * @param foldPath 文件目录绝对路径
     * @return
     */
    public static List listFileName(String foldPath) {
        List listFiles = new ArrayList<>();
        //创建文件对象
        File f = new File(foldPath);
        //列出文件名称存入数组
        File[] files = f.listFiles();
        for (int i = 0; i < Objects.requireNonNull(files).length; i++) {
            listFiles.add(files[i].getName());
        }
        return listFiles;
    }

    /**
     * 删除指定文件
     * @param filePath
     * @return
     */
    public static boolean deleteByFilePath(String filePath) {
        File file = new File(filePath);
        return file.delete();
    }

    /**
     * 遍历指定目录取文件名称并接入路径
     *
     * @param oldPath 遍历文件目录绝对路径,也是要删除的文件目录
     * @return
     */
    public static Map listFileNameAndPath(String oldPath) {
        Map listFiles = new HashMap();
        //创建文件对象
        File f = new File(oldPath);
        //列出文件名称存入数组
        File[] files = f.listFiles();
        for (int i = 0; i < Objects.requireNonNull(files).length; i++) {
            listFiles.put(files[i].getPath(), files[i].getName());
        }
        return listFiles;
    }

    /**
     * 获取指定文件目录文件大小为0Size的
     * @param foldPath
     * @return
     */
    public static Integer getFileSize(String foldPath,String newFoldPath) {
        int j=1;
        //创建文件对象
        File file = new File(foldPath);
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].length()==0){
                Boolean aBoolean = WriteToFileExample.moveFileToTarget("D:\\OSS\\ghwb\\ghksj_1_copy\\《金东区卫生健康事业发展"十四五"规划》.pdf", newFoldPath+files[i].getName(),null);
                if (aBoolean==true){
                    j++;
                    logger.info("移动:"+files[i].getPath()+"到"+newFoldPath);
                }
                System.out.println(files[i].getPath());
            }
        }
        return j;
    }

    /**
     * 文件对比删除重复文件
     * @param oldFileNames
     * @param newPath 对比文件目录
     * @return
     */
    public static Integer deleteByFileName(Map oldFileNames, String newPath) {
        int j = 0;
        List newListNames = listFileName(newPath);
        for (Map.Entry entry : oldFileNames.entrySet()) {
            for (int i = 0; i < newListNames.size(); i++) {
                String value = entry.getValue();
                String s = newListNames.get(i);
                if (value.substring(0,value.lastIndexOf(".")).equals(s.substring(0,s.lastIndexOf(".")))) {
                    boolean b = deleteByFilePath(entry.getKey());
                    if (b==true){
                        logger.info("成功删除指定文件:"+entry.getKey()+",共计:"+j+"个");
                        j++;
                    }else{
                        logger.error("指定文件不存在:"+entry.getKey());
                    }
                }
            }
        }
        return j;
    }

    public static void main(String[] args) {
        //文件对比删除
        Map map = listFileNameAndPath("D:\\OSS\\ghwb\\word");
        int b = deleteByFileName(map, "D:\\OSS\\ghwb\\ghksj - 副本");
        //word转pdf
        doc2pdf("D:\\OSS\\ghwb\\13c5ad939a0b2001.doc",
                "D:\\OSS\\ghwb\\doc2docx\\13c5ad939a0b2001.docx");
        //移动文件size为0的数据到指定文件夹
//        getFileSize("D:\\OSS\\ghwb\\ghksj_3_copy","D:\\OSS\\ghwb\\test");
    }
}

WordORImageTranPDF

6.逻辑代码:

doc或docx(word)或image类型文件批量转PDF脚本doc或docx(word)或image类型文件批量转PDF脚本
package org.utiles.dongl.comment;

import org.apache.log4j.Logger;
import org.utiles.dongl.tools.FileTranPDFTool;
import org.utiles.dongl.tools.WriteToFileExample;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

import static org.utiles.dongl.tools.FileTranPDFTool.doc2pdf;

/**
 * @ClassName: WordTranPDF
 * @Description TODO
 * @Author: 东霖
 * @Date: 2022/7/22 8:55
 * @Version 1.0
 **/
public class WordTranPDF {
    private static Logger logger = Logger.getLogger(WordTranPDF.class);

    /**
     * 获取指定文件路径下所有文件对象
     *
     * @param inFilePath
     * @return
     */
    public static Map getFilePathName(String inFilePath,String replacePathOld
            ,String replacePathNew,String wjjl,String pdfToPath) {
        Map fileList = new HashMap();
        //创建文件对象
        File f = new File(inFilePath);
        //列出文件名称存入数组
        File[] files = f.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].getName().endsWith("docx") || files[i].getName().endsWith("doc")
                    || files[i].getName().endsWith("wps") || files[i].getName().endsWith("rtf"))
            {
//                String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"pdf";
                String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"docx";
                fileList.put(files[i].getPath()+"&"+"word",str.replace(replacePathOld,replacePathNew));
//                logger.info("当前文件路径为:"+files[i].getPath());
            } else if (files[i].getName().endsWith(".png") || files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".gif")
                    || files[i].getName().endsWith(".jpeg") || files[i].getName().endsWith(".tif"))
            {
                String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"pdf";
                fileList.put(files[i].getPath()+"&"+"image", str.replace(replacePathOld,replacePathNew));
//                logger.info("当前文件路径为:"+files[i].getPath());
            }else if(files[i].getName().endsWith(".pdf")) {
                WriteToFileExample.moveFileToTarget(files[i].getPath(),pdfToPath+files[i].getName(),"");
                logger.info("移动:"+files[i].getPath()+"到"+pdfToPath);
            }else{
                WriteToFileExample.writeFileSQL("当前文件无法转换:"+files[i].getPath(),wjjl);
            }
        }
        return fileList;
    }

    public static void start(Map hashMap) throws InterruptedException {
        long old = System.currentTimeMillis();
        int j = 0;
        for (Map.Entry entry : hashMap.entrySet()) {
//            doc2pdf(entry.getKey(),entry.getValue());
            String[] split = entry.getKey().split("&");
            if(split[1].equals("word")){
                System.out.println(entry.getValue());
                doc2pdf(split[0],entry.getValue());
                Thread.sleep(Long.parseLong("15"));
            }else if (split[1].equals("image")){
                FileTranPDFTool.ImageToPDF(split[0],entry.getValue());
                Thread.sleep(Long.parseLong("15"));
            }else {
//                break;
            }
            j++;
            logger.info("转换第:"+j+"个!"+"文件名称为:"+entry.getKey());
        }
        long now = System.currentTimeMillis();
        logger.info("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒");
        logger.info("共转换:" + j + "个文件!");
    }

    public static void main(String[] args) throws InterruptedException {
        /**
         * inFilePath: 需要转换的文件夹路径
         * replacePathOld: 抓换后的文件要写入新文件,直接替换文件的上级目录关键字即可
         * replacePathNew: 新的文件父路径
         * wjjl: 不能转换的文件记录位置及记录名称
         * pdfToPath:当文件中已有pdf不用抓换的需配置文件留存方向。会从原文件目录移动至新文件目录
         */
        Map filePathName = getFilePathName("D:\\OSS\\ghwb\\doc11",
                "doc11","doc2docx",
                "D:\\OSS\\ghwb\\"+System.currentTimeMillis()+".txt"
        ,"D:\\OSS\\yjbg\\gjxxzx\\ghksj_copy\\");
        start(filePathName);
    }
}

View Code

7.上述就是word或者image类型的批量脚本,可以在工具类中单元测试之后在使用批量逻辑代码。

Original: https://www.cnblogs.com/zhuzhu-you/p/16550232.html
Author: zhuzhu&you
Title: doc或docx(word)或image类型文件批量转PDF脚本

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593875/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 银行管理系统

    // // main.cpp //银行管理系统 // // Created by 丁小未 on 13-7-23. // Copyright (c) 2013 年 dingxiaow…

    Java 2023年5月29日
    051
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    Java 2023年6月16日
    0100
  • java后台进程和线程优先级

    后台线程:处于后台运行,任务是为其他线程提供服务。也称为”守护线程”或”精灵线程”。JVM的垃圾回收就是典型的后台线程。 特点:若所…

    Java 2023年5月29日
    069
  • SpringBoot设置时区为东八区

    问题想控制整个系统的时区为东八区 解决import org.springframework.boot.SpringApplication;import org.springfram…

    Java 2023年5月30日
    069
  • Gitee教程实战(企业级) 包含详细的出错解释

    1.1 Gitee实战 1.1.1 新建Gitee仓库上传代码 首先,需要注册Gitee账号,并创建远程仓库,然后再执行如下命令,将代码上传到GitHub. 开源许可证: 然后,我…

    Java 2023年6月13日
    072
  • java网络编程

    网络编程是指编写运行在计算机的程序,这些设备都通过网络连接起来。要实现网络通信,我们要考虑几个问题: 1.如何建立两个节点(电脑)之间的网络连接? 2.如何向另外一个节点(电脑)发…

    Java 2023年6月8日
    076
  • 戏说领域驱动设计(廿五)——领域事件

    任何事物都在变化着包括领域驱动设计这门学问。Evans在首次提到DDD概念后,后来出现了陆续又出现了很多的专家与学者对其理论进行了扩充比如:”领域事件”、&…

    Java 2023年6月7日
    075
  • MySQL七:一文详解六大日志

    转载~ 日志一般分为逻辑日志与物理日志两类 「逻辑日志」:即执行过的事务中的sql语句,执行的sql语句(增删改) 「反向」的信息 「物理日志」: mysql 数据最终是保存在数据…

    Java 2023年6月8日
    097
  • Spring Cloud Alibaba系列之分布式服务组件Dubbo

    本博客的例子代码可以在github找到下载链接:代码下载 SpringBoot、SpringCloud Alibaba系列博客专栏:链接 1、分布式理论 1.1、分布式基本定义 《…

    Java 2023年5月30日
    083
  • Java IO–压缩流

    压缩流: 压缩流的实现: zipEntry: 在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中的每一个元素的名称。 ZipOutputStream: impo…

    Java 2023年5月29日
    064
  • 修改centos7的系统编码

    今天刚跑起来的一个虚拟机,发现中文都是乱码的,所以开启了修改编码之路 使用 locale 命令查看系统编码 修改 /etc/locale.conf 文件 LANG=”z…

    Java 2023年5月29日
    069
  • Spring boot 定时器

    Timer:是java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务,使用这种方式可以让程序按照某一个频度执行,但不能在指定时…

    Java 2023年5月30日
    071
  • 线程安全,这词你懂了吗?

    前言 还记得你第一次遇到「 线程安全」这个词的时候吗? 我第一次遇到线程安全这个词是在学习多线程并发操作的时候,看到人家文章里出现这个词,还有说各种线程安全的类,但是一开始并不理解…

    Java 2023年6月10日
    067
  • centos使用openssl生成自签名SSL证书并配置到nginx

    检查OpenSSL 检查是否已经安装openssl: 一般在CentOS7上,openssl已经默认安装好了。 生成自签名的SSL证书和私钥 新建/etc/ssl/certs/ww…

    Java 2023年5月30日
    0156
  • 动力节点-王妈妈Springboot教程(六)Redis

    *官方下载地址:动力节点官网 *视频观看地址 Redis : 一个NoSQL数据库, 常用作缓存使用 (cache) Redis的数据类型: string , hash ,set …

    Java 2023年6月7日
    088
  • WPF 多线程处理(5)

    WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 项目的目录: 以下是Fi…

    Java 2023年6月7日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球