H5移动端文件预览pdf

H5移动端文件预览pdf

需求:H5页面嵌入浙政钉,需要文件预览Pdf。

试用了多个插件,踩了很多坑,如果小伙伴有类似填坑经历,并成功解决,感谢留言指点!!!

先讲最终方案,兼容ios,安卓,鸿蒙多种系统手机,移动端和pc端的pdf预览方式 — pdf.js + iframe。

成功案例 pdf.js + iframe

步骤一: 下载 pdf.js , pdfjs 下载地址:https://pan.baidu.com/s/1Meh_hSlwCPvN6wPKzYNfyQ

提取码:pdfj

步骤二: 把下载下来的文件夹,放到项目中。注意:放在不会被打包压缩的地方,比如 public 或 static 文件夹中,因为后面会用到web 文件中的 view.html 对文件地址进行代理。【注:viewer.html 是pdf 的查看器】
步骤三:新建一个组件,pdfjs.vue
    <template><div><iframe width="100%" style="height: 100vh;border:none;" :src="pdfSrc"></iframe><van-button class="close" @click="closePdf">关闭</van-button></div></template><script>export default {name: 'pdf',props: {pdfurl: {type: String,},},data(){return {pdfSrc: ''}},mounted() {console.log('pdfurl', this.pdfurl)// 此处,我是把文件夹放到public中,pdf文件夹就在打包完的文件夹下,pdf/web/viewer.htmlthis.pdfSrc = `${window.location.origin + window.location.pathname}pdf/web/viewer.html?file=${encodeURIComponent(this.pdfurl)}`console.log('pdfSrc', this.pdfSrc)},methods: {closePdf() {this.$emit('closePdf')}}}</script><style scoped>.close {position: absolute;left: 0;bottom: 0;height: 80px;width: 100%;line-height: 40px;text-align: center;color:#367CFD;font-size: 36px;background: #fff;}</style>
步骤四: 使用
 <template><div><!-- ... --><van-popup v-model="previewFile" position="bottom"><pdf :pdfurl="preFileUrl" @closePdf="closePdfFn"></pdf></van-popup></div></template><script>// 引入pdfjs组件import pdf from '../../components/pdfjs.vue'export default {components: {pdf},data() {return {previewFile: false,preFileUrl: '', // 'https://xxxx?key=xxx.pdf'}},mounted() {},methods: {oprenPdfFn() {this.previewFile = true},closePdfFn() {this.previewFile = false}}}</script>

其他踩了很多坑的方案,结果还是不行,时间关系没再仔细研究

经过下面几个插件的试用,发现ios都能展示,而且用a标签也可以展示,应该是内置了预览组件。安卓和鸿蒙就不行,自带浏览器也都是直接跳下载,谷歌浏览器可以预览。

1. 简单的前端处理方式:

url: 文件地址(一般为文件流形式)
a 标签, <a :href="url"></a>window.open(url)  //新建窗口打开链接预览
window.location.href = 文档地址;  //本页面内跳转链接实现预览iframe 预览:<iframe :src="url" width="100%" height="100vh"></iframe>以上方式,部分浏览器 或 手机app不能直接打开,会自动回退成下载链接,比如鸿蒙,比如IE

iframe内嵌常见问题:https://blog.csdn.net/qq_35408366/article/details/128447408

2. pdfh5 预览(移动端,h5)

  1. npm install pdfh5 , (会报错,需要其他依赖,不能直接用提示的语句直接npm下载,依旧会报错,npm报错:These dependencies were not found:* canvas in ./node_modules/pdfh5/js/pdf.js* dommatrix/dist/d )

  2. npm install canvas@2.8.0 --ignore-scripts

  3. npm install --save dommatrix

  4. npm install --save web-streams-polyfill

  5. 运行就成功了,亲测可行,但是pc端运行打不开 pdf的文件【vue-pdf 和 pdfh5 不可同时引用】,而且需要点两次才能获取到 pdfh5 这个对象。

  6. 引用 pdfh5 和 css【关于css的引入方式,网上也有踩了很多坑的,下面这种是最佳方式,亲测可行】

    import Pdfh5 from 'pdfh5'import 'pdfh5/css/pdfh5.css'
  1. 定义容器【id】
      <div id="pdf-content" style="height: 100%;width: 100%"></div>openPdf(url) {// pdfh5实例化时传两个参数:selector选择器,options配置项参数,会返回一个pdfh5实例对象,// 可以用来操作pdf,监听相关事件this.pdfh5 = new Pdfh5('#pdf-content', {pdfurl: url || this.preFileUrl,lazy: false, // 是否懒加载,默认falserenderType: 'canvas', // canvas、svg,默认canvasmaxZoom: 3, // 手势缩放最大倍数,默认3scrollEnable: true, // 是否允许pdf滚动,默认truezoomEnable: true,// 是否允许pdf手势缩放,默认truelimit: 0, // 限制pdf加载最大页数,默认0不限制goto: 1,// 设置每一页pdf上的水印// logo: { src: require("@/assets/images/icon27.png"), x: 20, y: 70, width: 60, height: 60 },});console.log('pdfh5', this.pdfh5)// 监听pdf准备开始渲染,此时可以拿到pdf总页数this.pdfh5.on('ready', function(totalNum) {console.log('总页数:' + totalNum);});// 监听pdf加载完成事件,加载失败、渲染成功都会触发this.pdfh5.on('complete', (status, msg, time) => {console.log('状态:' + status + ',信息:' + msg + ',耗时:' + time + '毫秒');})},

vue2 和 vue3 代码举例: https://blog.csdn.net/u014212540/article/details/129408653

遇到的问题:

  1. 下载依赖,一直报错,无法正常运行,切换 node 和 npm 版本都无果。解决方式:参考上文1234,按次序下载依赖。
  2. pc端运行打不开 pdf 的文件【vue-pdf 和 pdfh5 冲突,不可同时引用,原因未细究】,而且需要点两次才能获取到 pdfh5 这个对象【未解决】
  3. 安卓直接打不开项目,ios可以正常打开且能预览

3.vue-pdf 预览

遇到问题:

  1. vue-pdf 默认只能显示第一页,通过获取总页数遍历解决。
  2. vue-pdf 默认不可手机端两指放大缩小,加 页面放大缩小:
    <template><div class="pdf_wrap"><div class="pdf_btn"><van-button @click="scaleD()">放大</van-button><van-button @click="scaleX()">缩小</van-button><van-button @click="clock()">顺时针</van-button><van-button @click="counterClock()">逆时针</van-button></div><div class="pdf_list"><!-- src:pdf地址,page: 当前显示页 --><pdfref="pdf"v-for="i in numPages":key="i":src="src":page="i":rotate="pageRotate"style="width: 100%"></pdf></div><van-button class="close" @click="closePdf">关闭</van-button></div></template> <script>import pdf from 'vue-pdf';import CMapReaderFactory from 'vue-pdf/src/CMapReaderFactory.js'// import pdf from 'vue-pdf/src/vuePdfNoSssNoWorker.vue';export default {components: {pdf,},props: {pdfurl: {type: String,},},data() {return {src: '',numPages: undefined,scale: 100,pageRotate: 0}},mounted() {console.log('pdf', pdf)this.loadPdf(this.pdfurl)},methods: {loadPdf(url) {console.log(url, 'url')this.src = pdf.createLoadingTask({url,// pdf内容文字丢失cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.5.207/cmaps/',//引入pdf.js字体cMapPacked: true,// 动态文字不展示问题CMapReaderFactory})console.log(this.src, 'src')this.src.promise.then(pdf => {console.log(pdf, 'pdf')this.numPages = pdf.numPages // 这里拿到当前pdf总页数}).catch(err => {console.log('err', err)})console.log(this.src, 'src11111')},closePdf() {this.$emit('closePdf')},//放大scaleD() {this.scale += 20;console.log('refs.pdf', this.$refs.pdf)if (this.$refs.pdf && this.$refs.pdf.length > 0) {this.$refs.pdf.forEach(pdfPage=>{pdfPage.$el.style.width = parseInt(this.scale) + '%';})} else {this.$refs.pdf.$el.style.width = parseInt(this.scale) + '%';}},//缩小scaleX() {if (this.scale === 100) {return;}this.scale += -20;if (this.$refs.pdf && this.$refs.pdf.length > 0) {this.$refs.pdf.forEach(pdfPage=>{pdfPage.$el.style.width = parseInt(this.scale) + '%';})} else {this.$refs.pdf.$el.style.width = parseInt(this.scale) + '%';}},// 顺时针clock() {this.pageRotate += 90;},// 逆时针counterClock() {this.pageRotate -= 90;}}}</script><style  scoped>.pdf_btn button {color:#367CFD;}.pdf_wrap {background: #fff;height: 100vh;position: relative;}.pdf_list {height: 100vh;overflow: scroll;}.close {position: absolute;left: 0;bottom: 0;height: 60px;width: 100%;line-height: 40px;text-align: center;color:#367CFD;font-size:30px;background: #fff;}</style>
  1. vue-pdf 不太友好,网上有说用 vue-pdf-signature 替代,依旧一样的问题。

  2. 安卓显示不全,鸿蒙白屏,ios可以显示。

网上解决方法:https://blog.csdn.net/PokoMobula/article/details/103164795,未解决问题;https://blog.csdn.net/weixin_44612172/article/details/127783210, 未解决问题imagepng

  1. 引入上面的字体后,安卓直接白屏,iOS依然可以显示。问题依旧。

4.pfile 代理

    let url = 'https://xxxx?key=xxx.pdf'let pfileUrl = 'http://www.pfile.com.cn/api/profile/onlinePreview?url='+encodeURIComponent(url)window.open(pfileUrl);

遇到问题:

  1. 三种手机系统都打不开,需要手动转跳到浏览器中打开,浏览器都能正常预览。

预测方案:按成功方案预测,iframe + pfile 代理,应该也能实现。

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

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

相关文章

一个诗词网站的设计与实现

诗词网 0、前言 ​  前段时间非常喜欢诗词&#xff0c;又恰逢想开发一个社区类的系统&#xff0c;于是便有将两者结合起来的构想&#xff0c;说干就干&#xff0c;便有了诗词网&#xff08;诗词社区系统&#xff09;这个项目。 ​  由于是利用空闲时间进行开发&#xff0c…

LeetCode | 寻找两个正序数组的中位数 Python C语言

Problem: 4. 寻找两个正序数组的中位数 文章目录 思路解题方法Code结果结果一些思考 思路 先合并&#xff0c;后排序&#xff0c;最后找中间轴。 解题方法 由解题思路可知 Code 这是python3的代码。 class Solution(object):def findMedianSortedArrays(self, nums1, num…

PyTorch深度学习实战(37)——CycleGAN详解与实现

PyTorch深度学习实战&#xff08;37&#xff09;——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN)&#xff0c;可以在不需要配…

docker 安装Oracle19c

一、下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c通过docker images 命令查看 如下图&#xff1a;已经有oracle 19c镜像。 二、创建挂载文件 # 创建文件 mkdir -p /home/data/oracle/oradata# 授权&#xff0c;不授权会导致后面安装失败 c…

六西格玛培训揭秘:线上与线下费用差异背后的原因

在当今知识经济的时代&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;受到越来越多企业和个人的青睐。然而&#xff0c;当我们在选择六西格玛培训时&#xff0c;不难发现线上和线下的培训费用存在明显的差异。那么&#xff0c;究竟是什么原因导致了这种差异呢&…

NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]

org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码&#xff1a; #include <android/log.h> #define LOG_TAG "MyJNI" #d…

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregation…

压缩感知中常用的稀疏基

稀疏基的基本概念 在压缩感知中&#xff0c;稀疏基是指可以将信号表示为少数几个非零系数的基。信号在这组基下的表示称为稀疏表示。理想情况下&#xff0c;信号在稀疏基下的大部分系数都应该为零&#xff0c;只有少数几个系数是非零的。稀疏基的选择对信号的稀疏表示和压缩感…

第3.4章:StarRocks数据导入-Routine Load

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Routine Load导入机制 一、概述 Routine Load&#xff08;例行导入&#xff09;支持用户提交一个常驻的导入任务&#xff0c;可以将消息流存储在 Kafka 的Topic中&#xff0c;通过订阅Topic 中的全部或部分分区的消息&#…

AN7525 集成锂电池充电管理和轻触三功能 LED 驱动专用芯片 实现全亮、25%亮、暴闪和灭 三种功能

AN7525是一款单片集成锂电池充电管理和轻触三功能 LED 驱动专用芯片。其内部集成了锂电池充电管理电路&#xff0c;可提供高达 600mA的充电电流:内部集成了高达 800m 的 LED 驱动电路&#xff0c;可驱动单颗 LED 实现全亮25%亮、暴闪和灭循环的轻触三功能切换控制。 AN…

【MySQL】报错 Incorrect string value: ‘\xE5\xA4\xA9\xE5\x96\x9C‘ for column的解决方法

目录 解决方法如下&#xff1a;例如&#xff1a; 在向数据库中插入中文时遇到报错Incorrect string value: \xE5\xA4\xA9\xE5\x96\x9C for column &#xff0c;此时为数据库的编码格式有问题&#xff0c;可以按照如下方法修改 解决方法如下&#xff1a; 使用show create table…

Hash 算法详解!

什么是Hash算法 散列算法&#xff08;Hash Algorithm&#xff09;&#xff0c;又称哈希算法&#xff0c;杂凑算法&#xff0c;是一种从任意文件中创造小的数字「指纹」的方法。Hash算法就是一种以较短的信息来保证文件唯一性的标志&#xff0c;这种标志与文件的每一个字节都相…

COMSOL在光电领域应用(常见案例合集)

随着科技的飞速发展&#xff0c;光电领域作为现代科学与技术的交汇点&#xff0c;正受到越来越多的关注。在这一领域中&#xff0c;COMSOL作为一款强大的多物理场仿真软件&#xff0c;正发挥着不可或缺的作用。本文将通过一些常见的案例&#xff0c;探讨COMSOL在光电领域的应用…

学习数仓工具 dbt

DBT 是一个有趣的工具&#xff0c;它通过一种结构化的方式定义了数仓中各种表、视图的构建和填充方式。 dbt 面相的对象是数据开发团队&#xff0c;提供了如下几个最有价值的能力&#xff1a; 支持多种数据库通过 select 来定义数据&#xff0c;无需编写 DML构建数据时&#…

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)

随着社会的发展和科技的进步&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素&#xff0c;以确保平台的稳定性和可用…

openEuler2203 LTS安装VMware WorkStation Pro 17并远程桌面连接Linux服务器

openEuler 2203 LTS默认只有命令行&#xff0c;没有GUI图形界面&#xff0c;在其中安装VMware WorkStation需要有图形界面的支持。这里以安装深度的DDE桌面环境&#xff0c;最后通过VNC远程桌面连接Linux服务器操作VMware WorkStation。 以下操作请保持网络能正常连接 1、安装…

智能搬运机器人|海格里斯将如何持续推进工业和物流的智能化升级与发展?

存取、搬运、分拣是物流行业中的通用功能&#xff0c;但具体到每个行业又十分不同&#xff0c;例如&#xff1a;新能源电池领域&#xff0c;它所搬运的东西是电池&#xff0c;50KG~200KG&#xff1b;快递行业领域&#xff0c;所要处理的物料是那种扁平件和信封等等&#xff0c;…

AN7523 轻触三功能LED驱动芯片 全亮、25%亮和暴闪三种功能的切换 适用于头灯、手电筒等

AN7523是一款轻触三功能 LED 驱动芯片。可驱动单颗 LED 实现全亮、25%亮、暴闪和灭循环的轻触三功能切换控制。AN7523内部集成按键防抖模块&#xff0c;可实现对轻触开关的检测与按键防抖。通过轻触开关控制LED实现全亮、25%亮和暴闪三种功能的切换&#xff0c;并可通过长按开关…

音频常用测试参数(一)

一、总谐波失真&#xff08;THDN&#xff09; 总谐波失真指音频信号源通过功率放大器时&#xff0c;由于非线性元件所引起的输出信号比输入信号多出的额外谐波成份。谐波失真是由于系统不是完全线性造成的&#xff0c;我们用新增加总谐波成份的均方根与原来信号有效值的百分比来…

2.5《Python3 网络爬虫开发实战》学习之实例实战1

目录 1 实战内容 2 确定思路 3 代码实操 3.1 实现一个个网页的爬取 3.2 爬取每一个网页的电影详情页url ​编辑 3.3 连接链接&#xff0c;针对每个详情页链接进行爬取、汇总内容 3.4 存储在txt文件中 4 结尾&#xff1a;整体代码 1 实战内容 爬取Scrape | Movie中所有…