当前位置:   article > 正文

前端实现pdf预览_iframe预览pdf

iframe预览pdf

前言:项目中之前pdf预览是客户端andrio实现的,现在需要前端H5自己实现预览功能,项目是基于vue的H5项目,记录一下pdf预览功能实现的过程和问题

一、利用iframe实现pdf预览

1、实现过程

将pdf路径设置给iframe的src属性

    <iframe :src="pdfUrl" marginWidth="0" marginHeight="0" scrolling="no" frameBorder="0" style="width: calc(100% + 17px); height: calc(100% + 17px)"></iframe>
  1. create(){
  2. //路由路径上获取pdf路径参数
  3. var extension = this.$route.query.pdfSrc.split('.').pop().toLowerCase()
  4. console.log(extension, 'extensionextension')
  5. if (extension == 'pdf') {
  6. this.pdfSrc = `${this.$route.query.pdfSrc}#toolbar=0`
  7. } else {
  8. this.pdfSrc = 'https://view.officeapps.live.com/op/embed.aspx?src=' + this.$route.query.pdfSrc
  9. }
  10. }

2、遇到的问题

电脑上测试正常,但是安卓端会出现空白页和直接跳转下载的现象,解决思路:客户端同事推荐用pdf.js,然后在网上查找发现,vue有一个插件vue-pdf,是基于pdf.js封住的,因此决定采用插件vue-pdf实现

二、vue-pdf插件实现预览

1、实现过程

下包

npm i vue-pdf

引入并使用

  1. <template>
  2. <div class="pdf-container">
  3. <pdf v-for="item in numPages" :key="item" :src="pdfSrc" :page="item" ref="pdf"></pdf>
  4. </div>
  5. </template>
  6. <script>
  7. import pdf from 'vue-pdf'
  8. export default {
  9. data () {
  10. return {
  11. pdfSrc: '',
  12. numPages: null
  13. }
  14. },
  15. components: {
  16. pdf
  17. },
  18. computed: {},
  19. created () {
  20. var extension = this.$route.query.pdfSrc.split('.').pop().toLowerCase()
  21. if (extension == 'pdf') {
  22. this.pdfSrc = `${this.$route.query.pdfSrc}#toolbar=0`
  23. } else {
  24. this.pdfSrc = 'https://view.officeapps.live.com/op/embed.aspx?src=' + this.$route.query.pdfSrc
  25. }
  26. }
  27. },
  28. mounted () {
  29. this.getNumPages()
  30. },
  31. methods: {
  32. getNumPages () {
  33. const loadingTask = pdf.createLoadingTask(this.pdfSrc)
  34. loadingTask.promise.then(pdf => {
  35. this.numPages = pdf.numPages
  36. console.log(' this.numPages', this.numPages)
  37. }).catch(err => {
  38. debugger
  39. console.error('pdf 加载失败', err)
  40. })
  41. }
  42. }
  43. }
  44. </script>

 部署到测试线app中测试还是存在空白页问题,于是换成插件pdfH5

三、pdfH5实现预览

下包

npm i pdfh5

代码实现

  1. <template>
  2. <div class="pdf-container">
  3. <div id="pdf-content"></div>
  4. <iframe v-if="docType!='pdf'" :src="pdfUrl" marginWidth="0" marginHeight="0" scrolling="no" frameBorder="0" style="width: calc(100% + 17px); height: calc(100% + 17px)"></iframe>
  5. </div>
  6. </template>
  7. <script>
  8. import Pdfh5 from 'pdfh5'
  9. import 'pdfh5/css/pdfh5.css'
  10. export default {
  11. name: 'Pdfh5',
  12. data () {
  13. return {
  14. docType: '',
  15. pdfh5: null,
  16. // 可引入网络文件或者本地文件
  17. pdfUrl: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf' // 如果引入本地pdf文件,需要将pdf放在public文件夹下,引用时使用绝对路径(/:表示public文件夹)
  18. }
  19. },
  20. mounted () {
  21. this.docType = this.$route.query.pdfSrc.split('.').pop().toLowerCase()
  22. if (this.docType == 'pdf') {
  23. this.initPdf()
  24. } else {
  25. this.pdfUrl = 'https://view.officeapps.live.com/op/embed.aspx?src=' + this.$route.query.pdfSrc
  26. }
  27. },
  28. methods: {
  29. initPdf () {
  30. // pdfh5实例化时传两个参数:selector选择器,options配置项参数,会返回一个pdfh5实例对象,可以用来操作pdf,监听相关事件
  31. // pdfh5 = new Pdfh5(selector, options) goto初始到第几页,logo设置每一页pdf上的水印
  32. this.pdfh5 = new Pdfh5('#pdf-content', {
  33. pdfurl: this.$route.query.pdfSrc,
  34. goto: 1
  35. // 设置每一页pdf上的水印
  36. // logo: { src: require('@/assets/images/bus/icon_head@2x.png'), x: 420, y: 700, width: 120, height: 120 }
  37. })
  38. this.pdfh5.scrollEnable(true) // 允许pdf滚动
  39. // 监听pdf准备开始渲染,此时可以拿到pdf总页数
  40. this.pdfh5.on('ready', function () {
  41. console.log('总页数:' + this.totalNum)
  42. })
  43. // 监听pdf加载完成事件,加载失败、渲染成功都会触发
  44. this.pdfh5.on('complete', (status, msg, time) => {
  45. console.log('状态:' + status + ',信息:' + msg + ',耗时:' + time + '毫秒')
  46. })
  47. }
  48. }
  49. }
  50. </script>
  51. <style scoped>
  52. .pdfjs {
  53. height: 100vh !important;
  54. }
  55. .pdf-container {
  56. width: 100%;
  57. height: 100%;
  58. }
  59. </style>

最终测试,该方案可以。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/100326
推荐阅读
相关标签
  

闽ICP备14008679号