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

前端使用vue-pdf、pdf-lib、canvas 給PDF文件添加水印,并預(yù)覽與下載

這篇具有很好參考價值的文章主要介紹了前端使用vue-pdf、pdf-lib、canvas 給PDF文件添加水印,并預(yù)覽與下載。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

效果預(yù)覽

pdf-lib插件庫,知識點(小記),工具,前端,vue.js,pdf

使用第三方插件

安裝依賴插件

npm i vue-pdf --save
npm i pdf-lib --save
npm install --save @pdf-lib/fontkit  //為 pdf-lib 加載自定義字體的工具

import 導(dǎo)入依賴

import pdf from "vue-pdf";
import { degrees, PDFDocument, rgb, StandardFonts } from "pdf-lib";
import fontkit from "@pdf-lib/fontkit"; 

預(yù)覽添加水印的pdf

setWatermarkContent() {
  let ele = document.createElement("canvas");
  ele.width = 250;
  ele.height = 200;
  let objmsg = {
    canvas: ele,
    fontText: "張三-2023-01-01",
    fontSize: 20,
    fontFamily: "microsoft yahei",
    fontcolor: "#dadbdc", //字體顏色   默認 #dadbdc
    rotate: 25, //旋轉(zhuǎn)角度   數(shù)字類型
    textAlign: "left", //水印文字居中方式:left center right  默認 left
  };
  this.createWaterMark(objmsg);
  this.drawWaterMark(ele);
},
// 創(chuàng)建canvas水印圖片
createWaterMark({ canvas, fontText, fontFamily = "microsoft yahei", fontSize = 30, fontcolor = "#dadbdc", rotate = 30, textAlign = "left" }) {
  let ctx = canvas.getContext("2d");
  ctx.font = `${fontSize}px ${fontFamily}`;
  ctx.rotate((-rotate * Math.PI) / 180);
  ctx.fillStyle = fontcolor;
  ctx.textAlign = textAlign;
  ctx.textBaseline = "Middle";
  ctx.fillText(fontText, canvas.width / 6, canvas.height / 2);
},
// 給pdf增加水印遮罩層
drawWaterMark(ele) {
  let div = document.createElement("div");
  div.style.pointerEvents = "none";
  div.style.top = "0";
  div.style.left = "0px";
  div.style.position = "absolute";
  div.style.background = "url(" + ele.toDataURL("image/png") + ") left top repeat";
  let width = document.getElementById("pdfBox").clientWidth || 700;
  let height = document.getElementById("pdfBox").clientHeight || 700;
  div.style.width = width + "px";
  div.style.height = height + "px";
  document.getElementById("myIframe").appendChild(div);
},

下載添加水印的pdf

原理就是給顯示pdf 的容器增加一層水印遮罩層


