国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑

這篇具有很好參考價值的文章主要介紹了用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

一、巴拉巴拉

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

二、PDF相關文件操作

1.引入依賴

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

2.代碼實現(xiàn)(只貼關鍵代碼,代碼我會放到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());
        // 保存目錄位置根據(jù)項目需求可隨意更改
        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){
        // 創(chuàng)建OSSClient實例。
        OSS ossClient = ossConfig.getOssClient();
        try {
            // 創(chuàng)建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);
            //加載源文件數(shù)據(jù)
            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);
            //加載源文件數(shù)據(jù)
            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;
    }

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

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

1.PDF轉Word

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

用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑

?通過訪問返回的地址就可以發(fā)現(xiàn),文件已經(jīng)被轉換為Word格式的文件啦~

用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑

?文章來源地址http://www.zghlxwxcb.cn/news/detail-431172.html

到了這里,關于用Aspose-Java免費實現(xiàn) PDF、Word、Excel、Word互相轉換并將轉換過得文件上傳OSS,返回轉換后的文件路徑的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【工具插件類教學】Unity通過Aspose讀取并顯示打開PDF,PPT,Excel,Word

    目錄 一、獲取Aspose支持.Net的DLL 二、導入Unity的Plugin文件夾 三、分別編寫四種文件的讀取顯示

    2024年02月02日
    瀏覽(98)
  • Java將Word轉換成PDF-aspose

    本文將演示用aspose-word.jar包來實現(xiàn)將Word轉換成PDF,且可以保留圖表和圖片。 在公司OA項目開發(fā)中, 需要將word版本的合同模板上傳,業(yè)務員只能下載pdf版本合同模板,需要實現(xiàn)將Word轉換成PDF,并且動態(tài)填充項目編號以及甲乙方信息等。 Aspose.Words for Java是一個原生庫,為開發(fā)

    2024年02月07日
    瀏覽(24)
  • Java實現(xiàn)Word文檔轉PDF,PDF轉Word,PDF轉Excel,PDF轉換工具

    java實現(xiàn)word文檔轉PDF,PDF轉word 解決只能轉換4頁問題 解決每頁頭部存在水印問題 引入依賴 破解的jar包 鏈接: https://pan.baidu.com/s/1MO8OBuf4FQ937R9KDtofPQ 提取碼: 4tsn 源碼路徑:https://download.csdn.net/download/weixin_43992507/88215577 像流讀取文件這些要關閉釋放,不然異常報錯文件的讀取不會

    2024年02月13日
    瀏覽(30)
  • (Java)word轉pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)導出

    (Java)word轉pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)導出

    目錄 1、引入jar包 2、pdf處理工具類 3、poi模板導出工具類 4、測試類 5、模板 6、最終效果? 1、引入jar包 ? 2、pdf處理工具類 ?3、poi模板導出工具類 ?4、測試類 5、模板 6、最終效果?

    2024年02月06日
    瀏覽(33)
  • aspose 使用ftl模板生成word和pdf

    aspose 使用ftl模板生成word和pdf

    1 先找到word模板,用${},替換變量,保存,然后另存為xml,最后把xml后綴改成ftl。 如下圖: word 模板文件 ftl模板文件如下: 2 代碼生成 下面函數(shù)將ftl填充數(shù)據(jù),并生成word和pdf 3 測試主程序 4 結果: pdf文件 word文件 還可以生成圖片:

    2024年02月13日
    瀏覽(22)
  • 使用Aspose.Words將word轉PDF并且去水印。

    使用Aspose.Words將word轉PDF并且去水印。

    ?? 作 ? ??????? 者 :是江迪呀 ?? 本文 : Java 、 工具類 、 轉換 、 word轉pdf 、 Aspose.Words 、 后端 ?? 每日?? 一言 : 只要思想不滑坡,辦法總比困難多。 在我們日常開發(fā)中經(jīng)常會有將 word文檔 轉為 PDF 的場景,有很多種方法我最傾向的的是使用 Aspose.Words ,原

    2024年02月11日
    瀏覽(31)
  • Java POI導出Word、Excel、Pdf文檔(可在線預覽PDF)

    Java POI導出Word、Excel、Pdf文檔(可在線預覽PDF)

    1、導入依賴Pom.xml ? ? ? ?dependency ?? ??? ??? ?groupIdorg.apache.poi/groupId ?? ??? ??? ?artifactIdpoi/artifactId ?? ??? ??? ?version3.14/version ?? ??? ?/dependency 2、Controller? ?3、Service a、pdfService b、wordService c、excelService ?4、Utils 5、模板截圖 ? 6、前端

    2024年02月08日
    瀏覽(92)
  • java超簡單實現(xiàn)文檔在線預覽功能,支持word\excel\text\pdf\圖片等格式轉pdf,aspost 轉pdf部署linux中文亂碼解決方案

    java超簡單實現(xiàn)文檔在線預覽功能,支持word\excel\text\pdf\圖片等格式轉pdf,aspost 轉pdf部署linux中文亂碼解決方案

    一、背景 ????????在工作中需要對上傳到服務器的各種類型包括但不限于word、pdf、excel等文件進行在線預覽,前端比較菜搞不定,只能本人親自上。 ? ? ? ? 網(wǎng)上的經(jīng)驗比較多也比較亂, 有的只有預覽,沒有文件格式轉換,有的也不說linux存在字體問題, 本文會直白的給

    2024年04月10日
    瀏覽(596)
  • 前端實現(xiàn)文件預覽(pdf、excel、word、圖片)

    前端實現(xiàn)文件預覽(pdf、excel、word、圖片)

    需求:實現(xiàn)一個在線預覽pdf、excel、word、圖片等文件的功能。 介紹:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代碼實現(xiàn)所有功能,建議以下的預覽文件標簽可以在外層包裹一層彈窗。 sandbox 這個屬性如果是單純預覽圖片可以不使用,該屬性對呈現(xiàn)在 iframe 框架中的內容

    2024年02月10日
    瀏覽(49)
  • PDF-Word-圖片等的互相轉換

    輕閃PDF客戶端 - 功能強大的一站式PDF工具 | PDF編輯、轉換、閱讀 上面頁面支持PDF轉換成各類別:鼠標停留在PDF工具,點擊轉換類型即可在線轉換 求職崗位的刪除:PDF轉word,將手機號碼依次向前面刪除替換掉求職崗位,手機號碼后面就可以正確添加空格,到對應位置將聯(lián)系地

    2024年02月07日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包