vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载

这篇具有很好参考价值的文章主要介绍了vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图

vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载,vue,pdf加水印,前端pdf加水印,前端,vue.js,pdf

1.pdf预览

  原理:主要是利用pdfh5这个插件来完成的

  使用方法:

  1.页面需要有一个容器例子:<div id="demo"></div>

  2.下载pdfh5插件

npm install pdfh5

  (注意:webpack5之后不会下载polyfill 需要手动下载 所以引入pdfh5的时候会报错)

  解决方案:下载 node-polyfill-webpack-plugin

npm install node-polyfill-webpack-plugin

  之后再vue.config.js里面配置

  // 头部引入

  const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')

  const { defineConfig } = require('@vue/cli-service')

  module.exports = defineConfig({

    //...

    configureWebpack: {

      plugins: [new NodePolyfillPlugin()],

    }

  })

vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载,vue,pdf加水印,前端pdf加水印,前端,vue.js,pdf

  3.解决报错之后下面直接使用

  this.pdfh5 = new Pdfh5("#demo", {

    pdfurl: this.url,

  });

  -----另外 需要我们引入css样式 还需要我们自己写一点css样式来修改转成pdf后里面图片过大 再最下面        

  2.pdf加水印

  原理:利用的是将pdf文件转化成二进制文件 再用画图的方式往里面画文字

  主要利用插件:pdf-lib @pdf-lib/fontkit

npm install pdf-lib

npm install @pdf-lib/fontkit

  (注意:这里使用字体的时候需要引入两个字体包再同级目录下的font下的两个包)

  这里面的预览还是用到的pdfh5来预览的

  使用方法:直接调用addWarker(url,warkerName) 方法

  参数说明:url:需要添加水印的pdf文件地址  

           warkerName添加水印字

  注意:一半这种都不允许下载 禁止鼠标右击事件就是再我们的元素上加上@contextmenu.prevent事件

  并且加css样式:

        

* {

    -webkit-touch-callout: none;

    -webkit-user-select: none;

    -moz-user-select: none;

    -ms-user-select: none;

    user-select: none;

  }

  下载pdf还是用的pdfh5中的download方法

另外附上完整代码

 <template>

  <div>

      <div class="xlsx-content">

          <div class="btnPdf">

              <button @click="viewpdf">预览pdf</button>

              <button @click="currenNum">查看当前页数</button>

              <button @click="addWarker">pdf加水印</button>

              <button @click="downPdf">下载pdf</button>

          </div>

          <div class="pdf" @contextmenu.prevent>

              <div id="demo"></div>

          </div>

      </div>

  </div>

</template>

<script>

import Pdfh5 from "pdfh5";

import "pdfh5/css/pdfh5.css";

import fontkit from "@pdf-lib/fontkit";

import {

    degrees,

    PDFDocument,

    rgb

} from "pdf-lib";

export default {

    components: {},

    data() {

        return {

            url: "自己输入pdf地址",

            pdfh5: null,

        };

    },

    methods: {

        // 预览pdf

        viewpdf() {

            (this.url =

                "自己输入pdf地址"),

            (this.pdfh5 = new Pdfh5("#demo", {

                pdfurl: this.url,

            }));

            this.pdfh5.on("render", function (status, msg, time) {

                this.goto(5);

            });

        },

        // 获取当前进度

        currenNum() {

            console.log(this.pdfh5, this.pdfh5.currentNum); //这里获取的就是进度

        },

        // 添加水印

        addWarker(url, warkerName) {

            url = '自己输入pdf地址'

            warkerName = '水印文字'

            let that = this;

            changeBlob().then((res) => {

                res.arrayBuffer().then((rel) => {

                    // 获取arrauBuffer文件

                    viewmodifyPdf(rel);

                });

            });

            //地址转文件

            function changeBlob() {

                return new Promise((resolve) => {

                    const xhr = new XMLHttpRequest();

                    xhr.open("GET", url, true);

                    xhr.responseType = "blob";

                    xhr.onload = () => {

                        if (xhr.status === 200) {

                            resolve(xhr.response);

                        }

                    };

                    xhr.send();

                });

            }

            // 预览水印文件

            async function viewmodifyPdf(file) {

                // 将arrayBuff文件加载pdf文件

                const pdfDoc = await PDFDocument.load(file);

                // 引入自定义字体

                let url = require("./font/Alibaba_PuHuiTi_2.0_55_Regular_85_Bold.ttf");

                const fontBytes = await fetch(url).then((res) => res.arrayBuffer());

                // 自定义字体挂载

                pdfDoc.registerFontkit(fontkit);

                const customFont = await pdfDoc.embedFont(fontBytes);

                // 获取文档所有页

                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(warkerName, {

                                x: 230 * j,

                                y: (height / 4) * i,

                                size: 16,

                                font: customFont, //这里使用的是自定义字体

                                color: rgb(0.46, 0.53, 0.6),

                                rotate: degrees(-45),

                                opacity: 0.3,

                            });

                        }

                    }

                }

                // 获取水印文件

                const pdfBytes = await pdfDoc.save();

                let blobData = new Blob([pdfBytes], {

                    type: "application/pdf;Base64"

                });

                that.url = window.URL.createObjectURL(blobData) + "#toolbar=0";

                that.pdfh5 = new Pdfh5("#demo", {

                    pdfurl: that.url,

                });

            }

        },

        downPdf() {

            this.pdfh5.download("test");

        },

    },

};

