用Aspose-Java免費實現 PDF、Word、Excel、Word互相轉換並將轉換過得文件上傳OSS,返迴轉換後的文件路徑

来源:https://www.cnblogs.com/Tom-shushu/archive/2023/05/02/17367203.html
-Advertisement-
Play Games

嘿嘿嘿、嘿嘿,俺又回來了! github代碼地址 https://github.com/Tom-shushu/work-study 介面文檔有道雲 https://note.youdao.com/s/GShGsYE8 介面文檔離線版本 https://files.cnblogs.com/files/ ...


嘿嘿嘿、嘿嘿,俺又回來了!

github代碼地址 https://github.com/Tom-shushu/work-study
介面文檔有道雲 https://note.youdao.com/s/GShGsYE8
介面文檔離線版本 https://files.cnblogs.com/files/Tom-shushu/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.rar?t=1682958343&download=true

一、為什麼停更了四五個月

怎麼說呢,從去年十二月份(就是我發最後一篇文章時間)到現在已經四五個月了,這段時間感覺生活很亂,我在安安心心上班、邊上班邊學習新知識新技術然後跳槽到大廠、邊上班邊考《系統架構設計師》這三件事情之間徘徊猶豫一直持續到現在,所以導致一樣事情也沒有乾好  -------   總結一句:為什麼沒有更博客呢?一個字,就是懶,嘿嘿~

還有一個原因:就是最近朋友給介紹了一個對象,比較忙(*^▽^*)

為什麼發佈這篇文檔轉換的文章呢?因為上周我要將一個PDF轉換為Word,結果百度谷歌了所有文章,最終的結果都是“能轉換,但是只能轉換一點點,多了就要收費”,於是乎我突發奇想、心血來潮在放假的那天打算開發一款小程式實現各種文檔的轉換,在百度了一下午後發現目前都是藉助Aspose實現的,但是好像要收費,在我新建項目時偶然間發現原來Maven倉庫裡面居然有人將破解好的Jar包上傳到Maven中央倉庫了,於是我測試了一下,哈哈真香,於是就有了這篇文章。至於小程式做的怎麼樣了呢?暫時又擱置了,因為我調查了一下已經有現成的好多優秀的微信小程式可以實現各種文檔轉換了,還有就是個人小程式沒法上線,可能暫時不會做小程式了,大家有想法的可以按照自己的想法使用我的源碼,直接和前端對接做出優秀的小程式。

二、PDF相關文件操作

1.引入依賴

        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-pdf</artifactId>
            <version>23.1</version>
        </dependency>

2.代碼實現(只貼關鍵代碼,代碼我會放到GitHub跟Gitee上面,大家自取、還有完整的介面文檔我都會放出來)

① 上傳OSS工具類  OssUpLoadTools

/**
      * @description:  獲取文件保存地址
      * @return: java.lang.String
      * @author: zhouhong
      * @date: 2023/4/30 12:36
      */
    public String getSavePath() {
        ApplicationHome applicationHome = new ApplicationHome(this.getClass());
        // 保存目錄位置根據項目需求可隨意更改
        return applicationHome.getDir().getParentFile()
                .getParentFile().getAbsolutePath() + "\\src\\main\\resources\\templates\\";
    }

    /**
      * @description:  上傳文件到阿裡雲OSS
      * @return: java.lang.String
      * @author: zhouhong
      * @date: 2023/5/1 22:55
      */
    public String uploadOssFile(String fileName, File file){
        // 創建OSSClient實例。
        OSS ossClient = ossConfig.getOssClient();
        try {
            // 創建PutObjectRequest對象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucketName(),
                    fileName, file);
            putObjectRequest.setProcess("true");
            // 上傳文件。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // 如果上傳成功,則返回200。
            if (result.getResponse().getStatusCode() == 200) {
                return result.getResponse().getUri();
            }
        } catch (OSSException oe) {
        } catch (ClientException ce) {
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }

