Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 99精品视频在线观看免费播放,国产毛片一级国语版,亚洲国产精品一区二区不卡

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          URL Manager Pro Mac版(網(wǎng)頁書簽管

          URL Manager Pro Mac版(網(wǎng)頁書簽管理工具)

          大家分享一款網(wǎng)頁書簽管理工具,URL Manager Pro Mac版支持Firefox、Vivaldi、Opera、Chrome、Safari等各種瀏覽器,你可以輕松導(dǎo)入和導(dǎo)出瀏覽器的書簽,更便于用戶管理書簽,功能很實(shí)用,有需要書簽管理器的朋友可以試試URL Manager Pro mac版哦!

          URL Manager Pro for mac官方介紹

          URL Manager Pro是Safari,Chrome,Chromium,Edge,Vivaldi,Opera,iCab和Firefox瀏覽器的專業(yè)書簽管理器,使書簽管理變得更加容易。

          這是1996年以來的經(jīng)典版本,但現(xiàn)在已改寫為64位應(yīng)用程序。

          https://www.mac69.com/mac/9704.html

          URL Manager Pro mac版功能特點(diǎn)

          - 系統(tǒng)范圍的訪問:您可以通過系統(tǒng)菜單在任何應(yīng)用程序中訪問書簽。

          - 集成:您可以從瀏覽器的菜單欄和macOS Dock中訪問書簽。

          - 文檔存儲:您的書簽存儲在URL Manager Pro書簽文檔中,您可以用普通的Mac方式存儲和操作它們。無需在瀏覽器的首選項(xiàng)文件夾中尋找書簽。您可以進(jìn)行自動定期保存,并在每次保存時(shí)在備份設(shè)備上制作書簽文檔的副本。

          - 歷史記錄:您可以使用幾種不同的瀏覽器瀏覽Web,而URL Manager Pro會繼續(xù)記錄每個(gè)瀏覽器的歷史記錄。

          - 導(dǎo)入和導(dǎo)出書簽:“文件”菜單為您提供URL Manager Pro可以導(dǎo)入和導(dǎo)出到的所有瀏覽器的列表。通過掃描HTML和文本文件中的書簽和URL,它可以讓您“收獲”書簽。

          - 它使您可以快速編輯和組織書簽:您可以使用內(nèi)聯(lián)編輯,為書簽添加標(biāo)簽和上色。

          家好,我是 Java陳序員。

          瀏覽器是我們上網(wǎng)沖浪的必備工具,每次打開瀏覽器默認(rèn)都是先看到起始頁。

          有的瀏覽器起始頁十分簡潔美觀,而有的則是充滿了各種網(wǎng)址導(dǎo)航和廣告。

          今天,給大家介紹一個(gè)瀏覽器起始頁配置插件,支持自定義配置。

          關(guān)注微信公眾號:【Java陳序員】,獲取開源項(xiàng)目分享、AI副業(yè)分享、超200本經(jīng)典計(jì)算機(jī)電子書籍等。

          項(xiàng)目介紹

          Howdz Dashboard —— 一個(gè)基于 Vue3、Typescript、Vite 的完全自定義配置的瀏覽器起始頁,支持 Chrome 插件和 Edge 插件。

          功能特色:

          • 提供基于文檔流的響應(yīng)布局或 Fixed 模式固定任意位置的兩種布局模式
          • 響應(yīng)式設(shè)計(jì),編輯模式下拖拽組件更改其大小和位置
          • 組件可自由添加或刪除,并且組件的樣式和功能都是可配置的
          • 數(shù)據(jù)可使用密鑰或 JSON 文件導(dǎo)出以實(shí)現(xiàn)數(shù)據(jù)同步功能
          • 預(yù)設(shè)多種主題,初始進(jìn)入可任意選擇
          • 支持本地壁紙、隨機(jī)壁紙,隨機(jī)壁紙支持收藏個(gè)人壁紙庫
          • 可配置動態(tài)壁紙背景,選用官方提供或自行添加網(wǎng)絡(luò)視頻路徑即可
          • 可配置多標(biāo)簽頁模式,允許添加切換多個(gè)隔離的頁面
          • 可配置組件交互行為,設(shè)置點(diǎn)擊組件彈出另一個(gè)組件等交互操作
          • 預(yù)覽模式, 支持用于分享用的數(shù)據(jù)隔離模式
          • 支持語言切換,當(dāng)前支持簡體中文與英文

          項(xiàng)目地址:

          https://github.com/leon-kfd/Dashboard

          在線體驗(yàn)地址:

          https://www.howdz.xyz/

          功能體驗(yàn)

          預(yù)設(shè)多種主題,初始進(jìn)入可任意選擇。

          可動態(tài)設(shè)置壁紙,支持純色壁紙、本地圖片壁紙、網(wǎng)絡(luò)圖片壁紙、隨機(jī)圖片壁紙,隨機(jī)圖片壁紙支持收藏個(gè)人壁紙庫。

          Tips:左下角的圖標(biāo)按鈕可以更新壁紙和收藏壁紙。

          壁紙還支持多種動畫特效。

          可以從物料組件庫自行添加自己需要的組件,添加的組件提供很多樣式和功能的配置進(jìn)行修改,并通過拖拽更改組件位置和大小。

          提供大量組件用于定制化你的起始頁,可適配響應(yīng)式設(shè)計(jì)。

          物料組件

          Howdz Dashboard 提供大量組件用于定制化起始頁,這里挑選幾個(gè)比較有趣的組件。

          Empty - 占位: 占位區(qū)塊組件,支持一些簡單配置與自定義文本。

          Day - 自定義日期: 基于 Dayjs 的 formatter 格式化占位符語法實(shí)現(xiàn)自定義各種日期格式。

          Verse - 隨機(jī)古詩: 隨機(jī)古詩組件,API 來源于 https://www.jinrishici.com/, 可配置定時(shí)刷新。

          Search - 搜索欄: 支持添加自定義搜索引擎、按 Tab 鍵快速切換搜索引擎、支持關(guān)鍵詞聯(lián)想。

          Collection - 鍵盤收藏夾: 鍵盤收藏夾,設(shè)置網(wǎng)站后按相應(yīng)按鍵自動跳轉(zhuǎn),網(wǎng)站 Icon 自動獲取。

          Iframe - 外部網(wǎng)站: 設(shè)置嵌入 Iframe,最新版瀏覽器只支持同協(xié)議(當(dāng)前網(wǎng)站為 https)的 Iframe.

          TodoList - 備忘清單: 可同時(shí)設(shè)置不同日期,點(diǎn)擊上方日期展開日期選擇器。

          Weather - 天氣: 天氣組件,支持通過 IP 自動獲取城市也可手動輸入,后續(xù)考慮添加讀取 GPS。

          CountDown - 倒計(jì)時(shí): 支持天、小時(shí)、分鐘三種單位的設(shè)置倒計(jì)時(shí)事件。

          WeiboList - 微博熱搜: 顯示最新微博熱搜列表,支持配置自動刷新。

          此外,還有掘金熱門、Github 趨勢、知乎熱榜。

          Editor - Markdown編輯器: 基于 Milkdown 實(shí)現(xiàn),支持按需加載各種插件包括:

          • Tooltip: 在選擇文本后會在其上方出現(xiàn)工具欄可快速切換格式
          • Slash: 斜線命令,輸入“/”后會彈出快速選擇工具欄
          • Clipboard: 為編輯器添加復(fù)制粘貼 Markdown 格式功能
          • History: 增加歷史記錄功能,使用 Ctrl+Z 和 Ctrl+Y
          • Prism: 為代碼塊增加高亮功能。

          MovieLine - 電影經(jīng)典臺詞: 隨機(jī)一句電影經(jīng)典臺詞,并展示其電影海報(bào)作為背景,支持動態(tài)設(shè)置各種顯示。

          Bookmark - 書簽: 書簽管理器,當(dāng)前文件夾只支持一級目錄。

          • 添加時(shí)輸入網(wǎng)址可自動獲取網(wǎng)站 ICON 與標(biāo)題
          • 圖標(biāo)樣式、大小、背景色都可自定義,圖標(biāo)可緩存為 Base64
          • 支持從 Chrome 內(nèi)核的瀏覽器導(dǎo)出的書簽 HTML 文件導(dǎo)入

          最后

          推薦的開源項(xiàng)目已經(jīng)收錄到 GitHub 項(xiàng)目,歡迎 Star:

          https://github.com/chenyl8848/great-open-source-project

          或者訪問網(wǎng)站,進(jìn)行在線瀏覽:

          https://chencoding.top:8090/#/

          大家的點(diǎn)贊、收藏和評論都是對作者的支持,如文章對你有幫助還請點(diǎn)贊轉(zhuǎn)發(fā)支持下,謝謝!

          章最后提供源碼下載地址

          市面上處理文字的的辦公軟件有很多,包括WPS、MSOffice、永中OFFICE,當(dāng)然還有開源的openoffice、liboffice等。我們在項(xiàng)目開發(fā)過程中經(jīng)常會遇到預(yù)覽word文件,數(shù)據(jù)庫中數(shù)據(jù)自動填充word模板等需求。現(xiàn)在能夠滿足以上需求的技術(shù)有很多,服務(wù)端可通過POI\aspose等處理,也可通過客戶端調(diào)用OFFICE組件處理,本人曾經(jīng)在這方便做了很多測試,最終發(fā)現(xiàn)兼容性最好的、接口對JAVA程序員最友好的就屬永中OFFICE,因?yàn)樗揪褪荍AVA實(shí)現(xiàn)的,使用起來非常方便。

          我的測試環(huán)境使用的是永中2016版本,它運(yùn)行要求JRE1.6,且我發(fā)現(xiàn)它應(yīng)該是對JRE進(jìn)行過重構(gòu),按永中SDK要求編寫代碼通過自O(shè)RACAL官網(wǎng)下載的jdk1.6編譯后運(yùn)行是失敗的,現(xiàn)在都2021年了,我們的項(xiàng)目絕大多數(shù)都JDK1.8以上版本了,那么怎么讓SDK兼容我們的項(xiàng)目呢?怎么實(shí)現(xiàn)標(biāo)題中提到的兩個(gè)需求呢?下面我說說我的處理方法吧:

          1、下載永中軟件并安裝(官網(wǎng)下載即可)

          2、安裝后打開安裝路徑可以看到如下圖

          永中軟件安裝目錄

          JRE:即永中軟件的運(yùn)行環(huán)境

          Yozo_Office.jar: 即永中為開發(fā)者提供的SDK,可以將jar導(dǎo)入到工程中

          3、編寫WORD文件處理服務(wù)組件

          處理word文件的代碼片段,詳細(xì)代碼請?jiān)谖暮笙螺d源碼查閱	
          
          /**
          	 * 將word文件轉(zhuǎn)換為對應(yīng)格式的文件的字節(jié)數(shù)組
          	 * @param type 將word文件轉(zhuǎn)換成的文件格式 pdf、html\ofd\txt\xml
          	 * @return
          	 * @throws IOException
          	 */
          	public byte[]  convertFile(String type) throws IOException {
          		int typePdf=FileConstants.TYPE_PDF;
          		if("html".equals(type.toLowerCase())) {//此功能轉(zhuǎn)換后亂碼,后期可采用 this.workbook.saveAs("D:/2.html"); 方式存儲html后,將字節(jié)返回
          			typePdf=FileConstants.FILETYPE_HTML;
          		}else if("ofd".equals(type.toLowerCase())) {
          			typePdf=FileConstants.TYPE_OFD;	// 這個(gè)是不成功的,應(yīng)該是版本太低
          		}else if("txt".equals(type.toLowerCase())) {
          			typePdf=FileConstants.TYPE_TXT;
          		}else if("xml".equals(type.toLowerCase())) {
          			typePdf=FileConstants.FILETYPE_XML;
          		}else if("doc".equals(type.toLowerCase())||"xls".equals(type.toLowerCase())||"ppt".equals(type.toLowerCase())) {
          			typePdf=FileConstants.TYPE_MS;
          		}else if("docx".equals(type.toLowerCase())||"xlsx".equals(type.toLowerCase())||"pptx".equals(type.toLowerCase())) {
          			typePdf=FileConstants.TYPE_MS_EX;
          		}
          		
          		return this.workbooks.getWorkbookAsByteArray(workbook, typePdf);
          	}
          
          /**
          	 * 替換word模板中的書簽
          	 * @param jsonObject	數(shù)據(jù)內(nèi)容 {“bookmarkname”:”test“}
          	 */
          	public void replaceBookMark(JSONObject jsonObject) {
          	    BookMarks bookMarks=this.document.getBookMarks();
                  BookMark[] allBookmarks=bookMarks.getAllBookmarks();
          		for(BookMark bookMark:allBookmarks){
                      String name=bookMark.getName();
                      TextRange range=bookMark.getRange();
                      //if(name!=null)name=name.replace("PO_","");
                      String value="";
                      Object o=jsonObject.get(name);
                      if(o!=null){
                          value=jsonObject.get(name).toString();
                      }
                      try { 
                              range.insertText(value);               
                      }catch (Exception e){
                          range.insertText(value);
                      }
          		}
          	}
          
          /**
          	 * 導(dǎo)出數(shù)據(jù)成excel文件
          	 * @param jsonObject	數(shù)據(jù)內(nèi)容 {“bookmarkname”:”test“}
          	 */
          public byte[] exportData2File(JSONArray taskArray,int allrow) {
          
          }

          4、(重點(diǎn))解決word文件處理組件與我們的項(xiàng)目文件交互問題

          本人通過SOCKET即時(shí)通訊服務(wù)解決數(shù)據(jù)交互問題

          /**
           * 文件傳輸Server端<br>
           * 功能說明:
            * @Author 空中智囊
           * @Date 2016年09月01日
           * @version 1.0
           */
          public class SocketService extends ServerSocket {
              private static final int SERVER_PORT=8899; // 服務(wù)端端口
          
              private WordUtil wordUtil=null;
              public SocketService() throws Exception {
                  super(SERVER_PORT);
                  this.wordUtil=new WordUtil();
              }
          
              /**
               * 使用線程處理每個(gè)客戶端傳輸?shù)奈募?
               * @throws Exception
               */
              public void load() throws Exception {
                  System.out.println("服務(wù)端啟動,監(jiān)聽端口為:"+SERVER_PORT);
                  while (true) {
                      // server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
                      Socket socket=this.accept();
                      socket.setSoTimeout(1200000);
                      /**
                       * 我們的服務(wù)端處理客戶端的連接請求是同步進(jìn)行的, 每次接收到來自客戶端的連接請求后,
                       * 都要先跟當(dāng)前的客戶端通信完之后才能再處理下一個(gè)連接請求。 這在并發(fā)比較多的情況下會嚴(yán)重影響程序的性能,
                       * 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式
                       */
                      // 每接收到一個(gè)Socket就建立一個(gè)新的線程來處理它
                      new Thread(new Task(socket,wordUtil)).start();
          
                  }
              }
              /**
               * 入口
               * @param args
               */
              public static void main(String[] args) {
                  try {
                      SocketService server=new SocketService(); // 啟動服務(wù)端
                      server.load();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
          /**
           * 處理客戶端傳輸過來的文件線程類
           */
          public class Task implements Runnable {
            @Override
              public void run() {
                  System.out.println("===客戶端連接成功=====");
          
                  System.out.println("****************************************************************");
                  SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                  /**
                   * 轉(zhuǎn)換要求的格式
                   */
                  try {
          
                      /********************************讀取文件信息********************************/
                      dis=new DataInputStream(socket.getInputStream());
                      // 文件名和長度
                      String fileName=dis.readUTF();//1、文件名字
                      long fileLength=dis.readLong();//2、長度
                      String toext=dis.readUTF();//3、擴(kuò)展名
                      String taskType=dis.readUTF();//4、文件操作類型
                      System.out.println("針對文件的操作類型====="+taskType);
                      String valueObject=dis.readUTF();//5、替換書簽的值
                      System.out.println(format.format(new Date())+":開始接收文件");
                      ByteArrayOutputStream bos=new ByteArrayOutputStream((int)fileLength);
                      byte[] bytes=new byte[1024];
                      int length=0;
                      while((length=dis.read(bytes, 0, bytes.length)) !=-1) {
                          bos.write(bytes, 0, length);
                      }
                      byte[] filebytes=bos.toByteArray();
                      System.out.println("原始文件大小====="+fileLength+",實(shí)際接收文件大小="+filebytes.length);
          
                      /********************************讀取文件信息結(jié)束********************************/
          
                      dos=new DataOutputStream(socket.getOutputStream());
          
                      /********************************校驗(yàn)文件信息********************************/
                      boolean process=true;
                      if(fileLength>0){
                      }else{
                          dos.writeUTF("error");
                          dos.flush();
          
                          dos.writeUTF("文件沒有任何內(nèi)容,請重新傳送");
                          dos.flush();
                          process=false;
                      }
                      if(filebytes.length!=fileLength){
                          dos.writeUTF("error");
                          dos.flush();
          
                          dos.writeUTF("接受文件與實(shí)際文件大小不符合,請重新傳送文件");
                          dos.flush();
                          process=false;
                      }
                      /********************************校驗(yàn)文件信息結(jié)束********************************/
          
                      /********************************處理文件********************************/
                      if(process){
                          byte[] fileBytes=null;
                          
                          this.wordUtil.openFile(filebytes,fileName);//打開院文件
                          //workbook=workbooks.createWorkbookFromByteArray(filebytes,fileName);
                          String lowerExt=toext.toLowerCase();
                          if("convertFile".equals(taskType)){
                              System.out.println("開始將文件["+fileName+"]轉(zhuǎn)換成===="+lowerExt);
                              fileBytes=this.wordUtil.convertFile(lowerExt);
                              System.out.println(format.format(new Date())+":轉(zhuǎn)換"+toext+"完成");
                          }else if("replaceBookMark".equals(taskType)){
                              System.out.println("開始將文件["+fileName+"]書簽進(jìn)行替換====");
                              JSONObject jsonObject=JSONObject.fromObject(valueObject);
                              this.wordUtil.replaceBookMark(jsonObject);
                              fileBytes=this.wordUtil.convertFile(lowerExt);
                              System.out.println("===============替換書簽完成============");
                          }else if("exportTask".equals(taskType)) {//處理業(yè)務(wù)數(shù)據(jù) 導(dǎo)出任務(wù)數(shù)據(jù)
                          	System.out.println("開始導(dǎo)出業(yè)務(wù)數(shù)據(jù)===="+valueObject);
                          	ServiceUtil serviceUtil=new ServiceUtil(this.wordUtil);
                          	JSONObject jsonObject=JSONObject.fromObject(valueObject);
                          	fileBytes=serviceUtil.exportData2File(jsonObject.getJSONArray("datalist"), jsonObject.getInt("size"));
                          	 System.out.println("===============導(dǎo)出業(yè)務(wù)數(shù)據(jù)完成============");
                          }
                          
                          
                          /********************************處理文件結(jié)束********************************/
                          if(fileBytes==null){
                              dos.writeUTF("error");
                              dos.flush();
                              dos.writeUTF("處理文件過程中錯(cuò)誤");
                              dos.flush();
                              process=false;
                          }
          
          
                          /********************************返回處理過的文件********************************/
                          if(process){
                              dos.writeUTF("info");//文件處理完成,將信息返回到客戶端
                              dos.flush();
                              int fileBytelength=fileBytes.length;//轉(zhuǎn)換后的文件長度
                              System.out.println(format.format(new Date())+":========服務(wù)端開始發(fā)送文件流,文件大小("+getFormatFileSize(fileBytelength)+")========");
                              dos.writeLong(fileBytelength);
                              dos.flush();
                              dos.write(fileBytes, 0, fileBytelength);//將文件一起寫入到輸出流發(fā)送
                              dos.flush();
                              System.out.println(format.format(new Date())+":========發(fā)送文件流成功========");
                          }
                          /********************************返回處理過的文件完成********************************/
          
                      }
                  } catch (Exception e) {
                      String error=e.toString();
                      System.out.println("error==================="+error);
                      StackTraceElement[] stackTrace=e.getStackTrace();
                      for(StackTraceElement s:stackTrace){
                          int lineNumber=s.getLineNumber();
                          String methodName=s.getMethodName();
                          String className=s.getClassName();
                          String filename=s.getFileName();
                          System.out.print("err:"+filename+"  "+className+"  "+methodName+"  "+lineNumber);
                          System.out.println("");
                      }
                      try {
                          dos.writeUTF("error");
                          dos.flush();
                          dos.writeUTF("處理文件過程中錯(cuò)誤=="+e.toString());
                          dos.flush();
                      }catch (Exception ex){
                          String exrror=ex.toString();
                          System.out.println("返回?cái)?shù)據(jù)處理錯(cuò)誤信息==================="+exrror);
                      }
          
                  }finally {
                      System.out.println("關(guān)閉資源");
                      try {
                          if(wordUtil!=null)wordUtil.close();
                          socket.close();
                      } catch (Exception e) {
                          String error=e.toString();
                          System.out.println(error);
                          e.printStackTrace();
                      }
                      System.out.println("****************************************************************");
                  }
          }
          
          
          /**
           * 文件傳輸Clinet端<br>
           * 功能說明:
           * @Author 空中智囊
           * @Date 2016年09月01日
           * @version 1.0
           */
          public class SocketClient extends Socket {
              public static final Logger LOGGER=LoggerFactory.getLogger(SocketClient.class);
          
              private static final String SERVER_IP="127.0.0.1"; // word文件組件處理服務(wù)IP地址
              private static final int SERVER_PORT=8899;	// word文件組件處理服務(wù)端口
              private int soTimeout=60000;	// 服務(wù)鏈接超時(shí)時(shí)間 60s
              private Socket client=this;
              private FileInputStream fis;
              private DataOutputStream dos;
              private DataInputStream dis;
              private FileOutputStream fos;
          
              public SocketClient(String listenip, int listenport) throws Exception {
                  super(listenip, listenport);
                  this.setSoTimeout(this.soTimeout);
                  LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務(wù)端");
              }
          
              public SocketClient() throws Exception {
                  super(SERVER_IP, SERVER_PORT);
                  this.setSoTimeout(this.soTimeout);
                  LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務(wù)端");
              }
          
              public SocketClient(String listenip, int listenport, int soTimeout) throws Exception {
                  super(listenip, listenport);
                  this.setSoTimeout(soTimeout);
                  LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務(wù)端");
              }
          
              /**
               * 處理word文件
               * @param srcRealPath   模板word文件路徑絕對地址
               * @param descRealPath  處理后的文件存放地址絕對路徑
               * @param taskType      處理文件的類型 convertFile/replaceBookMark/exportTask 
               * @param jsonObject    傳給服務(wù)端的數(shù)據(jù)對象,這個(gè)參數(shù)可根據(jù)服務(wù)端需求進(jìn)行調(diào)整
               * @return  處理結(jié)果
               */
          public JSONObject processOffice(String srcRealPath, String descRealPath, String taskType, JSONObject jsonObject) {
                  JSONObject rtnObject=new JSONObject();
                  String code="200";
                  String message="";
          
                  try {
                      File file=new File(srcRealPath);
                      if (!file.exists() || !file.canWrite()) {
                          code="200";
                          message="文件不存在,或已被占用";
                          rtnObject.element("code", code);
                          rtnObject.element("message", message);
                          JSONObject var41=rtnObject;
                          return var41;
                      }
          
                      LOGGER.info(srcRealPath + "===>" + descRealPath);
                      if (file.exists() && file.canWrite()) {
                          String filename=file.getName();
                          this.fis=new FileInputStream(file);
                          this.dos=new DataOutputStream(this.client.getOutputStream());
                          this.dos.writeUTF(filename);//文件名字
                          this.dos.flush();
                          this.dos.writeLong(file.length());//文件長度
                          this.dos.flush();
                          String ext=descRealPath.substring(descRealPath.lastIndexOf(".") + 1, descRealPath.length());
                          this.dos.writeUTF(ext);//源文件后綴名字
                          this.dos.flush();
                          this.dos.writeUTF(taskType);//任務(wù)類型
                          this.dos.flush();
                          if (YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE.equals(taskType)) {
                              this.dos.writeUTF(jsonObject.toString());
                              this.dos.flush();
                          }
          
                          LOGGER.info("========開始向服務(wù)端傳送源文件" + srcRealPath + "========");
                          byte[] bytes=new byte[1024];
                          long progress=0L;
          
                          int length;
                          while((length=this.fis.read(bytes, 0, bytes.length)) !=-1) {
                              this.dos.write(bytes, 0, length);
                              this.dos.flush();
                              progress +=(long)length;
                              LOGGER.info("| " + 100L * progress / file.length() + "% |");
                          }
          
                          LOGGER.info("========文件傳輸成功 (" + file.length() / 1048576L + ")M========");
                          this.client.shutdownOutput();
                          LOGGER.info("========開始轉(zhuǎn)換" + ext + "========");
                          InputStream inputStream=this.client.getInputStream();
                          this.dis=new DataInputStream(inputStream);
                          String result=this.dis.readUTF();
                          if ("error".equals(result)) {
                              String reason=this.dis.readUTF();
                              LOGGER.info(reason);
                              code="500";
                              message=reason;
                          } else if ("info".equals(result)) {
                              long l=this.dis.readLong();
                              LOGGER.info("========轉(zhuǎn)換" + ext + "完成,文件大小(" + l / 1048576L + ")M========");
                              LOGGER.info("========開始接受" + ext + "========");
                              File newFile=new File(descRealPath);
                              if (newFile.exists()) {
                                  newFile.delete();
                              }
          
                              this.fos=new FileOutputStream(newFile);
                              progress=0L;
                              bytes=new byte[1048576];
          
                              while((length=this.dis.read(bytes, 0, bytes.length)) !=-1) {
                                  this.fos.write(bytes, 0, length);
                                  this.fos.flush();
                              }
          
                              LOGGER.info("========接受" + ext + "文件成功========");
                              this.dis.close();
                          } else {
                              code="500";
                              message="鏈接被強(qiáng)制關(guān)閉....";
                          }
                      } else {
                          code="404";
                          message="文件不存在,或已被占用:" + srcRealPath;
                      }
                  } catch (Exception e) {
                      code="500";
                      message="客戶端報(bào)錯(cuò):" + e.toString();
                      LOGGER.error("異常:",e);
          
                  } finally {
                      if (this.fis !=null) {
                          try {
                              this.fis.close();
                          } catch (Exception var38) {
                              ;
                          }
                      }
          
                      if (this.fos !=null) {
                          try {
                              this.fos.close();
                          } catch (Exception var37) {
                              ;
                          }
                      }
          
                      try {
                          this.client.close();
                      } catch (Exception var36) {
                          ;
                      }
          
                  }
          
                  rtnObject.element("code", code);
                  rtnObject.element("message", message);
                  return rtnObject;
              }
          
              public static void main(String[] args) {
                  try {
                      SocketClient socketClient=new SocketClient();
                      // 將文檔轉(zhuǎn)換成pdf文件
                      socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null);
          
                      // 將文檔轉(zhuǎn)換成pdf文件
                      JSONObject dataObject=new JSONObject();
                      dataObject.element("bookmarkname","這個(gè)是測試呢日哦那個(gè)");
                      socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);
                  } catch (Exception e) {
                      LOGGER.error("異常:",e);
          
                  }
          
              }
          }
          

          5、啟動word文件處理組件服務(wù)端

          組件啟動腳本

          nohup ./ofdServer.sh &


          6、調(diào)用服務(wù)端對word文件處理

            public static void main(String[] args) {
                  try {
                      SocketClient socketClient=new SocketClient();
                      // 將文檔轉(zhuǎn)換成pdf文件
                      socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null);
          
                      // 替換模板中的書簽值,word中插入書簽自行百度
                      JSONObject dataObject=new JSONObject();
                      dataObject.element("bookmarkname","這個(gè)是測試呢日哦那個(gè)");
                      socketClient.processOffice("D:/2.doc","D:/3.doc",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);
                  } catch (Exception e) {
                      LOGGER.error("異常:",e);
          
                  }
          
              }

          7、資源下載

          word文件處理組件服務(wù)端(開箱即用):

          鏈接: https://pan.baidu.com/s/1_ZgjoX_nuv3a7_SKkJ_D7w 提取碼: hn2r


          服務(wù)端資源內(nèi)容


          將文件復(fù)制到linux服務(wù)器,并解壓,執(zhí)行 ./ofdServer.sh ,輸出:服務(wù)端啟動,監(jiān)聽端口為:8899,即運(yùn)行成功

          word文件處理組件客戶端(開箱即用processOffice):

          鏈接: https://pan.baidu.com/s/1mtabGY87RuAGGkwKrBIvfQ 提取碼: mqxf

          客戶端資源文件內(nèi)容

          將源文件復(fù)制到項(xiàng)目指定包名,運(yùn)行SocketClient.java中的main方法,可查看運(yùn)行結(jié)果。

          最重要的一點(diǎn):服務(wù)器要安裝永中OFFICE客戶端


          主站蜘蛛池模板: 日韩国产免费一区二区三区| 日韩一区二区在线观看视频| 中文字幕在线观看一区二区| 蜜桃臀无码内射一区二区三区| 精品成人一区二区三区免费视频 | 精品一区二区三区色花堂| 99精品国产一区二区三区2021 | 少妇激情一区二区三区视频| 视频在线一区二区三区| 国产伦一区二区三区免费| 韩国美女vip福利一区| 少妇精品久久久一区二区三区| 99精品久久精品一区二区| 久久久国产一区二区三区| 精品久久久久一区二区三区| 亚洲一区二区三区无码影院| 内射白浆一区二区在线观看| 精品视频在线观看一区二区三区| 国产萌白酱在线一区二区| 国产丝袜无码一区二区视频| 国产一区风间由美在线观看| 无码av不卡一区二区三区| 国产A∨国片精品一区二区| 国产亚洲自拍一区| 国产精品无码一区二区三级| 久久高清一区二区三区| 亚洲一区二区影视| 日本精品一区二区在线播放| 国产一区二区三区电影| 国产成人高清精品一区二区三区| 国产在线不卡一区二区三区| 无码一区二区三区免费| 久久精品亚洲一区二区三区浴池 | 精品免费AV一区二区三区| 波多野结衣av高清一区二区三区| 一区二区三区四区在线观看视频 | 国产精品毛片VA一区二区三区| 久久青草精品一区二区三区| 无码国产精品一区二区免费式影视| 国产乱码精品一区二区三区麻豆| 国产拳头交一区二区|