doc或docx(word)或image類型文件批量轉PDF腳本

来源:https://www.cnblogs.com/zhuzhu-you/archive/2022/08/07/16550232.html
-Advertisement-
Play Games

doc或docx(word)或image類型文件批量轉PDF腳本 1.實際生產環境中遇到文件展示只能適配PDF版本的文件,奈何一萬個文件有七千個都是word或者image類型的,由此搞個腳本批量轉換下上傳至OSS,為前端提供數據支撐。 2.環境準備,這裡使用的是aspose-words-18.6-j ...


doc或docx(word)或image類型文件批量轉PDF腳本

1.實際生產環境中遇到文件展示只能適配PDF版本的文件,奈何一萬個文件有七千個都是word或者image類型的,由此搞個腳本批量轉換下上傳至OSS,為前端提供數據支撐。

2.環境準備,這裡使用的是aspose-words-18.6-jdk16-crack.jar工具包,資源包就不提供了,網上百度一下即可。

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

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

<?xml version="1.0" encoding="UTF-8" ?>
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>
license.xml

5.工具類編寫:

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<String> listFileName(String foldPath) {
        List<String> 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<String, String> listFileNameAndPath(String oldPath) {
        Map<String, String> 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<String, String> oldFileNames, String newPath) {
        int j = 0;
        List<String> newListNames = listFileName(newPath);
        for (Map.Entry<String, String> 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<String, String> 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.邏輯代碼:

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<String, String> getFilePathName(String inFilePath,String replacePathOld
            ,String replacePathNew,String wjjl,String pdfToPath) {
        Map<String, String> 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<String, String> hashMap) throws InterruptedException {
        long old = System.currentTimeMillis();
        int j = 0;
        for (Map.Entry<String, String> 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<String, String> 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類型的批量腳本,可以在工具類中單元測試之後在使用批量邏輯代碼。

本文來自博客園,作者:zhuzhu&you,轉載請註明原文鏈接:https://www.cnblogs.com/zhuzhu-you/p/16550232.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在B/S系統開發中,前後端分離開發設計已成為一種標準,而VUE作為前端三大主流框架之一,越來越受到大家的青睞,Antdv是Antd在Vue中的實現。本系列文章主要通過Antdv和Asp.net WebApi開發學生信息管理系統,簡述前後端分離開發的主要相關內容,僅供學習分享使用,如有不足之處,還請指... ...
  • vue3-admin-template 項目地址:vue3-admin-template 能拿來直接開發項目,不需要考慮格式化配置、打包編譯優化等等,難道它不香嗎?~~ 此項目是集成vue3 + vite + Element-Plus + Pinia + vue-router的後臺管理系統的模板工程 ...
  • 1 配置全局組件 當一個組件使用頻率非常高的時候,可以考慮設置其為全局組件,方便其他地方調用。 案例 我這兒封裝一個Card組件想在任何地方去使用: <template> <div class="card"> <div class="card-header"> <div>主標題</div> <div ...
  • 前言 由於業務需求,需要有一個圖片標記功能,其實就是對圖片畫框畫線做標記,類似微信的圖片編輯 但是需要存下標記圖及其標記的具體數據,。功能其實很簡單,但剛開始的時候也是費了一些功夫的。我將原項目中該功能抽離出來單獨寫了一個demo,作為記錄,同時你們在開發過程中有類似需求的話也可以參考一下該思路,其 ...
  • 原文鏈接:20 多個好用的 Vue 組件庫 在本文中,將分享一些常見的 vue.js 組件。 Tables / Data Grids Vue Tables-2 地址:https://github.com/matfish2/vue-tables-2 Vue Tables 2 旨在為開發者提供一個功能齊 ...
  • HashMap概要 代碼如果沒有特定說明,為JDK 1.8 HashMap用來存放鍵值對,是Map介面的實現,是非線程安全的 可以存儲key和value為null的值,但key為null的節點只能有一個 哈希值的計算:在hashCode的基礎上添加擾動函數,使元素分佈更加隨機 哈希衝突:通過鏈表存儲 ...
  • 一、Apach POI處理Excel的方式: 傳統Excel操作或者解析都是利用Apach POI進行操作,POI中處理Excel有以下幾種方式: 1、HSSFWorkbook: HSSFWorkbook用來處理.xls尾碼的Excel,即適用於Excel2003以前(包括2003)的版本。因為其最 ...
  • 精華筆記: 什麼是類?什麼是對象? 現實生活中是由很多很多對象組成的,基於對象抽出了類 對象:軟體中真實存在的單個個體/東西 類:類型/類別,代表一類個體 類是對象的模板/模子,對象是類的具體的實例 類中可以包含: 對象的屬性/特征 成員變數 對象的行為/動作/功能 方法 一個類可以創建多個對象 如 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...