移动端h5显示pdf的3种方法总结
Posted 程序员超超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端h5显示pdf的3种方法总结相关的知识,希望对你有一定的参考价值。
移动端显示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>
这里有两个需要注意的:
第一个是import getPDFBlob from “@/api”
里面的getPDFBlob
是一个方法,他会拉取一个pdf的blob流。
第二个是let viewport = page.getViewport(3);
可以调整canvas的清晰度,如果感觉canvas显示的pdf模糊,可以尝试增大 page.getViewpor
入参的数值。
但是这里还是要说一句,pdf虽然正常显示了,但是交互不是太好,因为不支持双手捏合方法缩小,不支持双击放大缩小(当然你也可以直接开启css的touch-action属性)。如果支持,还需要监听双击和双指操作事件
HTML元素在移动端和电脑端显示或不显示的两种设置方法
我们在设计响应式网页时,有时会遇到电脑网页与移动网页显示差异很大的部分,一种简单的方法就是这部分分别设计,在不同设备下分别显示,即电脑端浏览器显示电脑网页部分,移动下显示移动网页部分,像解决导航条。本文介绍两种在金蜘蛛网页设计器中设计方法设置HTML元素在移动端和电脑端出现,非常简单。
1.“电脑网页”是指浏览器宽度大于等于1024时的显示状态,“移动网页”是指浏览器宽度小于1024时的显示状态。2.下面的设置例子我们将以面板(div)为例说明如何设置。
一、利用“位置、大小”的“移动网页不出现”和“电脑网页不出现”属性
“移动网页不出现”是说该元素在移动网页下不可见,电脑网页下可以见;“电脑网页不出现”是说该元素在电脑网页下不可见,在移动网页下可见。
面板1的设置如下:
面板2的设置如下:
当浏览器宽度大于1024时预览如下图:
这时改浏览器宽度小于1024,预览如下图:
二、利用“按显示设备设置位置、大小、字体大小”中的“手机”和“平板电脑”的“隐藏”属性
如果没有特别设置,所创建的元素都会显示。
面板1的“按显示设备设置位置、大小、字体大小”->“手机”和“平板电脑”的“启用”和“隐藏”属性都要设置为“true”,如下:
面板2的“更多属性”->“隐藏”设置为“true”,表示电脑网页下不显示,如下图:
面板2的“按显示设备设置位置、大小、字体大小”->“手机”和“平板电脑”的“启用”设置为“true”,表示移动网页下显示,如下图:
设置好后,按上面第一种方法预览,效果是一样的。
以上是关于移动端h5显示pdf的3种方法总结的主要内容,如果未能解决你的问题,请参考以下文章