</script>

<style lang="scss" scoped>

.pdf {

    width: 400px;

    height: 500px;

}

// 因为是禁止下载 所以页面也不允许右击保存

img {

    pointer-events: none;

}

* {

    -webkit-touch-callout: none;

    -webkit-user-select: none;

    -moz-user-select: none;

    -ms-user-select: none;

    user-select: none;

}

</style><style>

/* 解决pdfh5内部图片太大的问题 */

.pdfjs .pdfViewer {

    position: relative;

    top: 0;

    left: 0;

    width: 100% !important;

    padding: 10px 8px;

}

.pdfjs .pdfViewer .pageContainer {

    width: 100% !important;

    margin: 0px auto 8px auto;

    position: relative;

    overflow: visible;

    -webkit-box-shadow: darkgrey 0px 1px 3px 0px;

    -moz-box-shadow: darkgrey 0px 1px 3px 0px;

    box-shadow: darkgrey 0px 1px 3px 0px;

    background-color: white;

    box-sizing: border-box;

}

.pdfjs .pdfViewer .pageContainer img {

    width: 100% !important;

    height: 100% !important;

    position: relative;

    z-index: 100;

    pointer-events: none;

    /* user-select:none; */

}

</style>文章来源地址https://www.toymoban.com/news/detail-851617.html

到了这里,关于vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3前端h5移动端页面预览PDF使用pdfjs-dist,添加自定义文本水印

    pnpm i pdfjs-dist@2.5.207

    2024年01月18日
    浏览(77)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览(包括pdf选中文字,epub高亮等)

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(61)
  • vue下载pdf文件纯前端实现,不跳页面实现

    一、引入download.js npm install downloadjs 地址:https://www.npmjs.com/package/downloadjs 注意:使用download.js时下载的文件内容为该文件的url(url和filename参数有中文的话下载后的文件会损坏打不开,需要修改源码) 二、复制一份下载好的downloadjs 文件 , 修改后的源码

    2024年02月12日
    浏览(59)
  • 前端实现PDF预览【vue】

    前言:项目中提出这样一个需求,在移动端H5页面预览pdf功能。pdf文件由后端返回的一个地址,前端实现展示预览pdf文件 在此仅提供两种方法: 一、使用iframe标签通过src属性直接展示pdf文件         坑点:兼容比较差,PC端能正常展示,移动端会出现空白的问题 二、使用第

    2024年01月16日
    浏览(54)
  • 前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

    (一)微软office免费预览( 推荐 ) 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 (二)XDOC文档预览云服务  移动端和PC端无插件预览PDF、OFD、Word、WPS等多种格式文档 本地或内网预览需要借助插件实现,pdf、mp3、mp4等主要靠原生标签或浏览器自带功能,尽量减少

    2024年02月05日
    浏览(74)
  • java实现pdf文件添加水印,下载到浏览器

    添加itextpdf依赖 根据需求,不需要指定路径可以删除对应的输出流 效果如下:代码中的相对路径在src平级目录下,test.pdf是PdfStamper里面fileOutputStream生成的,test1.pdf是fos生成的 浏览器下载的如下: 生成的pdf内容如下(红框里面是pdf原来的内容,可以自己调整代码中注释掉的设

    2024年02月05日
    浏览(59)
  • 前端实现pdf,图片,word文件预览

    需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 iframe标签能够将另一个HTML页面嵌入到当前页面中,我们的图片也能够使用iframe标签来

    2024年02月11日
    浏览(56)
  • js实现PDF 预览和文件下载

    在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能, PDF 类型文件的来源又包括 H5 移动端 和 PC 端 ,而针对这两个不同端的处理会有些许不同,下文会有所提及。 针对 PDF 预览 的文章不在少数,但似乎都没有提及可能遇到的问题,或是提供对应的具体需求场景下如何

    2024年02月15日
    浏览(52)
  • vue中前端实现pdf预览(含vue-pdf插件用法)

      场景:前端需要根据后端返回的线上pdf的地址,实现pdf的预览功能。 情况一:后端返回的pdf地址,粘贴到浏览器的url框中,是可以在浏览器中直接进行预览的。 方法(1)可以直接使用window.open(\\\'获取到的pdf地址\\\')重新打开一个浏览器页签,通过浏览器页签直接实现预览功

    2024年02月04日
    浏览(51)
  • 前端实现文件预览(pdf、excel、word、图片)

    需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 sandbox 这个属性如果是单纯预览图片可以不使用,该属性对呈现在 iframe 框架中的内容

    2024年02月10日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包