位置: IT常识 - 正文

移动端h5显示pdf的3种方法总结(h5移动端上传pdf)

编辑:rootadmin
移动端h5显示pdf的3种方法总结

推荐整理分享移动端h5显示pdf的3种方法总结(h5移动端上传pdf),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:h5转换pdf,h5 pdf阅读器,html5 pdf,h5页面显示,h5页面显示,h5页面显示,h5页面显示,h5页面显示,内容如对您有帮助,希望把文章链接给更多的朋友!

移动端显示h5我目前已经尝试了3种方法: 我使用的是vue的2.X版本

后端返回一个pdf的链接,然后前端直接使用location.href = ‘http://www.XXX.com/test.pdf’,这种形式苹果手机应该是没问题的,但是安卓手机默认会触发下载,所以不推荐。使用pdfjs,这是pdfjs的下载地址,点击下载之后会下载一个压缩包,里面包含build,web文件夹和LICENSE文件,把他们解压之后放在static目录下面,这里给一个目录结构(我的项目是vue2.X项目):|src|static|pdfjs|build|web

然后在使用的时候是这样的

<iframe ref="iframeRef" frameborder="0" width="100%" :src="/static/pdfView/web/viewer.html?file='XXX"/>

前面的这个/static/pdfView/web/viewer.html是你的静态资源路径,例如你的网页地址是http://www.XXX.com,那么就是http://www.XXX.com/static/pdfView/web/viewer.html,至于这个viewer.html是什么,他是pdfjs提供的一个渲染pdf的入口,也就是通过iframe内嵌viewer.html,然后通过file字段告诉viewer.html一些细节。file可以是http://www.XXX.com/test.pdf这种.pdf的形式,也可以是http://www.XXX.com/getPdfBlob?pdfName=123_指南,这种blob二进制流形式。 但是经过测试,我发现vivo的部分手机和iponeX无法正常显示

使用pdfjs-dist (这个是最终方案),这里需要注意两个细节:

第一个是pdfjs-dist下载需要下载2.0.943版本

npm install --save pdfjs-dist@2.0.943

第二个是导入的时候

const pdfJS = require("pdfjs-dist");pdfJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.entry");

尤其是一定要配置pdfJS.GlobalWorkerOptions.workerSrc,pdfjs-dist里面需要引入pdf.work.js,但是静态资源会被重定向到index.html,所以一定要配置pdfJS.GlobalWorkerOptions.workerSrc。

基本起步就是这些,我把我的一些代码粘贴到这里。我这里获取的pdf是二进制流的形式:

<template> <div class="canvas-container"> <canvas class="pdf-container" v-for="page in numPages" :key="page" :ref="'myCanvas_' + page"> </canvas> </div></template><script>const pdfJS = require("pdfjs-dist");import { getPDFBlob } from "@/api"pdfJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.entry");export default { created() { getPDFBlob("http://www.XXX.com/getPdfBlob?pdfName=123_指南") .then((res) => { let fileURL = URL.createObjectURL(res.data) this.renderPage(fileURL); }) .catch((error) => { console.log("error", error); }); }, data() { return { numPages: 0 } }, methods: { renderPage(pdfUrl) { let pdfData = pdfJS.getDocument(pdfUrl); pdfData.promise.then((pdf) => { this.numPages = pdf.numPages for (let i = 1; i <= this.numPages; i++) { pdf.getPage(i).then((page) => { let canvas = this.$refs['myCanvas_' + i][0]; let viewport = page.getViewport(3); canvas.height = viewport.height; canvas.width = viewport.width; let ctx = canvas.getContext("2d"); let renderContext = { canvasContext: ctx, viewport: viewport, }; page.render(renderContext) }); } }); }, }};</script><style scoped>.canvas-container { width: 100%; overflow: hidden;}.pdf-container { width: 100%;}</style>移动端h5显示pdf的3种方法总结(h5移动端上传pdf)

这里有两个需要注意的:

第一个是import { getPDFBlob } from “@/api”里面的getPDFBlob 是一个方法,他会拉取一个pdf的blob流。 第二个是let viewport = page.getViewport(3);可以调整canvas的清晰度,如果感觉canvas显示的pdf模糊,可以尝试增大 page.getViewpor入参的数值。

但是这里还是要说一句,pdf虽然正常显示了,但是交互不是太好,因为不支持双手捏合方法缩小,不支持双击放大缩小(当然你也可以直接开启css的touch-action属性)。如果支持,还需要监听双击和双指操作事件

后续