② PDF轉其他文件

    /**
      * @description: PDF 轉其他文件
      * @return: java.util.List<java.lang.String>
      * @author: zhouhong
      * @date: 2023/5/1 23:34
      */
    @Override
    public List<String> pdfToFile(MultipartFile file,String type) {
        List<String> res = new ArrayList<>();
        String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!"pdf".equals(checkType)) {
            throw new ServiceException(1, "輸入文件不是PDF文件!");
        }
        try {
            switch (type.toUpperCase()) {
                case "WORD" : {
                    return switchFile(file, com.aspose.pdf.SaveFormat.DocX, "docx");
                }
                case "XML" : {
                    return switchFile(file, SaveFormat.PdfXml, "xml");
                }
                case "EXCEL" : {
                    return switchFile(file, com.aspose.pdf.SaveFormat.Excel, "xlsx");
                }
                case "PPT" : {
                    return switchFile(file, com.aspose.pdf.SaveFormat.Pptx, "pptx");
                }
                case "PNG" : {
                    // 圖片類型的需要獲取每一頁PDF,一張一張轉換
                    Document pdfDocument = new Document(file.getInputStream());
                    //解析度
                    Resolution resolution = new Resolution(130);
                    PngDevice pngDevice = new PngDevice(resolution);
                    //
                    if (pdfDocument.getPages().size() <= 10) {
                        for (int index = 0; index < pdfDocument.getPages().size(); index++) {
                            String fileName = UUID.randomUUID() + ".png";
                            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
                            File tmpFile = new File(filePath);
                            FileOutputStream fileOS = new FileOutputStream(tmpFile);
                            pngDevice.process(pdfDocument.getPages().get_Item(index), fileOS);
                            res.add(ossUpLoadTools.uploadOssFile(fileName, tmpFile));
                            fileOS.close();
                            tmpFile.delete();
                        }
                    } else {
                        throw new ServiceException(2, "抱歉超過10頁暫時無法轉圖片");
                    }
                    return res;
                }
                case "HTML" : {
                    String fileName = UUID.randomUUID() + ".html";
                    String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
                    Document doc = new Document(file.getInputStream());

                    HtmlSaveOptions saveOptions = new HtmlSaveOptions();
                    saveOptions.setFixedLayout(true);
                    saveOptions.setSplitIntoPages(false);
                    saveOptions.setRasterImagesSavingMode(HtmlSaveOptions.RasterImagesSavingModes.AsExternalPngFilesReferencedViaSvg);
                    doc.save(filePath , saveOptions);
                    doc.close();
                    File outputfile  = new File(filePath);
                    res.add(ossUpLoadTools.uploadOssFile(fileName, outputfile));
                    outputfile.delete();
                    return res;
                }
                default:{}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private List<String> switchFile(MultipartFile file, SaveFormat saveFormat, String suffix) {
        List<String> resUrl = new ArrayList<>();
        try {
            long old = System.currentTimeMillis();
            // 輸出路徑
            String fileName = UUID.randomUUID() + "." + suffix;
            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
            FileOutputStream os = new FileOutputStream(filePath);
            Document doc = new Document(file.getInputStream());
            doc.save(os, saveFormat);
            os.close();
            doc.close();
            File outputfile  = new File(filePath);
            resUrl.add(ossUpLoadTools.uploadOssFile(fileName, outputfile));
            outputfile.delete();
            long now = System.currentTimeMillis();
            log.info("共耗時:" + ((now - old) / 1000.0) + "秒");

        }catch (IOException e) {
            e.printStackTrace();
        }
        return resUrl;
    }

 ③ 合併兩個、多個PDF文件

    /**
      * @description: 合併兩個PDF文件
      * @return: java.lang.String
      * @author: zhouhong
      * @date: 2023/5/1 23:40
      */
    @Override
    public String mergeTwoPdfFile(MultipartFile  file1, MultipartFile file2) {
        try {
            Document doc1 = new Document(file1.getInputStream());
            Document doc2 = new Document(file2.getInputStream());
            doc1.getPages().add(doc2.getPages());

            String fileName = UUID.randomUUID() + ".pdf";
            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
            doc1.save(filePath);
            doc1.close();
            File outputfile  = new File(filePath);
            String res = ossUpLoadTools.uploadOssFile(fileName, outputfile);
            outputfile.delete();
            return res;
        } catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }
    /**
      * @description:  合併對個PDF文件
      * @return: java.lang.String
      * @author: zhouhong
      * @date: 2023/5/1 23:40
      */
    @Override
    public String mergeMorePdfFile(MultipartFile ... file) {
        try {
            String mergeFileName = UUID.randomUUID() + ".pdf";
            String mergePdfPath = ossUpLoadTools.getSavePath() + "/"  + mergeFileName;
            String[] chilPdfPath = new String[file.length];
            // 讀取PDF並獲取路徑
            for (int i = 0; i < file.length; i++) {
                String fileName = UUID.randomUUID() + ".pdf";
                String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
                FileOutputStream os = new FileOutputStream(filePath);
                Document doc = new Document(file[i].getInputStream());
                doc.save(os);
                chilPdfPath[i] = filePath;
                os.close();
                doc.close();
            }
            // 合併多個PDF
            PdfFileEditor pdfFileEditor = new PdfFileEditor();
            pdfFileEditor.concatenate(chilPdfPath, mergePdfPath);

            // 讀取文件上傳OSS
            File outputfile  = new File(mergePdfPath);
            String resUrl = ossUpLoadTools.uploadOssFile(mergeFileName, outputfile);
            outputfile.delete();
            return resUrl;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

三、Excel相關操作

1.引入相關依賴

        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>22.10</version>
        </dependency>

2.相關關鍵代碼

    /**
      * @description: Excel轉其他文件
      * @return: java.lang.String
      * @author: zhouhong
      * @date: 2023/5/1 23:44
      */
    @Override
    public String excelToFile(MultipartFile file, String type) {
        String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!"xlsx".equals(checkType) && !"xls".equals(checkType)) {
            throw new ServiceException(1, "輸入文件不是Excel文件!");
        }
        try {
            switch (type.toUpperCase()) {
                /******************** 文檔類型 ***************/
                case "WORD" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.DOCX, "docx");
                }
                case "PDF" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.PDF, "pdf");
                }
                case "PPT" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.PPTX, "pptx");
                }
                case "HTML" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.HTML, "html");
                }
                case "JSON" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.JSON, ".json");
                }
                case "MARKDOWN" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.MARKDOWN, "md");
                }
                /***************** 圖片類型 (註意圖片格式的預設只轉換第一個 Sheet1)*********************/
                case "PNG" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.PNG, "png");
                }
                case "JPG" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.JPG, "jpg");
                }
                case "BMP" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.BMP, "bmp");
                }
                case "CSV" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.CSV, "csv");
                }
                case "SVG" : {
                    return SwitchFile(file, com.aspose.cells.SaveFormat.SVG, "svg");
                }
                // 好像有問題,有需要大家自己調試一下