// 處理PDF
async downFile() {
  /*2.獲取pdf文件的arrarybuffer文件流
  可請求后臺接口返回的base64文件流,然后轉(zhuǎn)成arrayBuffer類型
  可訪問前端項目中的本地文件,不能直接訪問服務(wù)器鏈接文件,會有跨域問題*/
  try {
    // 1.通過url獲取pdf文件的arrarybuffer文件流
    const existingPdfBytes = await fetch(this.fileUrl).then((res) => res.arrayBuffer());
    // 2.將arraybuffer數(shù)據(jù)轉(zhuǎn)成pdf文檔
    const pdfDoc = await PDFDocument.load(existingPdfBytes);
    // 3.1  內(nèi)置字體(不支持中文), 如果水印中不包含中文可直接用內(nèi)置字體(不支持中文)
    // const fontkitFile = await pdfDoc.embedFont(StandardFonts.Helvetica);
    // 3.2 自定義字體,如不需要使用自定義字體可以將這一段全部注釋掉,也不用下載自定義字體文件和自定義字體工具fontkit
    // 將自己下載好的.ttf文件放置項目中,然后訪問文件路徑(不支持訪問本地文件)
    const fontBytes = await fetch("/fonts/SourceHanSansCN-Normal.ttf").then((res) => res.arrayBuffer());
    pdfDoc.registerFontkit(fontkit); // 自定義字體掛載、fontkit為自定義字體注冊工具
    const fontkitFile = await pdfDoc.embedFont(fontBytes);
    //  4. 為每頁pdf添加文字水印
    const pages = pdfDoc.getPages();
    for (let i = 0; i < pages.length; i++) {
      const noPage = pages[i];
      const { width, height } = noPage.getSize();
      for (let i = 0; i < 10; i++) {
        for (let j = 0; j < 3; j++) {
          noPage.drawText("張三-2023-01-01", {
            x: 230 * j,
            y: (height / 4) * i,
            size: 20,
            font: fontkitFile, //字體(內(nèi)置/自定義)
            color: rgb(0.46, 0.53, 0.6),
            rotate: degrees(45),
            opacity: 0.3,
          });
        }
      }
    }
    //5. 保存pdf文件的unit64Arrary文件流
    const pdfBytes = await pdfDoc.save();
    this.saveByteArray(this.waterFile.fileName + ".pdf", pdfBytes);
  } catch (error) {
    this.$message.warning("文件下載失??!");
  }
},
// 下載文件
saveByteArray(reportName, byte) {
  var blob = new Blob([byte], { type: "application/pdf" });
  var link = document.createElement("a");
  link.href = window.URL.createObjectURL(blob);
  var fileName = reportName;
  link.download = fileName;
  link.click();
},

預(yù)覽及下載總結(jié)

下載:

  1. 通過url獲取pdf文件的arrarybuffer文件流
  2. 將arraybuffer數(shù)據(jù)轉(zhuǎn)成pdf文檔
  3. 添加水印字體(內(nèi)置/自定義)
  4. 為每頁pdf添加文字水印
  5. 保存pdf文件的unit64Arrary文件流

預(yù)覽:文章來源地址http://www.zghlxwxcb.cn/news/detail-819829.html

  1. 創(chuàng)建canvas容器(用于顯示水印文字)
  2. 創(chuàng)建水印canvas
  3. 將水印canvas遮罩層定位到pdf容器中

完整代碼

<template>
  <div>
    <div class="content">
      <div id="myIframe" style="max-width: 700px; min-height: 550px; position: relative; margin: 0 auto">
        <pdf id="pdfBox" :page="pageNum" :src="fileUrl" @progress="loadedRatio = $event" @num-pages="totalPages = $event"></pdf>
      </div>
      <el-button v-if="false" type="primary" @click="downFile" plain style="width: 300px">保存并下載pdf</el-button>
    </div>
    <span slot="footer" class="dialog-footer">
      <div class="btnGroup" v-if="totalPages">
        <div class="pageNum">{{ pageNum }} / {{ totalPages }}</div>
        <el-button-group>
          <el-button round plain type="primary" icon="el-icon-arrow-left" size="mini" @click="prePage">上一頁</el-button>
          <el-button round plain type="primary" size="mini" @click="nextPage">下一頁<i class="el-icon-arrow-right el-icon--right"></i></el-button>
        </el-button-group>
      </div>
    </span>
  </div>
</template>

<script>
/* npm i vue-pdf --save
npm install --save @pdf-lib/fontkit
npm i pdf-lib --save
*/

import pdf from "vue-pdf";
import { degrees, PDFDocument, rgb, StandardFonts } from "pdf-lib";
import fontkit from "@pdf-lib/fontkit"; //為 pdf-lib 加載自定義字體的工具

