整合營(yíng)銷服務(wù)商

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

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

          java后端實(shí)現(xiàn)word上傳并轉(zhuǎn)html格式

          近有一個(gè)業(yè)務(wù)是前端要上傳word格式的文稿,然后用戶上傳完之后,可以用瀏覽器直接查看該文稿,并且可以在富文本框直接引用該文稿,所以上傳word文稿之后,后端保存到db的必須是html格式才行,所以涉及到word格式轉(zhuǎn)html格式。

          通過(guò)調(diào)查,這個(gè)word和html的處理,有兩種方案,方案1是前端做這個(gè)轉(zhuǎn)換。方案2是把word文檔上傳給后臺(tái),后臺(tái)轉(zhuǎn)換好之后再返回給前端。至于方案1,看到大家的反饋都說(shuō)很多問(wèn)題,所以就沒(méi)采用前端轉(zhuǎn)的方案,最終決定是后端轉(zhuǎn)化為html格式并返回給前段預(yù)覽,待客戶預(yù)覽的時(shí)候,確認(rèn)格式?jīng)]問(wèn)題之后,再把html保存到后臺(tái)(因?yàn)閣ord涉及到的格式太多,比如圖片,visio圖,表格,圖片等等之類的復(fù)雜元素,轉(zhuǎn)html的時(shí)候,可能會(huì)很多格式問(wèn)題,所以要有個(gè)預(yù)覽的過(guò)程)。

          對(duì)于word中普通的文字,問(wèn)題倒不大,主要是文本之外的元素的處理,比如圖片,視頻,表格等。針對(duì)我本次的文章,只處理了圖片,處理的方式是:后臺(tái)從word中找出圖片(當(dāng)然引入的jar包已經(jīng)帶了獲取word中圖片的功能),上傳到服務(wù)器,拿到絕對(duì)路徑之后,放入到html里面,這樣,返回給前端的html內(nèi)容,就可以直接預(yù)覽了。


          maven引入相關(guān)依賴包如下:

           <poi-scratchpad.version>3.14</poi-scratchpad.version>
                  <poi-ooxml.version>3.14</poi-ooxml.version>
                  <xdocreport.version>1.0.6</xdocreport.version>
                  <poi-ooxml-schemas.version>3.14</poi-ooxml-schemas.version>
                  <ooxml-schemas.version>1.3</ooxml-schemas.version>
                  <jsoup.version>1.11.3</jsoup.version>


          <dependency>
                      <groupId>org.apache.poi</groupId>
                      <artifactId>poi-scratchpad</artifactId>
                      <version>${poi-scratchpad.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.apache.poi</groupId>
                      <artifactId>poi-ooxml</artifactId>
                      <version>${poi-ooxml.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>fr.opensagres.xdocreport</groupId>
                      <artifactId>xdocreport</artifactId>
                      <version>${xdocreport.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.apache.poi</groupId>
                      <artifactId>poi-ooxml-schemas</artifactId>
                      <version>${poi-ooxml-schemas.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.apache.poi</groupId>
                      <artifactId>ooxml-schemas</artifactId>
                      <version>${ooxml-schemas.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.jsoup</groupId>
                      <artifactId>jsoup</artifactId>
                      <version>${jsoup.version}</version>
                  </dependency>

          word轉(zhuǎn)html,對(duì)于word2003和word2007轉(zhuǎn)換方式不一樣,因?yàn)閣ord2003和word2007的格式不一樣,工具類如下:

          使用方法如下:

          public String uploadSourceNews(MultipartFile file)  {
                  String fileName = file.getOriginalFilename();
                  String suffixName = fileName.substring(fileName.lastIndexOf("."));
                  if (!".doc".equals(suffixName) && !".docx".equals(suffixName)) {
                      throw new UploadFileFormatException();
                  }
                  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
                  String dateDir = formatter.format(LocalDate.now());
                  String directory = imageDir + "/" + dateDir + "/";
                  String content = null;
                  try {
                      InputStream inputStream = file.getInputStream();
                      if ("doc".equals(suffixName)) {
                          content = wordToHtmlUtil.Word2003ToHtml(inputStream, imageBucket, directory, Constants.HTTPS_PREFIX + imageVisitHost);
                      } else {
                          content = wordToHtmlUtil.Word2007ToHtml(inputStream, imageBucket, directory, Constants.HTTPS_PREFIX + imageVisitHost);
                      }
                  } catch (Exception ex) {
                      logger.error("word to html exception, detail:", ex);
                      return null;
                  }
                  return content;
              }

          關(guān)于doc和docx的一些存儲(chǔ)格式介紹:

          docx 是微軟開(kāi)發(fā)的基于 xml 的文字處理文件。docx 文件與 doc 文件不同, 因?yàn)?docx 文件將數(shù)據(jù)存儲(chǔ)在單獨(dú)的壓縮文件和文件夾中。早期版本的 microsoft office (早于 office 2007) 不支持 docx 文件, 因?yàn)?docx 是基于 xml 的, 早期版本將 doc 文件另存為單個(gè)二進(jìn)制文件。

          DOCX is an XML based word processing file developed by Microsoft. DOCX files are different than DOC files as DOCX files store data in separate compressed files and folders. Earlier versions of Microsoft Office (earlier than Office 2007) do not support DOCX files because DOCX is XML based where the earlier versions save DOC file as a single binary file.


          可能你會(huì)問(wèn)了,明明是docx結(jié)尾的文檔,怎么成了xml格式了?

          很簡(jiǎn)單:你隨便選擇一個(gè)docx文件,右鍵使用壓縮工具打開(kāi),就能得到一個(gè)這樣的目錄結(jié)構(gòu):


          所以你以為docx是一個(gè)完整的文檔,其實(shí)它只是一個(gè)壓縮文件。


          參考:

          https://www.cnblogs.com/ct-csu/p/8178932.html

          了編寫(xiě)一個(gè)Java爬蟲(chóng),你需要了解以下幾個(gè)步驟:

          1. 首先,你需要確定你要抓取的網(wǎng)站。可以從瀏覽器中復(fù)制網(wǎng)站的URL并粘貼到你的Java代碼中。
          2. 接下來(lái),你需要使用Java的網(wǎng)絡(luò)編程API連接到該網(wǎng)站。你可以使用URLConnection或HttpClient等庫(kù)。
          3. 一旦你建立了一個(gè)連接,你就可以開(kāi)始讀取網(wǎng)頁(yè)內(nèi)容。你可以使用Java的IO庫(kù)讀取網(wǎng)頁(yè)。
          4. 在讀取網(wǎng)頁(yè)內(nèi)容之后,你需要解析網(wǎng)頁(yè)以提取所需的信息。這可以使用Java的解析器,如Jsoup或XML解析器。
          5. 最后,你需要存儲(chǔ)或使用所提取的信息。你可以將信息保存到數(shù)據(jù)庫(kù)中,將其輸出到文件中,或?qū)⑵溆糜谄渌猛尽?/li>

          下面是一個(gè)基本的Java爬蟲(chóng)代碼示例,它使用Jsoup解析器和URLConnection庫(kù)連接到目標(biāo)網(wǎng)站并提取標(biāo)題和鏈接信息:

          import java.io.IOException;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.Scanner;
          
          import org.jsoup.Jsoup;
          import org.jsoup.nodes.Document;
          import org.jsoup.nodes.Element;
          import org.jsoup.select.Elements;
          
          public class SimpleWebCrawler {
            
            public static void main(String[] args) {
              String url = "https://www.example.com/";
              try {
                URLConnection conn = new URL(url).openConnection();
                conn.addRequestProperty("User-Agent", "Mozilla/5.0");
                Scanner scanner = new Scanner(conn.getInputStream());
                String html = scanner.useDelimiter("\\Z").next();
                scanner.close();
                Document doc = Jsoup.parse(html);
                Elements links = doc.select("a[href]");
                for (Element link : links) {
                  System.out.println(link.attr("href") + " - " + link.text());
                }
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }
          

          Jsoup

          Jsoup是一款用于解析HTML和XML文檔的Java庫(kù)。它提供了類似于jQuery的語(yǔ)法來(lái)操作文檔,使得解析和處理文檔變得非常簡(jiǎn)單。

          以下是Jsoup解析器的一些常用功能:

          1. 解析HTML文檔:使用Jsoup可以輕松解析HTML文檔,并且可以處理各種標(biāo)簽、屬性、文本內(nèi)容等。
          2. 獲取元素:可以使用類似于jQuery的選擇器語(yǔ)法來(lái)獲取HTML文檔中的元素,例如獲取所有的鏈接、圖片等。
          3. 修改元素:可以使用Jsoup修改HTML文檔中的元素,例如修改元素的屬性、添加或刪除元素等。
          4. 過(guò)濾HTML文檔:可以使用Jsoup過(guò)濾HTML文檔中的不必要的元素,例如過(guò)濾掉廣告、統(tǒng)計(jì)代碼等。
          5. 處理字符編碼:可以使用Jsoup來(lái)處理HTML文檔中的字符編碼,例如將文檔中的ISO-8859-1編碼轉(zhuǎn)換為UTF-8編碼等。
          6. 支持HTTPS:Jsoup還支持使用HTTPS協(xié)議獲取HTML文檔,可以使用它來(lái)爬取一些需要登錄才能訪問(wèn)的網(wǎng)站。

          總之,Jsoup是一款非常實(shí)用的HTML和XML解析器,可以幫助Java開(kāi)發(fā)者快速、簡(jiǎn)單地解析和處理HTML文檔,使得爬蟲(chóng)開(kāi)發(fā)變得更加容易。

          Jsoup的使用

          使用Jsoup解析器需要先將其添加到項(xiàng)目的依賴中。可以通過(guò)Maven或者Gradle來(lái)添加依賴。

          例如,使用Maven添加Jsoup的依賴:

          <dependency>
              <groupId>org.jsoup</groupId>
              <artifactId>jsoup</artifactId>
              <version>1.14.3</version>
          </dependency>

          添加依賴之后,就可以在Java代碼中使用Jsoup了。以下是使用Jsoup解析器獲取HTML文檔中所有鏈接的示例代碼:

          import org.jsoup.Jsoup;
          import org.jsoup.nodes.Document;
          import org.jsoup.nodes.Element;
          import org.jsoup.select.Elements;
          
          public class JsoupExample {
              public static void main(String[] args) {
                  String html = "<html><head><title>Jsoup Example</title></head>"
                          + "<body><p>Jsoup is a Java library for working with real-world HTML.</p>"
                          + "<a href=\"http://example.com\">Example</a></body></html>";
          
                  Document doc = Jsoup.parse(html); // 將HTML字符串解析為文檔對(duì)象
          
                  Elements links = doc.select("a"); // 獲取所有的鏈接元素
          
                  for (Element link : links) {
                      String href = link.attr("href"); // 獲取鏈接的URL地址
                      String text = link.text(); // 獲取鏈接的文本內(nèi)容
                      System.out.println(href + ": " + text);
                  }
              }
          }
          

          以上代碼使用Jsoup將HTML字符串解析為文檔對(duì)象,然后使用選擇器語(yǔ)法獲取所有的鏈接元素,并輸出它們的URL地址和文本內(nèi)容。

          除此之外,Jsoup還有很多其他的功能,例如修改元素、過(guò)濾HTML文檔等等,可以根據(jù)具體需求靈活運(yùn)用。

          Jsoup 解析器的常見(jiàn)功能和代碼片段示例

          1.獲取網(wǎng)頁(yè)的 Title:

          Document doc = Jsoup.connect("http://example.com/").get();
          String title = doc.title();

          2.獲取指定標(biāo)簽的文本內(nèi)容:

          Element element = doc.select("div.content").first();
          String text = element.text();

          3.獲取指定屬性的值:

          Element element = doc.select("img").first();
          String src = element.attr("src");

          4.過(guò)濾 HTML 標(biāo)簽:

          String html = "<p>這是一段 <b>加粗</b> 的文本。</p>";
          String text = Jsoup.parse(html).text();

          5.修改 HTML 內(nèi)容:

          Element element = doc.select("div.content").first();
          element.append("<p>這是新增的文本內(nèi)容。</p>");

          6.提取網(wǎng)頁(yè)中的鏈接:

          Elements links = doc.select("a[href]");
          for (Element link : links) {
              String href = link.attr("href");
              System.out.println(href);
          }

          7.提取網(wǎng)頁(yè)中的圖片:

          Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
          for (Element img : imgs) {
              String src = img.attr("src");
              System.out.println(src);
          }

          這些只是 Jsoup 解析器的常見(jiàn)用法之一。Jsoup 還有更多的功能,如解析 XML、處理表單、處理 Cookie 等,大家可以自己去了解!

          有不足之處大家也可以在評(píng)論區(qū)指出!

          近在工作中遇到一個(gè)bug,將word轉(zhuǎn)換成html,轉(zhuǎn)換成功之后在瀏覽器中打開(kāi)其中圖片不顯示,使用img標(biāo)簽,src指定圖片相對(duì)地址又是能顯示的,排除圖片問(wèn)題。

          網(wǎng)上能搜索到的demo

          打開(kāi)轉(zhuǎn)碼之后的html代碼發(fā)現(xiàn),生成的是vml圖片標(biāo)簽,這個(gè)在IE9以后就不支持了,更別說(shuō)現(xiàn)在的主流瀏覽器了。

          生成的html中使用的是vml標(biāo)簽

          將這個(gè)跟大佬分析分析,各種文檔一查,咔咔咔大致分析出問(wèn)題所在。原來(lái)jacob使用的是word本身自帶的功能,相當(dāng)于把word打開(kāi)另存為html,于是手動(dòng)將word轉(zhuǎn)為html試了一下,果然效果與代碼轉(zhuǎn)換一致,這時(shí)候注意到word另存為時(shí)有一個(gè)web選項(xiàng),里面有個(gè)使用vml渲染圖片默認(rèn)是選中的,去掉這個(gè)選項(xiàng),再次生成,圖片正常顯示。



          到這里基本已經(jīng)確定了問(wèn)題的解決思路,另存為時(shí)不勾選這個(gè)選項(xiàng),那么問(wèn)題來(lái)了,怎么利用jacob操作另存為時(shí)去掉這個(gè)選項(xiàng)呢,想去搜搜看jacob相關(guān)的文檔,結(jié)果不知道是不是因?yàn)檫@個(gè)很老了,網(wǎng)上大多數(shù)都是demo,根本沒(méi)有相關(guān)的文檔可看,Github上也是只言片語(yǔ),根本無(wú)從查起。

          jacob github 地址:https://github.com/joval/jacob

          微軟官網(wǎng)文檔

          官方文檔連接:https://docs.microsoft.com/zh-cn/office/vba/api/word.weboptions.relyonvml

          微軟官網(wǎng)查詢相關(guān)文檔,發(fā)現(xiàn)其實(shí)是可以關(guān)閉的,于是代碼變成這樣

          關(guān)閉relyOnVml

          再次運(yùn)行程序,這次轉(zhuǎn)出來(lái)的html就能在瀏覽器打開(kāi)了。

          總結(jié),在這次解決問(wèn)題的過(guò)程中,學(xué)會(huì)了往更深層次去想問(wèn)題,找對(duì)方向,迎難而上。

          記錄一下這個(gè)問(wèn)題解決的經(jīng)驗(yàn),也希望能幫到同樣遇到這個(gè)問(wèn)題的人。


          主站蜘蛛池模板: 一区三区三区不卡| 日韩aⅴ人妻无码一区二区| 91久久精品国产免费一区| 精品一区二区高清在线观看| 亚洲天堂一区二区三区四区| 一夲道无码人妻精品一区二区| 国产裸体舞一区二区三区| 亚洲午夜一区二区三区| 中文字幕一区二区三区5566| 日韩电影一区二区三区| 真实国产乱子伦精品一区二区三区| 在线播放精品一区二区啪视频| 精品视频无码一区二区三区 | 亚洲日韩中文字幕一区| 色噜噜狠狠一区二区三区果冻 | 无码人妻精品一区二区三区99不卡 | 日韩综合无码一区二区| 亚洲av区一区二区三| 成人毛片一区二区| 韩国一区二区视频| 亚洲影视一区二区| 亚洲中文字幕在线无码一区二区| 亚洲综合一区二区精品导航| 亚洲av无码一区二区三区网站 | 亚洲午夜精品一区二区麻豆| 亚洲一区二区三区播放在线| 日韩中文字幕一区| 亚洲av无码片vr一区二区三区| 中文字幕av人妻少妇一区二区| 国产主播福利一区二区| 亚洲国产成人久久一区二区三区| 亚洲综合一区无码精品| 日本免费一区二区三区最新| 国产一区二区三区小向美奈子| 色一情一乱一伦一区二区三区日本| 无码精品人妻一区二区三区影院| 日产一区日产2区| 日韩亚洲AV无码一区二区不卡 | 亚洲日韩精品一区二区三区| 少妇精品无码一区二区三区| 在线观看一区二区三区av|