在我使用pdfjs-dist时,也就是我说的第三种方案的时候,我发现部分pdf出现了显示不全的问题,打冷眼看以为是乱码,放大仔细一看其实是大部分文字没显示出来,导致零零散散的文字看起来像乱码。并且后台有警告(警告大概意思是字体包没有提供)。

Warning: Error during font loading: The CMap “baseUrl” parameter must be specified, ensure that the “cMapUrl” and “cMapPacked” API parameters are provided.

我在这篇文章中获得了启发,我简单介绍一下我的思路。解决步骤:

如果找不到字体包就引入线上的线上字体包的地址是 https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/

首先这个逻辑需要在源码里面修改,找到目标目录地址node_modules > pdfjs-dist>build>pdf.js

图片中画红框的内容是需要加的内容。我在下面给出代码的上下文,方便搜索和复制。

params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; params.CMapReaderFactory = params.CMapReaderFactory || _dom_utils.DOMCMapReaderFactory; params.ignoreErrors = params.stopAtErrors !== true; params.pdfBug = params.pdfBug === true; params.cMapPacked = true params.cMapUrl = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/' var NativeImageDecoderValues = Object.values(_util.NativeImageDecoding);

改完之后就可以正确显示文字了

在这里大家可能看到引入的链接是https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/,通过这个链接感觉好像把pdfjs-dist升级到2.2.228版本就可以了?于是我删除了之前的包然后安装

npm install pdfjs-dist@2.2.228 -S

发现不行,还是会缺文字。

本文链接地址:https://www.jiuchutong.com/zhishi/281361.html 转载请保留说明!

上一篇:笔记本保养技巧(笔记本保养技巧和方法)

