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 亚洲综合二区,亚洲国产精品久久综合,日本天堂免费a

          整合營銷服務商

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

          免費咨詢熱線:

          Javascript - 3種 HTML 轉(zhuǎn)換為純文本的方法

          幾天,我手里的一個項目需要將富文本的所有 html 標簽全部刪除,得到純文本后再存儲到數(shù)據(jù)庫中。在一系列得搜索操作之后,我找到了實現(xiàn)這個目的的幾種方法,在這里我分享給大家,當你遇到同樣的情況興許也能用的上。

          1. 使用 .replace(/<[^>]*>/g, '')

          這個方法是從文本中去除 html 標簽最簡單的方法。它使用字符串的方法 .replace(待替換的字符串,替換后的字符串) 將 HTML 標簽替換成空值。 /g 是表示替換字符串所有匹配的值,即字符串中所有符合條件的字符都將被替換。

          這個方法的缺點是有些 HTML 標簽不能被剔除,不過它依然很好用。

          2. 創(chuàng)建臨時DOM元素并獲取其中的文本

          這種方法是完成該問題的最有效的方法。創(chuàng)建一個臨時 DOM 并給他賦值,然后我們使用 DOM 對象方法提取文本。

          3. 使用 html-to-text npm 包

          html-to-text 這個包的功能很全了,轉(zhuǎn)換也有許多的選項比如:wordwrap, tags, whitespaceCharacters , formatters 等等。

          安裝:

          npm install html-to-text

          使用:

          最后感謝閱讀,如果此文對您有幫助,請點贊或添加關注。

          們經(jīng)常會在網(wǎng)上查找資料,而大多文檔下載都需要付費,有哪些方法能免費將網(wǎng)頁轉(zhuǎn)換成Word文檔呢?下面一起來看一看吧。

          1、直接復制

          最簡單的方法就是直接將網(wǎng)頁中所需段落或文字選中后,然后右擊并選擇“復制”,再新建一個Word文檔粘貼進去就可以了。

          2、另存為

          有一些資料網(wǎng)站做了限制,文字無法選擇,或者選擇之后也復制不了,那么我們可以先將其以網(wǎng)頁進行保存。在網(wǎng)頁任意處右擊并選擇“網(wǎng)頁另存為”;

          接著將網(wǎng)頁以HTML文件形式保存到電腦桌面后,雙擊打開這個網(wǎng)頁,就可以隨意進行復制并且粘貼到Word中了,只是這個網(wǎng)頁加載會比較慢,不太建議使用。

          3、截圖轉(zhuǎn)文字

          如果有些網(wǎng)頁資料限制多,以上兩種方式都無法操作,那我們可以將需要的頁面內(nèi)容進行截圖保存,使用一些聊天工具的截圖工具或電腦自帶的屏幕截取都可以。

          然后再使用轉(zhuǎn)換工具將圖片識別成文字就可以啦。我們可以使用speedpdf在線轉(zhuǎn)換工具的圖片轉(zhuǎn)Word功能,不僅能識別文字,如果有圖片,也能以原有格式轉(zhuǎn)換成Word。

          首先搜索Speedpdf進入在線轉(zhuǎn)換后,選擇列表中轉(zhuǎn)換格式中的“JPG to Word ”;然后將所有保存的圖片批量全部上傳進行轉(zhuǎn)換,這樣就能將內(nèi)容轉(zhuǎn)到同一個Word文檔中。

          轉(zhuǎn)換完成之后直接下載就可以打開Word文檔了,是不是很方便,而且轉(zhuǎn)換也是免費的哦,強烈推薦這種處理方式呢。

          何保持頁面樣式基本不變的前提下將HTML頁面導出為PDF,下面提供一些示例代碼,純屬個人原創(chuàng),如對你有幫助請記得加關注、加收藏、點贊、轉(zhuǎn)發(fā)、分享~謝謝~~

          • 基本思路:保持頁面樣式基本不變,使用 `html2canvas` 將頁面轉(zhuǎn)換為圖片,然后再通過 `jspdf` 將圖片分頁導出為PDF文件(中間會遇到圖片或文字等內(nèi)容在分頁處被切割開的問題,如何解決了?詳見末尾干貨)
          • 上基礎代碼:下面為項目中實際代碼截取
          <div>
              <!-- 要打印的內(nèi)容區(qū) -->
              <div ref="contentRef">
                  <div class="print-item print-out-flow">這是脫離文檔流的內(nèi)容區(qū)域</div>
                  <div class="print-item">這是一行內(nèi)容,也是最小葉子元素內(nèi)容</div>
              </div>
              <!-- 打印內(nèi)容容器 -->
              <div ref="printContainerRef" class="print-container"></div>
          </div>
          /**
            * 1.使用一個隱藏div裝載有滾動條的div.innerHTML
            * 2.隱藏div使用position: absolute, z-index: -999, left: -9999px, width: 900px 控制讓用戶無感知
            * 3.根據(jù)需要覆寫隱藏div內(nèi)html樣式(例如textarea多行顯示有問題, 可以新增一個隱藏的div
            *    包裹textarea的綁定值, 然后在打印樣式中覆寫樣式, 隱藏textarea并顯示對應div)
            */
          handleExport() {
             // 下面是VUE組件內(nèi)獲取DOM元素代碼,將內(nèi)容放置到打印區(qū)(定義的隱藏DIV)中
              const contentRef = this.$refs.contentRef as HTMLElement;
              const printContainerRef = this.$refs.printContainerRef as HTMLElement;
              // 打印區(qū)的需額外處理絕對定位值, 調(diào)整使得第一個元素的.top值為0, 以便于頁面計算
              printContainerRef.innerHTML = contentRef.innerHTML;	
              
              // 所有葉子div元素加上 print-item 樣式名, 脫離文檔流的額外添加 print-out-flow
              handlePrintItem(printContainerRef);  // 解決多頁內(nèi)容可能被切割問題
              
              html2canvas(printContainerRef, {allowTaint: false, useCORS: true}).then((canvas: any) => {
                const contentHeight = canvas.height;
                const contentWidth = canvas.width;
                // pdf每頁顯示的內(nèi)容高度
                const pageHeight = contentWidth / 595.28 * 841.89;
                // 未生成pdf的頁面高度
                let offsetHeight = contentHeight;
                // 頁面偏移值
                let position = 0;
                // a4紙的尺寸[595.28, 841.89], canvas圖片按a4紙大小縮放后的寬高
                const imgWidth = 595.28;
                const imgHeight = 595.28 / contentWidth * contentHeight;
          
                const dataURL = canvas.toDataURL('image/jpeg', 1.0);
                const doc = new jsPDF('p', 'pt', 'a4');
          
                if (offsetHeight < pageHeight) {
                  doc.addImage(dataURL, 'JPEG', 0, 0, imgWidth, imgHeight);
                } else {
                  while (offsetHeight > 0) {
                    doc.addImage(dataURL, 'JPEG', 0, position, imgWidth, imgHeight);
                    offsetHeight -= pageHeight;
                    position -= 841.89;
          
                    if (offsetHeight > 0) {
                      doc.addPage();
                    }
                  }
                }
          
                doc.save(this.generateReportFileName());
                printContainerRef.innerHTML = '';
              });
          }

          上干貨代碼:上面分頁導出PDF可能網(wǎng)上能看到類型代碼,但絕對找不到下面的代碼,純手搓解決分頁元素被切開問題(思路:獲取自身定位,如自己剛好在被分頁處,則加上一定的margin-top值將內(nèi)容向下移)

          /** 
           * 處理打印元素項, 修復分頁后被切割的元素
           * @param printContainerRef 打印內(nèi)容div容器
           * @param itemClassName 打印最小元素標識類名
           * @param outFlowClassName 脫離文檔流的元素標識類名
           */
          export function handlePrintItem(
            printContainerRef: HTMLElement,
            itemClassName: string = 'print-item',
            outFlowClassName: string = 'print-out-flow'
          ): void {
            const rootClientRect = printContainerRef.getBoundingClientRect();
            // 初始化頁面相關數(shù)據(jù)
            const totalHeight = rootClientRect.height;  // 內(nèi)容總高度
            const a4PageHeight = (printContainerRef.clientWidth / 595.28) * 841.89; // a4紙高度
            let pageNum = Math.ceil(totalHeight / a4PageHeight);  // 總頁數(shù)
            let addPageHeight = 0;  // 修正被分割元素而增加的頁面高度總和
            let currentPage = 1;  // 當前正在處理切割的頁面
            const splitItemObj: { [key: number]: HTMLElement[] } = {};  // 內(nèi)容中各頁被切割元素存儲對象
          
            const printItemNodes: NodeListOf<HTMLElement> = printContainerRef.querySelectorAll(`.${itemClassName}`);
            for (let item of printItemNodes) {
              // 如果當前頁已經(jīng)是最后一頁, 則中斷判斷
              if (currentPage >= pageNum) {
                break;
              }
          
              // 獲取元素絕對定位數(shù)據(jù)
              const clientRect = item.getBoundingClientRect();
              let top = clientRect.top;
              const selfHeight = clientRect.height;
              // 如果當前元素距離頂部高度大于當前頁面頁腳高度, 則開始判斷下一頁頁腳被切割元素
              if (top > currentPage * a4PageHeight) {
                // 換頁前修正上一頁被切割元素
                addPageHeight += fixSplitItems(currentPage, a4PageHeight, splitItemObj[currentPage], outFlowClassName);
                pageNum = Math.ceil((totalHeight + addPageHeight) / a4PageHeight);
                top = item.getBoundingClientRect().top;
                currentPage++;
              }
              // 如果元素剛好處于兩頁之間, 則記錄該元素
              if (top > (currentPage - 1) * a4PageHeight && top < currentPage * a4PageHeight && top + selfHeight > currentPage * a4PageHeight) {
                if (!splitItemObj[currentPage]) {
                  splitItemObj[currentPage] = [];
                }
                splitItemObj[currentPage].unshift(item);
                // 如果當前元素是最后一個元素, 則直接處理切割元素, 否則交由處理下一頁元素時再處理切割
                if (item === printItemNodes[printItemNodes.length - 1]) {
                  fixSplitItems(currentPage, a4PageHeight, splitItemObj[currentPage], outFlowClassName);
                }
              }
            }
          }
          
          /**
            * 修復當前頁所有被切割元素
            * @param currentPage 當前頁
            * @param pageHeight 每頁高度
            * @param splitElementItems 當前被切割元素數(shù)組
            * @param outFlowClassName 脫離文檔流的樣式類名
            */
          function fixSplitItems(
            currentPage: number,
            pageHeight: number,
            splitElementItems: HTMLElement[],
            outFlowClassName: string
          ): number {
            if (!splitElementItems || !splitElementItems.length) {
              return 0;
            }
          
            const yMargin = 5;  // y方向距離頁眉的距離
            const splitItemsMinTop = getSplitItemsMinTop(splitElementItems);
            if (!splitItemsMinTop) {
              return 0;
            }
          
            let fixHeight = currentPage * pageHeight - splitItemsMinTop + yMargin;
            const outFlowElement = splitElementItems.find((item) => item.classList.contains(outFlowClassName));
            if (outFlowElement && outFlowElement.parentElement) {
              const parentPreviousElement = outFlowElement.parentElement.previousElementSibling as HTMLElement;
              fixHeight += getMarinTopNum(parentPreviousElement, outFlowElement.parentElement);
              outFlowElement.parentElement.style.marginTop = `${fixHeight}px`;
              return fixHeight;
            }
          
            splitElementItems.forEach((splitElement) => {
              splitElement.style.marginTop = `${fixHeight}px`;
            });
            return fixHeight;
          }
          
          /**
            * 獲取被切割元素數(shù)組中最小高度值(如一行有多個元素被切割,則選出距離頂部最小的高度值)
            * @param splitElementItems 當前被切割元素數(shù)組
            */
          function getSplitItemsMinTop(
            splitElementItems: HTMLElement[]
          ): number | undefined {
            // 獲取元素中最小top值作為基準進行修正
            let minTop: number | undefined;
            let minElement: HTMLElement | undefined;
            splitElementItems.forEach((splitElement) => {
              let top = splitElement.getBoundingClientRect().top;
              if (minTop) {
                minTop = top < minTop ? top : minTop;
                minElement = top < minTop ? splitElement : minElement;
              } else {
                minTop = top;
                minElement = splitElement;
              }
            });
          
            // 修正當前節(jié)點及其前面同層級節(jié)點的margin值
            if (minTop && minElement) {
              const previousElement = splitElementItems[splitElementItems.length - 1].previousElementSibling as HTMLElement;
              minTop -= getMarinTopNum(previousElement, minElement);
            }
            return minTop;
          }
          
          /**
            * 通過前一個兄弟元素和元素自身的位置確認一個距離頂部高度修正值
            * @param previousElement 前一個兄弟元素
            * @param curElement 當前元素
            */
          function getMarinTopNum(previousElement: HTMLElement, curElement: HTMLElement): number {
            let preMarginNum = 0;
            let curMarginNum = 0;
            if (previousElement) {
              // 獲取外聯(lián)樣式需要getComputedStyle(), 直接.style時對象的值都為空
              const previousMarginBottom = window.getComputedStyle(previousElement).marginBottom;
              preMarginNum = previousMarginBottom ? Number(previousMarginBottom.replace('px', '')) : 0;
            }
            const marginTop = window.getComputedStyle(curElement).marginTop;
            curMarginNum = marginTop ? Number(marginTop.replace('px', '')) : 0;
            return preMarginNum > curMarginNum ? preMarginNum : curMarginNum;
          }

          以上純原創(chuàng)!歡迎加關注、加收藏、點贊、轉(zhuǎn)發(fā)、分享(代碼閑聊站)~


          主站蜘蛛池模板: 国产乱码精品一区三上| 亚洲国产成人一区二区三区| 波多野结衣一区二区三区aV高清| 国产日韩一区二区三区在线观看| 亚洲国产成人精品无码一区二区| 红桃AV一区二区三区在线无码AV | 国产一区二区三区在线观看精品| 精品人妻一区二区三区浪潮在线| 国产一区三区二区中文在线| 福利片福利一区二区三区| 精品欧洲AV无码一区二区男男| 中文字幕人妻丝袜乱一区三区 | 中文字幕精品一区影音先锋| 精品国产一区二区三区久久蜜臀| 国产亚洲综合一区二区三区| 久久久国产精品无码一区二区三区 | 精品一区二区三区在线观看l | 久久久久人妻一区二区三区| 国产精品无码AV一区二区三区| 韩日午夜在线资源一区二区 | 国产一国产一区秋霞在线观看| 国产精品无码一区二区三区毛片| 精品无码国产一区二区三区AV | 在线|一区二区三区四区| 国产成人综合亚洲一区| 国产色欲AV一区二区三区| 国产精品一区二区香蕉| 在线观看国产一区二三区| 无码国产伦一区二区三区视频| 国产日韩一区二区三免费高清| 精品视频一区二区三区在线观看| 国产主播一区二区| 亚洲国产系列一区二区三区| 亚洲AV日韩综合一区| 国产伦一区二区三区免费| 国产婷婷一区二区三区| 精品国产日产一区二区三区| 人妻体体内射精一区二区| 无码精品不卡一区二区三区| 日本精品一区二区三区四区| 精品国产日韩亚洲一区|