使用pdf.js在Vue、React中预览Pdf文件,支持PC端、移动端

📝 使用背景

在前端开发中,有时候我们需要进行pdf文件的预览操作,通过在网上查询,基本都是一下几种常见的预览pdf文件的方法:

实现方案效果
HTML 标签iframe 标签iOS:只能展示第一页,多页不能展示
Android: 弹出下载弹窗
PC:正常展示
embed 标签iOS:只能展示第一页,
Android: 弹出下载弹窗,
PC:显示不出来
object 标签iOS:只能展示第一页,
Android: 弹出下载弹窗,
PC:正常展示
第三方插件react-pdf在React中使用,各端都能正常展示,且可以根据需要展示PDF的全部页数,设定翻页操作,但是部署到生产环境时存在bug
vue-pdf基于pdfjs封装,在Vue中使用,各端都能正常展示,且可以根据需要展示PDF的全部页数,设定翻页操作,但是部署到生产环境时存在bug
PDF.js各个项目均可使用,各端均能正常展示

标签的方式简单,支持大部分 PC 浏览器(IE 不支持),跨域资源同样可以,但是不支持移动端浏览器,不支持 IE 等低版本浏览器,样式无法自定义。因为本次项目需要在移动端展示,最后使用了pdf.js。

🛠 安装

直接使用官方封装好的 viewer.html 来展示自己的 PDF 文档,该方法比较简单,不用去操作 API;而且功能比较齐全,还可复制 pdf 中的文本。

  1. 官网地址: https://mozilla.github.io/pdf.js/,下载打包好的 Prebuilt 版本压缩包,下载后解压。
  2. 把pdf.js放在Vue/React项目根目录的public文件目录下,注意:要是没有这个文件可以放在static里效果都一样

⚙️ 使用配置

页面中,添加iframe标签
可以直接打开本地的pdf(compressed.tracemonkey-pldi-09.pdf),能打开说明pdf正常使用。
注:此处主要说明React中使用方法,Vue中使用场景下文常见问题中可以参考。
请添加图片描述

// React 项目
return (
  <iframe
        width="100%"
        height="100%"
        src={`/pdfjs/web/viewer.html?file=http://localhost:3003/pdfjs/web/compressed.tracemonkey-pldi-09.pdf`}  // 打开本地的pdf
        // src={`/pdfjs/web/viewer.html?file=${'https://mzy.lhzzs.top/pdfjs/web/compressed.tracemonkey-pldi-09.pdf'}`}  //  pdfUrl 接口返回的 pdf 文件
      ></iframe>
)

请添加图片描述

🚨 常见问题

  1. 跨域问题

不同域下会报下面这个错误
请添加图片描述

默认只能查看同域名下的 pdf 文件的,解决方法是 修改 viewer.js 文件的源码,将这个地方注释掉。

请添加图片描述

  1. 后端返回文件流
// Vue 项目
<template>
	<div>
		<div> <button @click="showPdf">点击显示pdf</button> </div>
		<iframe v-if="pdfUrl" :src="'/pdfjs/web/viewer.html?file='+ pdfUrl" width="500" height="500"></iframe>
	</div>
</template>

<script>
import axios from 'axios';
export default {
	data(){
		return {
			pdfUrl: ""
		}
	},
	methods: {
		showPdf(){
			axios({
		        method: "get",
		        responseType: "blob",
		        url: "xxx"   // 接口路径
		    }).then(res => {
		        console.log(res)
		        let blob = new Blob([res.data], {
		        	type: 'application/pdf;chartset=UTF-8'
		        })
		        this.pdfUrl = URL.createObjectURL(blob)   // 这个方法会创建一个临时的路径用于访问文件
		    })
		}
	}
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

conda安装cudatoolkit=11.6 (不在default channel的package)

问题描述 众所周知&#xff0c;conda有3个频道 - defaults - pytorch - conda-forge 直接执行 conda install cudatoolkit11.6发现不在当前频道&#xff0c; 添加频道 conda config --add channels conda-forge显示当前频道列表 conda config --show channels从conda-for…

深化产教融合“桥梁”作用!蓝卓携手宁波4大院校共育数智人才

建强“三支队伍”赋能新质生产力&#xff0c;为进一步加强新时代教师队伍建设改革&#xff0c;促进人才培养能力和服务企业能力“双提升”&#xff0c;7月2日&#xff0c;“2024企业实践工业互联网职业教育师资培训班”在蓝卓顺利开班。 来自宁波城市职业技术学院、宁波职业技…

【算法】插入排序

一、算法图示二、算法思想三、代码实现四、算法效率分析4.1 更新运行时长函数4.2 与选择排序对比五、算法改进5.1 结论分析5.2 改进算法图示5.3 算法说明5.4 代码实现5.5 算法效率对比1)算法升级前后对比2)与选择排序对比一、算法图示 二、算法思想 图示以7 1 5 4 1 8 11为例…

桌面记笔记的软件:能加密的笔记app

在日常生活和工作中&#xff0c;很多人都有记笔记的习惯。无论是记录会议要点、学习心得&#xff0c;还是生活中的点滴灵感&#xff0c;笔记都是我们不可或缺的好帮手。然而&#xff0c;传统的纸笔记录方式逐渐不能满足现代人的需求&#xff0c;因为纸质笔记不易保存、查找困难…

