移动端h5显示pdf的3种方法总结

Posted 程序员超超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端h5显示pdf的3种方法总结相关的知识,希望对你有一定的参考价值。

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

  1. 后端返回一个pdf的链接,然后前端直接使用location.href = ‘http://www.XXX.com/test.pdf’,这种形式苹果手机应该是没问题的,但是安卓手机默认会触发下载,所以不推荐。
  2. 使用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无法正常显示

  1. 使用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.workerSrcpdfjs-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的设置如下:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_网页制作

面板2的设置如下:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_网页制作_02

当浏览器宽度大于1024时预览如下图:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_web前端_03

这时改浏览器宽度小于1024,预览如下图:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_移动网页_04

二、利用“按显示设备设置位置、大小、字体大小”中的“手机”和“平板电脑”的“隐藏”属性

如果没有特别设置,所创建的元素都会显示。

面板1的“按显示设备设置位置、大小、字体大小”->“手机”和“平板电脑”的“启用”和“隐藏”属性都要设置为“true”,如下:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_移动网页_05

面板2的“更多属性”->“隐藏”设置为“true”,表示电脑网页下不显示,如下图:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_移动网页_06

面板2的“按显示设备设置位置、大小、字体大小”->“手机”和“平板电脑”的“启用”设置为“true”,表示移动网页下显示,如下图:

HTML元素在移动端和电脑端显示或不显示的两种设置方法_移动网页_07

设置好后,按上面第一种方法预览,效果是一样的。

以上是关于移动端h5显示pdf的3种方法总结的主要内容,如果未能解决你的问题,请参考以下文章

H5移动端IOS/Android兼容性总结,持续更新中…

移动端H5开发常用技巧总结

移动端h5页面常见问题总结

移动端适配--flexible.js

移动端H5输入框踩坑总结

移动端H5的一些基本知识点总结