下一篇:文竹的养殖方法和注意事项(图文)(文竹浇白糖水的正确方法)

  • 论坛发帖推广的技巧(论坛发帖推广的类型有哪些?)

    论坛发帖推广的技巧(论坛发帖推广的类型有哪些?)

  • 华为p40pro屏幕像素密度ppi是多少呢(华为p40pro屏幕感觉不清晰)

    华为p40pro屏幕像素密度ppi是多少呢(华为p40pro屏幕感觉不清晰)

  • 荣耀v30pro对比华为p40pro(荣耀v30pro对比华为p40)

    荣耀v30pro对比华为p40pro(荣耀v30pro对比华为p40)

  • 华为mate20有3.5的耳机孔吗(mate20 3.5mm)

    华为mate20有3.5的耳机孔吗(mate20 3.5mm)

  • 苹果11最高支持多少w快充(苹果11最高支持多少w无线充电)

    苹果11最高支持多少w快充(苹果11最高支持多少w无线充电)

  • gt820m相当于什么显卡(gt820tm)

    gt820m相当于什么显卡(gt820tm)

  • 网站维护一般要几天(网站维护一般都是维护什么)

    网站维护一般要几天(网站维护一般都是维护什么)

  • 小米手环4收不到微信提示(小米手环4收不到信息怎么回事)

    小米手环4收不到微信提示(小米手环4收不到信息怎么回事)

  • 表格的字怎么分两行

    表格的字怎么分两行

  • ios13.4锁屏后自动亮屏(iphone 自己锁屏)

    ios13.4锁屏后自动亮屏(iphone 自己锁屏)

  • 相机的cmos在哪里(相机里面的cmos)

    相机的cmos在哪里(相机里面的cmos)

  • c语言是一种什么语言(C语言是一种什么类型的语言)

    c语言是一种什么语言(C语言是一种什么类型的语言)

  • 微信手机电脑同步聊天记录吗(微信手机电脑同步登录,手机聊天信息同步电脑吗)

    微信手机电脑同步聊天记录吗(微信手机电脑同步登录,手机聊天信息同步电脑吗)

  • 华为mate30值不值得买(mate30值得买不)

    华为mate30值不值得买(mate30值得买不)

  • 电话有hd符号是怎么回事(电话有hd符号是啥意思)

    电话有hd符号是怎么回事(电话有hd符号是啥意思)

  • 怎么查自己名下的手机号(怎么查自己名下有没有房产)

    怎么查自己名下的手机号(怎么查自己名下有没有房产)

  • 怎么用虚拟号发短信(怎么用虚拟号发短信给自己)

    怎么用虚拟号发短信(怎么用虚拟号发短信给自己)

  • 手机号后四位代表什么(手机号后四位代表的宫位)

    手机号后四位代表什么(手机号后四位代表的宫位)

  • 荣耀7x支持双卡双待吗(荣耀7x支持双卡吗)

    荣耀7x支持双卡双待吗(荣耀7x支持双卡吗)

  • 华为p30pro什么时候升级10系统(华为p30pro什么时候升级鸿蒙3.0)

    华为p30pro什么时候升级10系统(华为p30pro什么时候升级鸿蒙3.0)

  • 墨仓式打印机会堵头吗(墨仓式打印机会漏墨吗)

    墨仓式打印机会堵头吗(墨仓式打印机会漏墨吗)

  • end是哪个键(键盘end是哪个键)

    end是哪个键(键盘end是哪个键)

  • 三星手机怎么查在不在保修期内(三星手机怎么查气密)

    三星手机怎么查在不在保修期内(三星手机怎么查气密)

  • win11专业版/企业版/教育版激活密钥+激活工具+教程(win11专业版企业版家庭版哪个玩游戏好)

    win11专业版/企业版/教育版激活密钥+激活工具+教程(win11专业版企业版家庭版哪个玩游戏好)

  • 苹果电脑怎么切换输入法?MAC切换输入法快捷键介绍(苹果电脑怎么切换中英文)

    苹果电脑怎么切换输入法?MAC切换输入法快捷键介绍(苹果电脑怎么切换中英文)

  • mnsvc.exe是什么进程 有什么作用 mnsvc进程查询(mscorsvw.exe是什么进程)

    mnsvc.exe是什么进程 有什么作用 mnsvc进程查询(mscorsvw.exe是什么进程)

  • 增值税发票能不能报销
  • 税法有哪些构成要素及各要素之间有何关系
  • 以前多计提的税款怎么办
  • 固定资产接受捐赠的计入什么科目
  • 更换税控盘后原发票如何导入旧盘开票税局
  • 咨询服务费发票属于哪个大类
  • 会议服务费怎么开
  • 开票软件服务费全额抵扣怎么做账
  • 建安企业个人所得税
  • 核定征收企业股权转让的税收
  • 制造企业需要设哪些部门
  • 企业取得非货币性收入
  • 买入返售金融资产什么意思
  • 地下车位未使用 要交物业服务费
  • 准予在以后年度结转扣除的项目
  • 化肥贸易需要什么手续
  • 小规模企业差额征收税率
  • 怎么在电子税务局变更财务负责人
  • 消费型增值税计算公式
  • 退休人员取得单位证明
  • 收购药材再销售可以免税
  • 计提资产减值损失账务处理
  • 股权转让未分配利润如何账务处理
  • 坏账准备需要做账吗
  • 厂家给返点算拿回扣吗
  • 专用发票右上角的数字表示什么
  • 4s店修车送保养
  • 苹果电脑怎么升级系统到最新版本
  • windows10如何移动文件
  • 财产租赁所得个人所得税怎么申报
  • 部门预算编制方法
  • 大额医疗救助金怎么申请
  • 开具成品油发票规格型号有哪些要求
  • php数组函数实现机选双色球
  • vue引入mui
  • php面向对象编程
  • 发行股票溢价计入哪里
  • 极路由怎么用
  • 计提公积金账务处理需要什么凭证
  • 其他应收款的会计处理
  • imagestring php
  • javaweb界面设计
  • vue导航解析流程
  • 施救费用和救助费用有哪些主要区别
  • 营业外收支的账户是什么
  • 发票收件人信息
  • 进项税额认证后可以撤销吗
  • 为什么社保卡里有钱
  • 长期股权投资的明细科目有哪些
  • 当月工资未发放的怎么记账
  • zabbix安装部署
  • 三代手续费支付申请表怎么填
  • 餐饮费发票可以抵扣进项税吗
  • 增值税税率调整后,合同价应该调整吗
  • 刷信用卡的手续费一般是多少
  • 收到客户回款 应收账款减少还是增多
  • 委托加工物资贷方
  • 长期挂账的其他应付款税务风险
  • 外币应收账款汇兑损失计入财务费用吗
  • 折扣怎么写会计分录
  • 五险怎么做账
  • 专用发票账目不对怎么办
  • mySQL中in查询与exists查询的区别小结
  • 系统备份恢复系统
  • 如何给电脑重装系统win7系统
  • xp系统java环境变量配置
  • win1020th2
  • linux扩容inode
  • win8显示隐藏文件夹
  • windows mobile
  • win7系统不兼容开不了机
  • win7系统安装office2019
  • win10预览版桌面图标和任务栏不翼而飞怎么办?
  • windows预览0x80072ee2
  • 教你怎样用竹子搭棚子
  • surface游戏模式
  • unity控制组件开关
  • 贵州省地方税务局历任纪检组长马平
  • 北京病退流程
  • 安徽税务局检验员工资
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设