export default {
  components: {
    pdf,
  },
  data() {
    return {
      pageNum: 1, //顯示第一頁
      loadedRatio: 0, // 當前頁面的加載進度,范圍是0-1 ,等于1的時候代表當前頁已經(jīng)完全加載完成了
      totalPages: 0, //pdf總頁數(shù)
      fileUrl:"XXXXX.pdf",
    };
  },

  mounted() {
    this.getPageNum();
  },
  methods: {
   // 獲取PDF總頁數(shù)
    getPageNum() {
      let loadingTask = pdf.createLoadingTask(this.fileUrl);
      loadingTask.promise
        .then((pdf) => {
          this.totalPages = pdf.numPages;
          this.$nextTick(() => {
            this.setWatermarkContent();
          });
        })
        .catch((err) => {
          this.$message.warning("pdf加載失敗");
        });
    },
    // 上一頁
    prePage() {
      let page = this.pageNum;
      page = page > 1 ? page - 1 : this.totalPages;
      this.pageNum = page;
      window.scrollTo(0, 0);
    },

    // 下一頁
    nextPage() {
      let page = this.pageNum;
      page = page < this.totalPages ? page + 1 : 1;
      this.pageNum = page;
      window.scrollTo(0, 0);
    },

    setWatermarkContent() {
      // 1.創(chuàng)建canvas容器(用于顯示水印文字)
      let ele = document.createElement("canvas");
      ele.width = 250;
      ele.height = 200;
      let objmsg = {
        canvas: ele,
        fontText: "張三-2023-01-01", // String
        fontSize: 20,
        fontFamily: "microsoft yahei",
        fontcolor: "#dadbdc", //字體顏色   默認 #dadbdc
        rotate: 25, //旋轉(zhuǎn)角度   數(shù)字類型
        textAlign: "left", //水印文字居中方式:left center right  默認 left
      };
      // 2.創(chuàng)建水印canvas
      this.createWaterMark(objmsg);
       // 2.將水印canvas遮罩層定位到pdf容器中
      this.drawWaterMark(ele);
    },
    // 創(chuàng)建canvas水印圖片
    createWaterMark({ canvas, fontText, fontFamily = "microsoft yahei", fontSize = 30, fontcolor = "#dadbdc", rotate = 30, textAlign = "left" }) {
      let ctx = canvas.getContext("2d");
      ctx.font = `${fontSize}px ${fontFamily}`;
      ctx.rotate((-rotate * Math.PI) / 180);
      ctx.fillStyle = fontcolor;
      ctx.textAlign = textAlign;
      ctx.textBaseline = "Middle";
      ctx.fillText(fontText, canvas.width / 6, canvas.height / 2);
    },
    // 給pdf增加水印遮罩層
    drawWaterMark(ele) {
      let div = document.createElement("div");
      div.style.pointerEvents = "none";
      div.style.top = "0";
      div.style.left = "0px";
      div.style.position = "absolute";
      div.style.background = "url(" + ele.toDataURL("image/png") + ") left top repeat";
      let width = document.getElementById("pdfBox").clientWidth || 700;
      let height = document.getElementById("pdfBox").clientHeight || 700;
      div.style.width = width + "px";
      div.style.height = height + "px";
      document.getElementById("myIframe").appendChild(div);
    },

    // PDF 下載
    async downFile() {
      /*2.獲取pdf文件的arrarybuffer文件流
       可請求后臺接口返回的base64文件流,然后轉(zhuǎn)成arrayBuffer類型
       可訪問前端項目中的本地文件,不能直接訪問服務(wù)器鏈接文件,會有跨域問題*/
      try {
        // 1.通過url獲取pdf文件的arrarybuffer文件流
        const existingPdfBytes = await fetch(this.fileUrl).then((res) => res.arrayBuffer());
        // 2.將arraybuffer數(shù)據(jù)轉(zhuǎn)成pdf文檔
        const pdfDoc = await PDFDocument.load(existingPdfBytes);
        // 3.1  內(nèi)置字體(不支持中文), 如果水印中不包含中文可直接用內(nèi)置字體(不支持中文)
        // const fontkitFile = await pdfDoc.embedFont(StandardFonts.Helvetica);
        // 3.2 自定義字體,如不需要使用自定義字體可以將這一段全部注釋掉,也不用下載自定義字體文件和自定義字體工具fontkit
        // 將自己下載好的.ttf文件放置項目中,然后訪問文件路徑(不支持訪問本地文件)
        const fontBytes = await fetch("/fonts/SourceHanSansCN-Normal.ttf").then((res) => res.arrayBuffer());
        pdfDoc.registerFontkit(fontkit); // 自定義字體掛載、fontkit為自定義字體注冊工具
        const fontkitFile = await pdfDoc.embedFont(fontBytes);
        //  4. 為每頁pdf添加文字水印
        const pages = pdfDoc.getPages();
        for (let i = 0; i < pages.length; i++) {
          const noPage = pages[i];
          const { width, height } = noPage.getSize();
          for (let i = 0; i < 10; i++) {
            for (let j = 0; j < 3; j++) {
              noPage.drawText('張三-2023-01-01', {
                x: 230 * j,
                y: (height / 4) * i,
                size: 20,
                font: fontkitFile, //字體(內(nèi)置/自定義)
                color: rgb(0.46, 0.53, 0.6),
                rotate: degrees(45),
                opacity: 0.3,
              });
            }
          }
        }
        //5. 保存pdf文件的unit64Arrary文件流
        const pdfBytes = await pdfDoc.save();
        this.saveByteArray( "水印PDF.pdf", pdfBytes);
      } catch (error) {
        this.$message.warning("文件下載失??!");
      }
    },
    // 下載文件
    saveByteArray(fileName, byte) {
      var blob = new Blob([byte], { type: "application/pdf" });
      var link = document.createElement("a");
      link.href = window.URL.createObjectURL(blob);
      var fileName = reportName;
      link.download = fileName;
      link.click();
    },
  },
};
</script>