idea 内存参数修改不生效问题解决 VM参数设置不生效解决

很多人配置idea 内存参数&#xff0c;怎么配置都不生效&#xff0c;主要原因是配置文件用的不是你修改的那个。 系统环境变量中的这个才是你真正要修改的配置文件。 找到并修改后保存&#xff0c;重启idea就可生效

NodeJS 蔬菜自产零售混合销售平台-计算机毕业设计源码10149

摘 要 随着移动互联网的快速发展&#xff0c;购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一&#xff0c;在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序&#xff0c;用户可以通过它方便地浏览…

opencv编译报错OpenCV does not recognize MSVC_VERSION “1940“

具体如下: CMake Warning at cmake/OpenCVDetectCXXCompiler.cmake:182 (message):OpenCV does not recognize MSVC_VERSION "1940". Cannot set OpenCV_RUNTIME Call Stack (most recent call first):CMakeLists.txt:174 (include) 打开源码\opencv\sources\cmak…

springboot私人诊所管理系统-计算机毕业设计源码93887

摘要 随着科技的不断发展和医疗服务的日益普及&#xff0c;私人诊所管理系统成为现代医疗管理的重要组成部分。该系统通过引入计算机技术和互联网平台&#xff0c;为患者提供方便快捷的就诊方式&#xff0c;同时也为诊所、医院提供高效的资源管理和服务优化的途径。本文将介绍私…

Jlink调试的时候提示擦除超时,programming failed @ address 0x0804000

如果能正常下载进单片机&#xff0c;但是调试提示上面的信息。是keil的问题&#xff0c;把所有断点都取消了再调试就好了

Mybatis入门の基础操作

1 Mybatis概述 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解&#xff0c;将接口和 Java 的 POJOs(Plain Old Java Objects,普通的…

JavaScript中的this指向

1. 全局环境下的this 在全局环境中&#xff08;在浏览器中是window对象&#xff0c;在Node.js中是global对象&#xff09;&#xff0c;this指向全局对象。 console.log(this window); // 在浏览器中为true console.log(this.document ! undefined); // true&#xff0c;因为…

若依前后端分离 前端路由登录页 如何进行跳转

路由守卫&#xff0c;看这篇文章 http://t.csdnimg.cn/HkypThttp://t.csdnimg.cn/HkypT

LLM推理引擎性能评测对比:vllm、lmdeploy、tensorrt-llm

01 简介 在当今LLM时代&#xff0c;大模型的效果已经取得了长足的进步&#xff0c;逐渐成为业务流程中的重要部分&#xff0c;因此对性能进行评估变得至关重要&#xff0c;由于目前LLM推理都需要比较高级的GPU&#xff0c;使得LLM推理成本高&#xff0c;因此在不同使用场景下…

VS2019+QT VS tools:Debug下ok,relese下报错

报错界面 踩得坑&#xff1a; 尝试一下重装 QT VS tools&#xff0c;结果装不上。 尝试卸载原来的QT VS tools&#xff1a;卸载方法&#xff0c;到下面文件夹下可以看到有两个文件夹&#xff0c;分别是两个插件&#xff0c;找到QT的插件&#xff0c;删除文件夹即可。但是删除…

基于深度学习网络的USB摄像头实时视频采集与火焰检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放火焰的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中&#x…

实验七 SQL数据更新和视图

题目 &#xff08;1&#xff09;向商品类别表category中插入一条记录&#xff08;801&#xff0c;‘座椅套’&#xff0c;‘各种品牌的汽车座套’&#xff09; &#xff08;2&#xff09;向商品表product中插入一条记录&#xff1a;商品编号80101&#xff0c;商品名称“四季通…

汽车免拆诊断案例 | 2021款路虎揽胜运动版车遥控及一键起动功能失效

故障现象 一辆2021款路虎揽胜运动版车&#xff0c;搭载AJ20-P6H3L发动机&#xff0c;累计行驶里程约为2.5万km。车主反映&#xff0c;使用智能钥匙无法解锁车门&#xff0c;使用机械钥匙打开车门&#xff0c;进入车内&#xff0c;发现一键起动功能也失效&#xff1b;根据组合…

电脑录制视频的软件,电脑录制,4款免费软件推荐

在数字化时代&#xff0c;电脑录制视频的软件已成为我们日常生活和工作中的得力助手&#xff0c;这些软件可以帮助我们轻松捕获到屏幕上的精彩瞬间。但同时市面上的录制视频软件也层出不穷&#xff0c;让人不知该如何选择。到底怎样才能选择到一款适合自己的录屏软件呢&#xf…

实验4 宏指令及子程序设计实验

从键盘输入10个无符号十进制数&#xff08;小于256&#xff09;&#xff0c;将其转换为二进制数并存放在NUM字节型变量中&#xff0c;找出其中的最大数&#xff0c;并将找出的最大数在屏幕上显示出来。 要求&#xff1a; 1&#xff09;在屏幕上显示字符串提示信息的功能由宏指…