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

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

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

  • 小米10至尊纪念版支持防水吗(小米10至尊纪念版)

    小米10至尊纪念版支持防水吗(小米10至尊纪念版)

  • 微信一听语音就会黑屏(微信一听语音就死机苹果)

    微信一听语音就会黑屏(微信一听语音就死机苹果)

  • 小米手机怎么打开隐藏的应用(小米手机怎么打开开发者选项)

    小米手机怎么打开隐藏的应用(小米手机怎么打开开发者选项)

  • 华为解除管控后打不开(华为解除管控后打不开软件)

    华为解除管控后打不开(华为解除管控后打不开软件)

  • 华为nova7手机耳机怎么用(华为nova7手机耳机插上去没反应)

    华为nova7手机耳机怎么用(华为nova7手机耳机插上去没反应)

  • 谷歌手机在国内能用吗(谷歌手机在国内怎么下载软件)

    谷歌手机在国内能用吗(谷歌手机在国内怎么下载软件)

  • 显示器插显卡哪个接口?(显示器插显卡哪种线好)

    显示器插显卡哪个接口?(显示器插显卡哪种线好)

  • 苹果内外屏必须一起换吗(iphone外屏有必要换原装的吗)

    苹果内外屏必须一起换吗(iphone外屏有必要换原装的吗)

  • 抖音儿童模式怎么调

    抖音儿童模式怎么调

  • 为什么大王卡看腾讯视频要流量(为什么大王卡看快手不免费)

    为什么大王卡看腾讯视频要流量(为什么大王卡看快手不免费)

  • excel怎么下载到电脑上

    excel怎么下载到电脑上

  • 自动获得ip地址什么意思(自动获取ip地址冲突怎么解决)

    自动获得ip地址什么意思(自动获取ip地址冲突怎么解决)

  • 注销的号码还能恢复吗(注销的号码还能打通吗)

    注销的号码还能恢复吗(注销的号码还能打通吗)

  • oppo有小爱同学吗(oppo用小爱同学app)

    oppo有小爱同学吗(oppo用小爱同学app)

  • 如何查看网站seo(如何查看网站域名)

    如何查看网站seo(如何查看网站域名)

  • vivox27怎么调来电震动(vivox27来电显示在哪里设置)

    vivox27怎么调来电震动(vivox27来电显示在哪里设置)

  • 空间小秘密怎么打开(空间小秘密怎么打开2021)

    空间小秘密怎么打开(空间小秘密怎么打开2021)

  • u盘进洗衣液了还能用吗(u盘不小心在洗衣机里洗了)

    u盘进洗衣液了还能用吗(u盘不小心在洗衣机里洗了)

  • mate20pro适合贴什么膜(华为mate20pro贴什么手机膜比较好)

    mate20pro适合贴什么膜(华为mate20pro贴什么手机膜比较好)

  • 苹果黑明单在哪里解除(苹果的黑名单在哪里)

    苹果黑明单在哪里解除(苹果的黑名单在哪里)

  • 苹果手机发热怎么办呢(苹果手机发热怎么样)

    苹果手机发热怎么办呢(苹果手机发热怎么样)

  • 怎么样把手机内存转移到内存卡上(怎么样把手机内部储存移到sD卡)

    怎么样把手机内存转移到内存卡上(怎么样把手机内部储存移到sD卡)

  • 小米9最厚处厚度是多少(小米九厚度)

    小米9最厚处厚度是多少(小米九厚度)

  • 抖音怎么分段加文字(抖音怎么分段加独白)

    抖音怎么分段加文字(抖音怎么分段加独白)

  • 实用工具推荐,浏览器必备宝藏插件:Wetab新标签页(实用工具书推荐)

    实用工具推荐,浏览器必备宝藏插件:Wetab新标签页(实用工具书推荐)

  • 好细的Vue安装与配置(vue安装使用)

    好细的Vue安装与配置(vue安装使用)

  • 广告费的税前扣除是多少
  • 合伙企业的税收优势
  • 税控盘及维护费的会计分录
  • 出口退税增值税账务处理
  • 公司与公司之间借款需要交税吗
  • 工厂开不了发票
  • 股权转让后没有给转让费怎么办
  • 别人送我免费赠品
  • 进项税额抵扣的情况有哪些
  • 工会筹备金需要在年终汇算调增吗
  • 外籍人员个人所得税政策
  • 出差餐费报销怎么报销
  • 经营范围外的业务可以开发票吗
  • 固定资产清理需要结转吗
  • 税务专用发票
  • 货代发票税率是多少
  • 资产负债表要填年初余额吗
  • 建筑服务预交税款怎么计算的
  • 其他公司垫付货款合法吗
  • 办妥托收手续会计分录
  • 预付会议费会计分录
  • 缴纳当月增值税30000元
  • 新浪怎么样了
  • 主板BIOS无法更改显存
  • 电脑CPU性能天梯
  • 分公司吸收新股怎么办
  • 应交税费进项税额在借方说明什么
  • php strtok
  • 融资a轮之前
  • 迷迭香怎么养殖方法
  • 支付的招标代理费计入成本还是费用
  • 出口企业要缴纳印花税吗
  • php流程图
  • 流动比率越高越好嘛
  • 电子承兑汇票到期提示付款后多久到账
  • 固定资产暂停使用期间需要计提折旧吗
  • 增值税发票认证在哪里
  • python中datetime.datetime
  • 兼职属于劳务关系吗
  • 高铁票该怎么申领
  • 企业所得税是指哪些
  • 税前一次性扣除和100%加计扣除
  • 增值税期末留抵退税附加税退还吗
  • 一般纳税人条件要求2020
  • 研发项目会计分录
  • 政府补助会计处理方法由总额法变为净额法
  • 应付账款属于外币货币性项目吗
  • 公司按最低标准交社保可以申请补偿吗
  • 固定资产机械设备有哪些
  • 支付借款利息需要交税吗
  • 项目建设期间所涉及的税
  • 政府补贴是否交增值税
  • 什么是固定资产的后续支出
  • 技术服务发票怎么做成本
  • 购买金税盘取得的发票
  • 公司工会经费怎么花不违规
  • 固定资产计提折旧的方法
  • 低值易耗品五五摊销法报废
  • 建立明细账的注意事项
  • mysql5.7.22安装教程图解
  • ubuntu mysql 5.6版本的删除/安装/编码配置文件配置
  • u盘安装win8.1系统教程
  • windowsxp怎么删除所有文件
  • win8系统怎么重新安装系统
  • win10打不出字解决办法
  • win8删除所有内容并重新安装windows
  • centos bz
  • win7怎么自启动程序
  • 系统界面通知
  • Linux服务器架设指南百度网盘
  • node.js连接mysql的数据怎么可视化
  • Intermediate Unity 3D for iOS: Part 2/3
  • python3利用smtplib通过qq邮箱发送邮件方法示例
  • jquery onready
  • python设计gui
  • js知识总结
  • js运行效率
  • 中国有多少人2022
  • 深圳国家税务总局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设