到了這里,關(guān)于前端使用vue-pdf、pdf-lib、canvas 給PDF文件添加水印,并預(yù)覽與下載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【vue-pdf】PDF文件預(yù)覽插件

    1 插件安裝 vue-pdf GitHub:https://github.com/FranckFreiburger/vue-pdf#readme 參考文檔:https://www.cnblogs.com/steamed-twisted-roll/p/9648255.html catch報錯:vue-pdf組件報錯vue-pdf Cannot read properties of undefined (reading ‘catch‘)_你看我像是會的樣子嗎?的博客-CSDN博客 2 代碼示例 Example.01 超簡單分頁預(yù)覽 E

    2024年02月14日
    瀏覽(31)
  • vue-pdf實現(xiàn)pdf文件在線預(yù)覽

    在日常的工作中在線預(yù)覽 PDF 文件的需求是很多的,下面介紹一下使用 vue-pdf 實現(xiàn)pdf文件在線預(yù)覽 使用 npm 安裝 vue-pdf npm install vue-pdf 使用 vue-pdf 顯示 PDF 文件 此時頁面中就會顯示我們提供的 PDF 文件了,但是此時只顯示了 PDF 文件的第一頁 按頁顯示 PDF 文件 使用 vue-pdf 能滿足

    2024年02月13日
    瀏覽(27)
  • 使用vue-pdf插件加載pdf

    使用vue-pdf插件加載pdf

    安裝: 使用: 報錯:? 這樣執(zhí)行會報一個catch的錯誤,然后找到node_modules下面的vue-pdf目錄src文件下面的pdfjsWrapper.js文件中,第197行的catch注釋掉就好。

    2024年01月18日
    瀏覽(15)
  • vue前端實現(xiàn)將頁面顯示內(nèi)容生成pdf文件的幾種方法,html2canvas、dom-to-image、jspdf(帶分頁)基本使用以及介紹

    實際開發(fā)需求:vue項目中,根據(jù)數(shù)據(jù)結(jié)構(gòu)生成echarts圖表組件,生成帶有樣式的圖表以后,點擊下載按鈕,把圖表以pdf格式的文件下載到本地 實現(xiàn)思路:將vue界面的echarts組件生成圖片,然后使用插件將生成的圖片放入pdf中,再實現(xiàn)pdf文件的下載 涉及框架以及插件:vue、echar

    2024年01月25日
    瀏覽(29)
  • vue中如何使用vue-pdf及相應(yīng)報錯解決

    vue中如何使用vue-pdf及相應(yīng)報錯解決

    ? 目錄 一、安裝npm 依賴 二、引入組件 1、html中使用組件 單頁 多頁? 2、數(shù)據(jù)處理 單頁 多頁? 三、項目使用--代碼部分 四、報錯解決 前言 使用vue-pdf組件實現(xiàn)文件預(yù)覽功能 并在文件上增加操作按鈕 vue3不支持vue-pdf,vue3項目用pdfjs-dist ? 1、在根目錄下輸入一下命令 2、修改

    2023年04月12日
    瀏覽(18)
  • vue-pdf 單列顯示多個pdf頁面

    注意:文件要放在public文件夾下,不然會報錯:如果文件放在遠程服務(wù)器上,則直接寫遠程地址 Warning: Ignoring invalid character \\\"33\\\" in hex string\\\' 原因:讀取 PDF 文件時,路徑不合法,導(dǎo)致讀取不到文件; 在 vue-cli3 腳手架搭建的項目中,讀取本地的 PDF 文件需要放到 public 文件夾中

    2024年02月15日
    瀏覽(23)
  • 【vue2中的pdf預(yù)覽】iframe/pdf.js/vue-pdf

    vue2中預(yù)覽pdf的方法有pdf.js和vue-pdf等。下面進行簡單對比使用方法的介紹。 使用iframe預(yù)覽pdf 如果后端返回的不是url,那么需要使用 responseType = \\\'blob\\\' 來讀取后端傳來的內(nèi)容。 擴展: 同樣是使用iframe進行預(yù)覽,如果有 其他格式 如word/xls/ppt/txt的文件需要預(yù)覽,可以使用微軟解

    2024年02月09日
    瀏覽(72)
  • Vue-pdf踩坑記錄

    Vue-pdf踩坑記錄

    最近在公司的一個項目中,需要在線預(yù)覽PDF文件?;趘ue-admin-electron的模板中開發(fā)。開發(fā)機系統(tǒng)為Windows,使用的框架為electron-vue。 坑1:在通過vue-router路由到含有vue-pdf組件的頁面時報:“syntaxError: Unexpected token ” 錯誤。 解決方法: 將vue-pdf添加到webpack配置文件的白名單中。

    2024年02月11日
    瀏覽(14)
  • 前端vue基于html2canva jspdf 實現(xiàn)前端頁面加水印 并導(dǎo)出頁面PDF

    前端vue基于html2canva jspdf 實現(xiàn)前端頁面加水印 并導(dǎo)出頁面PDF

    隨著技術(shù)的發(fā)展,開發(fā)的復(fù)雜度也越來越高,傳統(tǒng)開發(fā)方式將一個系統(tǒng)做成了整塊應(yīng)用,經(jīng)常出現(xiàn)的情況就是一個小小的改動或者一個小功能的增加可能會引起整體邏輯的修改,造成牽一發(fā)而動全身。通過組件化開發(fā),可以有效實現(xiàn)單獨開發(fā),單獨維護,而且他們之間可以隨

    2024年02月03日
    瀏覽(27)
  • Vue中 引入使用 patch-package 為依賴打補丁 (以修改 vue-pdf 打包后 [hash].worker.js 路徑問題為例)

    Vue中 引入使用 patch-package 為依賴打補丁 (以修改 vue-pdf 打包后 [hash].worker.js 路徑問題為例)

    1. patch-package 簡介 patch-package npm地址 patch-package github文檔 如果不需要在生產(chǎn)中運行 npm (如:正在制作 web 前端,則可使用 --save dev) 1.2 使用方法 制作修補程序 首先更改 node_modules 文件夾中特定包的文件,然后運行 或使用 npx (npm 5.2) package-name 與所更改的程序包的名稱相匹配

    2024年02月10日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包