vue项目展示pdf文件

news2024/12/22 6:07:17

记录贴

最近我有个需求,就是在h5页面上展示pdf文件,分页,最后一页有个蒙层阴影渐变的效果,尝试过一些插件,但都不是很好用,最后用了pdfjs-dist加上canvas
可以看下效果
在这里插入图片描述
先下载:

npm i pdfjs-dist@2.5.207

下面展示代码
html:

<template>
	<canvas v-for="pageNumber in pageCount" :key="pageNumber" :id="`refCanvas${pageNumber}`" style="width: 100%; height: auto"></canvas>
</template>

js:

<script>
import workerSrc from 'pdfjs-dist/build/pdf.worker.entry'
const PDFJS = require('pdfjs-dist')
PDFJS.workerSrc = workerSrc

export default {
    data() {
        return {
            url: '',
            pageCount: null,
            scale: 2,

            width: '',
            height: '',
        }
    },
    mounted() {
        this.getPdfFile()
    },
    methods: {
        async getPdfFile() {
            await apiName({
               xxx:xxx
            }).then((res) => {
                var binaryData = [];
                binaryData.push(res);
                let url = window.URL.createObjectURL(new Blob(binaryData, {
                    type: "application/pdf"
                }))
                this.url = url
                this._loadFile(url);
            }).catch((err) => {
                console.log('err', err)
            })
        },
        _loadFile (url) {
            // 获取整个 文档
            PDFJS.getDocument({
                url,
                cMapPacked: true
            }).promise.then(async (pdf) => {
            	let pageCount = pdf.numPages
                this.pageCount = pageCount
                for (let i = 1; i <= pageCount; i++) {
                     const page = await pdf.getPage(i)
                     const viewport = page.getViewport({scale: this.scale})
                     const canvas = document.getElementById(`refCanvas${i}`);
                     
                     canvas.height = viewport.height
                     canvas.width = viewport.width
                     this.width = viewport.width
                     this.height = viewport.height

                     const renderContext = {
                         canvasContext: canvas.getContext('2d'),
                         viewport
                     }

                     page.render(renderContext).promise.then(() => {
                         // 最后一页pdf增加蒙层
                         if(i === pageCount) {
                             this.addMask(i)
                         }
                     })
                 }
            },(err) => {
                if(err.name == 'MissingPDFException'){
                    console.log('无效的PDF链接')
                }
            })
        },
        // 添加蒙层
        addMask(i) {
            const canvas = document.getElementById(`refCanvas${i}`);

            let ctx = canvas.getContext('2d')

            const gradient = ctx.createLinearGradient(0, this.height / 5, 0, this.height);
            gradient.addColorStop(0, "rgba(243, 244, 249, 0)");
            gradient.addColorStop(0.2, "rgba(243, 244, 249, 0.3)");
            gradient.addColorStop(0.4, "rgba(243, 244, 249, 0.7)");
            gradient.addColorStop(0.5, "rgba(243, 244, 249, 0.9)");
            gradient.addColorStop(0.6, "rgba(243, 244, 249, 1)");
            gradient.addColorStop(0.8, "rgba(243, 244, 249, 1)");
            gradient.addColorStop(1, "rgba(243, 244, 249, 1)");

            ctx.fillStyle = gradient;
            ctx.fillRect (0, this.height / 5, this.width, (this.height / 5) * 4);
        }
    }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/773245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈设计模式之单例模式

0 单例模式简介 单例模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。单例模式指的是单一的一个类&#xff0c;该类负责创建自己的对象&#xff0c;并且保证该对象唯一。该类提供了一种访问其唯一对象的方法&#xff0c;外部需要调用该类的对象可以通过方法获…

Python 自学 day06 JSON 数据传输,折线图,柱状图,动态柱状图

1.python JSON的知识 1.1 什么是 JSON 答&#xff1a; JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据. JSON本质上是一个带有特定格式的字符串。 1.2 JSON 的主要功能 答&#xff1a;json就是一种在各个编程语言中流通的…

栈和队列OJ

文章目录 1.用队列实现栈2.用栈实现队列3.设计循环队列4.循环队列经典题 1.用队列实现栈 typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct Queue {QNode* head;QNode* tail; }Queue; typedef struct MyStack …

⛳ Java数组

Java数组的目录 ⛳ Java数组&#x1f3a8; 一&#xff0c;一维数组&#x1f463; 1.1&#xff0c;概念&#x1f4e2; 1.2&#xff0c;基本用法1&#xff0c;语法格式2&#xff0c;代码 &#x1f4bb; 1.3&#xff0c;内存结构&#x1f4dd; 1.4&#xff0c;练习 &#x1f381; …

天翎MyApps低代码平台唯品会金牌客服管理系统

项目痛点&#xff1a; 作为一家知名的创新大型电商&#xff0c;唯品会秉承“传承品质生活&#xff0c;提升幸福体验”的企业使命。基于客服铁军锻造项目&#xff0c;实现基于金牌案例的提交、评审、积分&#xff0c;学习功能。 项目中的晋升机制、案例产生学习机制、双激励机制…

赛桨PaddleScience v1.0正式版发布,飞桨科学计算能力全面升级!

AI for Science日益表现出突破传统科学研究能力瓶颈的巨大潜力&#xff0c;正在成为全球科学研究新范式。近年来&#xff0c;各学科不断加入&#xff0c;模型精度、泛化性逐渐提高&#xff0c;不同技术路径、不同应用场景的AI for Science成功应用不断涌现&#xff0c;深度融合…

详解 Spring - Ioc(控制权反转) 和 DI(依赖注入)

目录 Spring 是什么? Ioc Ioc 的优点 DI Ioc 和 DI 的区别 Spring 是什么? 通常情况下 Spring 是指 Spring Framework (Spring 框架), 是一个开源框架, 有着庞大的社区, 这就是他能长久不衰的原因, Spring 支持广泛的应用场景, 他可以让企业级的应用开发起来更简单 S…

Selenium之css如何实现元素定位,你了解多少?

前言 世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随…

简单认识框架

hi,大家好,好久不见今天为大家带来框架相关的知识 文章目录 &#x1f338;1.框架&#x1f95d;1.1为什么要学习框架 &#x1f338;2.框架的优点&#x1f95d;2.1采用servlet创建项目&#x1f440;2.1.1缺陷 &#x1f95d;2.2采用SpringBoot创建项目&#x1f440;2.2.1优势 &…

Vue-Cli脚手架的安装和使用

文章目录 一、Vue-Cli脚手架的环境准备1. 安装Node.js1-1 去 [Node.js官网](https://nodejs.org/zh-cn/) 下载安装包&#xff0c;修改安装路径到其它盘&#xff0c;如 G:\Program Files1-2 安装npm淘宝镜像&#xff0c;提速 2. 设置 cnpm的下载路径和缓存路径2-1 在安装目录 G:…

Zoho Projects:Jira的理想替代品,让项目管理更高效

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但同时也有非常明显的缺点。今天&#xff0c;我们将向大家…

知识普及:[18F]FB RGD,18F标记RGD多肽,tumor显像剂,

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 为大家介绍&#xff08;CAS&#xff1a;N/A&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用 分子式&#xff1a;C34H44FN9O9 分子量&#xff1a;740.8 中文名称&#xff1a…

linux之Ubuntu系列 系统信息 (一)查看文件、磁盘 、进程

时间和日期 查看当前的系统时间 date 查看日历 -y 显示本年度日历&#xff0c; 不加-y 选项&#xff0c;显示本月日历 cal [-y] 查看磁盘 和 目录 空间 df [-h] df&#xff1a;disk free 显示磁盘可用空间&#xff0c;-h&#xff0c;跟 ls -lh 效果类似&#xff0c;以人性化方…

Python 字典 get()函数使用详解,字典获取值

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 get函数使用详解 1、设置默认返回值2、嵌套字典取值3、get() 和 dict[key] 的区别…

使用WebRTC实现多人视频会议

1.初步准备 1.1.使用同事nodejs开发的一个信令服务器。提供Https的WebSocket功能 1.2.准备一个多人视频会议的客户端Web程序client.html 2.遇到问题 2.1.在Tomcat下打开client.html&#xff0c;如果不使用http://127.0.0.1:8081/vedio/client.html&#xff0c;而使用实际IP…

DETR的位置编码

记录一下&#xff0c;以防忘记。 首先&#xff0c;致谢知乎vincent DETR论文详解 DETR中有这样一个类和一个包装函数 class NestedTensor(object):def __init__(self, tensors, mask: Optional[Tensor]):self.tensors tensorsself.mask maskdef to(self, device):# type: …

C知道,CSDN 出来的AI尝试

已经上图&#xff0c;算力不知道怎么样。 C知道 (csdn.net)

JDK、JRE与JVM三者之间的关系及区别

文章目录 0、关系1、JDK2、JRE3、JVM 0、关系 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap等]JRE JVM Java 的核心类库 1、JDK 什么是JDK&#xff0c;JDK是用于Java程序开发的最小环境&#xff0c;包含&#xff1a;Java程序设计语言&#xff0c;Java虚拟机&#…

git : 从入门到实战进阶

目录 0. 前言 1. git stash: 暂时保存本地修改 2. git push时发生冲突怎么办&#xff1f; 3. 访问过去的提交版本&#xff1a;git checkout 3.1 detached HEAD 3.2 “detached HEAD”状态下所作的修改会怎样呢&#xff1f; 3.3 “detached HEAD”状态下所作的修改如何汇…