位置: 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 转载请保留说明!

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

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

  • 云上贵州是什么东西(云上贵州是什么意思)

    云上贵州是什么东西(云上贵州是什么意思)

  • 淘宝好友能看到我的足迹吗(淘宝好友能看到闲鱼发布的东西吗)

    淘宝好友能看到我的足迹吗(淘宝好友能看到闲鱼发布的东西吗)

  • 电脑着火了正确的做法是

    电脑着火了正确的做法是

  • 抖音别人转发了我的视频能不能看到(抖音别人转发了自己作品自己怎么查看)

    抖音别人转发了我的视频能不能看到(抖音别人转发了自己作品自己怎么查看)

  • 打开volte是什么意思(打开volte开关)

    打开volte是什么意思(打开volte开关)

  • 华为nova7可以分屏吗(华为nova7可以分屏操作吗)

    华为nova7可以分屏吗(华为nova7可以分屏操作吗)

  • iphone se是什么意思(iphone se什么意思)

    iphone se是什么意思(iphone se什么意思)

  • 屏蔽了qq好友会怎样(屏蔽qq好友会话对方知道吗)

    屏蔽了qq好友会怎样(屏蔽qq好友会话对方知道吗)

  • 淘宝收货人可以不写真名吗(淘宝收货人可以不用真名吗)

    淘宝收货人可以不写真名吗(淘宝收货人可以不用真名吗)

  • jabra耳机怎么连接不上手机(jabra耳机怎么连接蓝牙 音量键)

    jabra耳机怎么连接不上手机(jabra耳机怎么连接蓝牙 音量键)

  • ipad插卡版能连wifi吗(ipad插卡版可以连接无线网吗)

    ipad插卡版能连wifi吗(ipad插卡版可以连接无线网吗)

  • ps的图层蒙版怎么用(ps的图层蒙版怎么做)

    ps的图层蒙版怎么用(ps的图层蒙版怎么做)

  • 中国移动怎么开通5g(中国移动怎么开发票)

    中国移动怎么开通5g(中国移动怎么开发票)

  • oppor7有没有nfc功能(oppoa72有没有nfc)

    oppor7有没有nfc功能(oppoa72有没有nfc)

  • 怎么4k对齐(新买的硬盘怎么4k对齐)

    怎么4k对齐(新买的硬盘怎么4k对齐)

  • 如何将电脑上的文件发给QQ里的人(如何将电脑上的微信记录转移至手机)

    如何将电脑上的文件发给QQ里的人(如何将电脑上的微信记录转移至手机)

  • 小爱同学声纹识别设置

    小爱同学声纹识别设置

  • 迅雷影音如何加速播放(迅雷影音如何加载字幕文件)

    迅雷影音如何加速播放(迅雷影音如何加载字幕文件)

  • 苹果x指纹在哪(苹果x指纹在哪儿)

    苹果x指纹在哪(苹果x指纹在哪儿)

  • xr如何切换手机卡打电话(苹果xr怎么切换另一个号使用数据)

    xr如何切换手机卡打电话(苹果xr怎么切换另一个号使用数据)

  • ios未受信任怎么解决(未受信任苹果怎么弄)

    ios未受信任怎么解决(未受信任苹果怎么弄)

  • win7卡在欢迎界面(win7卡在欢迎界面很久)

    win7卡在欢迎界面(win7卡在欢迎界面很久)

  • 12磅宋体在哪设置(word12磅宋体要怎么设置)

    12磅宋体在哪设置(word12磅宋体要怎么设置)

  • 三星乐盖a80防水吗(三星盖乐世a80)

    三星乐盖a80防水吗(三星盖乐世a80)

  • MacOS如何设置邮件账号?(mac设置邮件)

    MacOS如何设置邮件账号?(mac设置邮件)

  • 苹果Mac隐藏壁纸在哪里?Mac隐藏壁纸查找教程(macbook隐藏)

    苹果Mac隐藏壁纸在哪里?Mac隐藏壁纸查找教程(macbook隐藏)

  • Python中包如何嵌套(python 嵌入)

    Python中包如何嵌套(python 嵌入)

  • 防伪税控系统
  • 何谓关税
  • 银行承兑汇票和支票的区别
  • 公司买手表账务处理
  • 个人所得税年度汇算时间
  • 怎么找回丢失的手机号
  • 测绘费发票需要备注么
  • 信用评估费用收费标准
  • 500元以内的无票报销是累计还是一次
  • 利润率多少才是正常的
  • 结转应收票据是什么意思
  • 技术转让所得的税收优惠
  • 营改增后商场进场费如何缴税?
  • 事业单位之间调动需要多久
  • 股东退股分红怎么拿回
  • 员工工资的扣点
  • 租房提取的话可以全部提取吗
  • 从成因解析如何把控出口退税的执法风险
  • 企业优惠条件
  • 如何确定合并报表的范围简答题
  • 公司的差旅费
  • 土地使用权出让金
  • 工会经费的会计分录2023
  • 营改增的销售额规定
  • 企业未代扣代缴个税
  • t3不能增加二级科目
  • 补缴社保差额有滞纳金吗
  • 收购免税农产品的进项税可以抵扣吗
  • windows10最新激活密钥2020
  • 公司股权转让会议决议
  • 生产车间折旧为0的原因
  • 考试资格的工作有哪些
  • 酒水专用发票税率
  • wan口ip地址和lan口ip地址不能
  • linux 的ll
  • windows 11任务栏没有网络图标
  • mac系统回到桌面快捷键
  • 本期进项税额转出会计分录
  • “Property or method “***“ is not defined on the instance but referenced during render.”报错的原因及解决方案
  • 红字发票怎么填申报表表二
  • 计提城建税是在当月提吗
  • 收据不可以入账吗
  • bootstrap easyui结合
  • 图片防止侵权怎么写
  • 解决谷歌浏览器自动添加书签问题
  • 小规模纳税人季度不超30万免增值税
  • 收到退税款怎么做账
  • 原材料用于在建工程增值税如何处理
  • js异步方式有哪些
  • 帝国cms如何使用
  • 一般纳税人是怎么征收
  • 吃饭的票如何写报销单
  • 投资者减除费用30000
  • mysql字符串索引如何排序
  • 长期股权投资的账务处理
  • 收到设计费属于什么业务类型
  • 货代是否负责损失
  • 公交公司财政补贴
  • 可供分配的利润是什么意思
  • 民非企业附加税计提和缴纳分录
  • 免税收入包括哪些项目
  • 产品成本核算有哪些方法
  • centos rpc
  • win2003 安装iis
  • 磁盘清理后文件还在吗?
  • macbookpro客人用户
  • windows8如何添加打印机
  • vsftpd教程
  • win7系统无法更改主题
  • linux 系统升级
  • python笛卡尔积
  • 批处理文本文件如何建立
  • nodejs init
  • nodejs邮件
  • Android---59---Toast的使用
  • 按钮点击后消失
  • 浙江国税咨询电话12306
  • 贵州网上办税服务厅登录
  • 烟草税多少比例
  • 初级会计职称可以挂靠吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设