//                case "XML" : {
//                    return SwitchFile(file, com.aspose.cells.SaveFormat.XML, "xml");
//                }
                default:{}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private String SwitchFile(MultipartFile file, int saveFormat, String suffix) {
        String url = "";
        try {
            long old = System.currentTimeMillis();
            String fileName = UUID.randomUUID() + "." + suffix;
            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
            FileOutputStream os = new FileOutputStream(filePath);
            //載入源文件數據
            Workbook excel = new Workbook(file.getInputStream());
            //設置轉換文件類型並轉換
            excel.save(os, saveFormat);
            os.close();
            File outputfile  = new File(filePath);
            url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
            outputfile.delete();
            long now = System.currentTimeMillis();
            log.info("共耗時:" + ((now - old) / 1000.0) + "秒");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

四、Word相關操作

1.引入相關依賴

        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-words</artifactId>
            <version>23.1</version>
        </dependency>

2.關鍵代碼

    @Override
    public String wordToFile(MultipartFile file, String type) {
        String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!"doc".equals(checkType) && !"docx".equals(checkType)) {
            throw new ServiceException(1, "輸入文件不是Word文件!");
        }
        try {
            switch (type.toUpperCase()) {
                case "TEXT" : {
                    return switchFile(file, SaveFormat.TEXT, "txt");
                }
                case "PDF" : {
                    return switchFile(file, com.aspose.words.SaveFormat.PDF, "pdf");
                }
                /*************** 需要操作每一頁Word文件,一般Word類的直接電腦操作,應該用不上************/
//                case "PNG" : {
//                    return switchFile(file, com.aspose.words.SaveFormat.PNG, "png");
//                }
//                case "JPG" : {
//                    return switchFile(file, com.aspose.words.SaveFormat.JPEG, "jpg");
//                }
                default:{}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private String switchFile(MultipartFile file, int saveFormat, String suffix){
        String url = "";
        try {
            long old = System.currentTimeMillis();
            // 輸出路徑
            String fileName = UUID.randomUUID() + "." + suffix;
            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
            FileOutputStream os = new FileOutputStream(filePath);
            com.aspose.words.Document doc = new com.aspose.words.Document(file.getInputStream());
            doc.save(os, saveFormat);
            os.close();
            File outputfile  = new File(filePath);
            url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
            outputfile.delete();
            long now = System.currentTimeMillis();
            log.info("共耗時:" + ((now - old) / 1000.0) + "秒");
        }catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

五、PPT相關操作

1.引入相關依賴

 <dependency>
    <groupId>com.luhuiguo</groupId>
<artifactId>aspose-slides</artifactId>
<version>23.1</version>
</dependency>

2.關鍵部分代碼

    @Override
    public String PptToFile(MultipartFile file, String type) {
        // 獲取文件尾碼名
        String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!"ppt".equals(checkType) && !"pptx".equals(checkType)) {
            throw new ServiceException(1, "輸入文件不是PPT文件!");
        }
        try {
            switch (type.toUpperCase()) {
                case "HTML" : {
                    return SwitchFile(file, com.aspose.slides.SaveFormat.Html, "html");
                }
                case "HTML5" : {
                    return SwitchFile(file, com.aspose.slides.SaveFormat.Html5, "html");
                }
                case "PDF" : {
                    return SwitchFile(file, com.aspose.slides.SaveFormat.Pdf, "pdf");
                }
                default:{}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private String SwitchFile(MultipartFile file, int saveFormat, String suffix) {
        String url = "";
        try {
            long old = System.currentTimeMillis();
            String fileName = UUID.randomUUID() + "." + suffix;
            String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
            FileOutputStream os = new FileOutputStream(filePath);
            //載入源文件數據
            Presentation ppt = new Presentation(file.getInputStream());
            //設置轉換文件類型並轉換
            ppt.save(os, saveFormat);
            os.close();
            File outputfile  = new File(filePath);
            url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
            // 刪除臨時文件
            outputfile.delete();
            long now = System.currentTimeMillis();
            log.info("共耗時:" + ((now - old) / 1000.0) + "秒");
            return url;
        }catch (IOException e) {
            e.printStackTrace();
        }
        return url;
    }

六、同時我還找到了一個幾乎所有文件轉換圖片的工具類,被我稍作修改,就可以實現文件轉圖片,返回阿裡雲圖片的儲存地址集合啦

七、演示(演示有兩個意思一下,別的大家自行測試)

1.PDF轉Word

我有一個 cs.pdf 的PDF文件,通過調用PDF 轉其他文件的介面,將其轉換為 Wprd 形式 

 通過訪問返回的地址就可以發現,文件已經被轉換為Word格式的文件啦~

 

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


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

-Advertisement-
Play Games
更多相關文章
  • Springboot的優點 內置servlet容器,不需要在伺服器部署 tomcat。只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目 SpringBoot提供了starter,把常用庫聚合在一起,簡化複雜的環境配置,快速搭建spring應用環境 可以快速創建獨立 ...
  • Runtime包 GOMAXPROCS() ​ 用來設置可以並行計算的CPU核數最大值,並返回之前的值,具體使用方法上一篇有些,這裡不再贅述 Gosched() ​ 用於讓出CPU時間片,讓出當前goroutine的執行許可權,調度器安排其他等待的任務運行,併在下次某個時候從該位置恢復執行 Goexi ...
  • 在前兩篇: .NET Core部署到linux(CentOS)最全解決方案,常規篇 .NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx) 我們對.netcore部署到linux有了一個充分的瞭解,已經可以滿足應用要求了,這篇文章我們繼續深入... ...
  • 這一篇簡單說明 CH32V208 的片記憶體儲結構和時鐘的特點, 以及通過 SDK 中的示例代碼分析 CH32V208 的時鐘設置 ...
  • CH32V208系列是沁恆32位RISC-V中比較新的一個系列, 基於青稞RISC-V4C內核, 最高144MHz主頻, 64KB SRAM,128KB Flash, 供電電壓2.5/3.3V. 這個型號的特點: 除了特有的硬體堆棧區、快速中斷入口, 片上集成了2Mbps低功耗藍牙BLE 5.3, ... ...
  • (初探MySQL) 前言 周所周知MySQL已成為全世界最受歡迎的資料庫之一。無論你用的何種編程語言在開發系統,資料庫基本上都是必不可少的。 無論是小型項目開發如我們開發一個個人博客系統,還是構建那些聲名顯赫的網站如某寶、某訊等,MySQL都有著穩定、可靠、快速等優點。可以勝任數據存儲的業務需求。 ...
  • 1. 消滅NULL 1.1. NULL惹人討厭的原因 1.1.1. 進行SQL編碼時,必須考慮違反人類直覺的三值邏輯 1.1.2. 指定IS NULL、IS NOT NULL的時候,不會用到索引,SQL語句執行起來性能低下 1.1.2.1. 1 + NULL = NULL 2- NULL = NUL ...
  • 前言 地址:https://www.cnblogs.com/FReQuenter5156/p/setblog.html/ 如題,使用的是 Simple Memory 主題。 Github 連接:https://github.com/BNDong/Cnblogs-Theme-SimpleMemory。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...