整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          前端如何實現.md文件轉換成.html文件

          者:前端小智 來源:大遷世界

          .md文件是markdown的一種標記語言,和html比較起來,更簡單快捷,主要體現在:標記符的數量和書寫上。

          • 標記符的數量:html文檔需要用到數量繁多的標記符,再輔以css來控制樣式和排版,而markdown文檔只需要四個基本的標記符號就能完成同樣的事。
          • 標記符的書寫:HTML文檔內容需要同時標記開始和結束這是一個網頁,而markdown文檔則只要在開始位置標記即可# 這是一個md文檔。下面介紹如何實現將.md文件轉換成.html文件。

          方式一:使用i5ting_toc插件

          需要先安裝npm(安裝node.js后會自帶npm),然后才能安裝i5ting插件:

          npm install i5ting_toc -g

          執行命令行生成html文件,在輸入前要進入到對應根目錄下:

          i5ting_toc -f **.md

          需要注意的是:寫md文檔的特殊符號時記得添加空格。小技巧:如何快速在當前目錄打開cmd?選擇當前目錄,按住shift,然后鼠標右鍵在此處打開命令窗口(在此處打開powerShell窗口)。

          方式二:使用gitbook

          同樣先需要安裝node,然后運行:

          npm i gitbook gitbook-cli -g

          生成md文件,這個命令會生成相應的md的文件,然后在相應的文件里寫你的內容即可:

          gitbook init

          md轉html,生成一個_doc目錄,打開就可以看到你html文件了。

          gitbook build

          方式三:利用前端代碼

          實現原理是采用node.js搭建服務器,讀取md文件轉化為html片斷。瀏覽器發送ajax請求獲取片段后再渲染生成html網頁。

          node代碼:

          var express = require('express');

          var http = require('http');

          var fs = require('fs');

          var bodyParser = require('body-parser');

          var marked = require('marked'); // 將md轉化為html的js包

          var app = express();


          app.use(express.static('src')); //加載靜態文件

          var urlencodedParser = bodyParser.urlencoded({ extended: false });


          app.get('/getMdFile',urlencodedParser, function(req, res) {

          var data = fs.readFileSync('src/test.md', 'utf-8'); //讀取本地的md文件

          res.end(JSON.stringify({

          body : marked(data)

          }));

          } );


          //啟動端口監聽

          var server = app.listen(8088, function () {

          var host = server.address().address;

          var port = server.address().port;

          console.log("應用實例,訪問地址為 http://%s:%s", host, port)

          });

          前端html:

          <div id="content"> <h1 class="title">md-to-HTML web app</h1> <div id="article"> </div></div><script type="text/JavaScript" src="js/jquery-1.11.3.min.js"></script><script> var article = document.getElementById('article'); $.ajax({ url: "/getMdFile", success: function(result) { console.log('數據獲取成功'); article.innerHTML = JSON.parse(result).body; }, error: function (err) { console.log(err); article.innerHTML = '<p>獲取數據失敗</p>'; } });</script>

          tml2pdf

          pdfbox

          PDFBox是一個Java庫,可用于創建,修改和提取PDF文件的內容。它是一個Apache軟件基金會的項目,使用Apache License 2.0許可證。
          PDFBox提供了一組API,可用于提取文本和圖像,添加和刪除頁面,提取PDF元數據和加密PDF文件等。

          主要依賴

                  <!-- 將 html 轉換為 xml 工具庫 -->
                  <dependency>
                      <groupId>org.jsoup</groupId>
                      <artifactId>jsoup</artifactId>
                      <version>1.17.1</version>
                  </dependency>
          
                  <!-- 第三方 pdfbox 包裝庫,提供 html 轉 pdf 功能 -->
                  <dependency>
                      <groupId>com.openhtmltopdf</groupId>
                      <artifactId>openhtmltopdf-pdfbox</artifactId>
                      <version>1.0.10</version>
                  </dependency>
          

          測試代碼

                  // 獲取 java 版本
                  String version = System.getProperty("java.specification.version");
          
                  // 獲取系統類型
                  String platform = System.getProperty("os.name", "");
                  platform = platform.toLowerCase().contains("window") ? "win" : "linux";
          
                  // 當前程序目錄
                  String current = System.getProperty("user.dir");
          
                  System.out.println(String.format("current=%s", current));
          
                  // html 文件路徑
                  File index = Paths.get(current, "..", "index.html").toFile();
                  if (!index.exists()) {
                      System.out.println(String.format("file not exist,file=%s", index.getAbsolutePath()));
                      return;
                  }
          
                  try {
                      Document doc = Jsoup.parse(index, "UTF-8");
                      // 補全標記
                      doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
          
                      File file = Paths.get(current, String.format("java%s_%s.pdf", version, platform)).toFile();
                      FileOutputStream stream = new FileOutputStream(file);
          
                      PdfRendererBuilder builder = new PdfRendererBuilder();
          
                      // NOTE 字體問題,文檔中出現過的字段,需要手動加載字體
                      builder.useFont(Paths.get(current, "..", "fonts", "simsun.ttc").toFile(), "SimSun");
                      builder.useFont(Paths.get(current, "..", "fonts", "msyh.ttc").toFile(), "font-test");
                      builder.useFont(Paths.get(current, "..", "fonts", "msyh.ttc").toFile(), "Microsoft YaHei UI");
          
                      // NOTE 設置根目錄
                      String baseUrl = Paths.get(current, "..").toUri().toString();
                      builder.withHtmlContent(doc.html(), baseUrl);
          
                      builder.toStream(stream);
                      builder.run();
                  } catch (IOException e) {
                      throw new RuntimeException(e);
                  }

          效果預覽

          pdfbox-demo/java1.8_win.pdf · yjihrp/linux-html2pdf-demo - Gitee.com

          pdfbox-demo/java11_linux.pdf · yjihrp/linux-html2pdf-demo - Gitee.com

          實用工具

          # 查看 pdf 內部結構
          java -jar pdfbox-app debug path-to-pdf/test.pdf
          java -jar debugger-app path-to-pdf/test.pdf

          測試結果

          測試結果

          下一篇 5-LINUX HTML 轉 PDF-selenium

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

          通過調查,這個word和html的處理,有兩種方案,方案1是前端做這個轉換。方案2是把word文檔上傳給后臺,后臺轉換好之后再返回給前端。至于方案1,看到大家的反饋都說很多問題,所以就沒采用前端轉的方案,最終決定是后端轉化為html格式并返回給前段預覽,待客戶預覽的時候,確認格式沒問題之后,再把html保存到后臺(因為word涉及到的格式太多,比如圖片,visio圖,表格,圖片等等之類的復雜元素,轉html的時候,可能會很多格式問題,所以要有個預覽的過程)。

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


          maven引入相關依賴包如下:

           <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轉html,對于word2003和word2007轉換方式不一樣,因為word2003和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;
              }

          關于doc和docx的一些存儲格式介紹:

          docx 是微軟開發的基于 xml 的文字處理文件。docx 文件與 doc 文件不同, 因為 docx 文件將數據存儲在單獨的壓縮文件和文件夾中。早期版本的 microsoft office (早于 office 2007) 不支持 docx 文件, 因為 docx 是基于 xml 的, 早期版本將 doc 文件另存為單個二進制文件。

          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.


          可能你會問了,明明是docx結尾的文檔,怎么成了xml格式了?

          很簡單:你隨便選擇一個docx文件,右鍵使用壓縮工具打開,就能得到一個這樣的目錄結構:


          所以你以為docx是一個完整的文檔,其實它只是一個壓縮文件。


          參考:

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


          主站蜘蛛池模板: 亚洲一区二区三区在线视频| 日美欧韩一区二去三区| 国产精品美女一区二区三区| 美女视频一区二区三区| 亚洲电影一区二区三区| 精品在线一区二区三区| 国产成人精品第一区二区| 精品伦精品一区二区三区视频| 国产精品视频分类一区| 国偷自产一区二区免费视频| 无码毛片一区二区三区视频免费播放| 亚洲视频一区在线| 精品福利一区二区三| 亚洲国产一区明星换脸| 国偷自产视频一区二区久| 伊人色综合网一区二区三区| 国产AV午夜精品一区二区三区| V一区无码内射国产| 国产一区二区三区免费在线观看| 亚洲午夜一区二区三区| 久久99精品国产一区二区三区| 视频一区二区精品的福利| 色一情一乱一区二区三区啪啪高| 日韩精品无码一区二区三区| 久久婷婷久久一区二区三区| 国产一区在线视频| 久久久国产一区二区三区| 精品一区二区三区3d动漫| 国产萌白酱在线一区二区| 欧美日韩国产免费一区二区三区| 97精品国产一区二区三区| 亚洲一区免费视频| 学生妹亚洲一区二区 | 成人精品视频一区二区三区| 一区二区高清在线| 大屁股熟女一区二区三区| 久久婷婷色综合一区二区| 色妞AV永久一区二区国产AV| 日韩AV无码一区二区三区不卡毛片 | 国产伦精品一区二区免费| 一区二区在线免费视频|