• uniapp H5预览PDF支持手势缩放、分页、添加水印、懒加载、PDF下载


    效果预览

    项目说明

    uniapp + vue2

    node:v14.18.3

    npm: 6.14.15

    安装pdfh5.js插件

    pdfh5 - npm (npmjs.com)pdfh5.js 基于pdf.js和jQuery

    pdfh5 - npm (npmjs.com)

    npm install pdfh5

    由于我安装最新的pdfh5.js后运行时报错

    所以我选择降低版本,可能是node版本问题

    npm install pdfh5@1.4.2

    pdfh5的使用

    1. !
    2. <template>
    3. <view>
    4. <u-button
    5. :ripple="true"
    6. size="medium"
    7. type="primary"
    8. :custom-style="{
    9. backgroundColor: '#378CED !important',
    10. borderColor: '#378CED !important',
    11. }"
    12. @click="getInvoiceUrl('123')"
    13. >发票下载
    14. >
    15. <u-popup
    16. width="100%"
    17. :mask-close-able="false"
    18. closeable
    19. mode="center"
    20. v-model="popupShow"
    21. @open="popupOpen"
    22. @close="popupClose"
    23. >
    24. <view class="top-tips fs-16 w-full">请长按图片保存到相册view>
    25. <scroll-view style="height: auto" scroll-y="true" scroll-x="true">
    26. <view ref="pdfH5Ref" id="pdfH5">view>
    27. scroll-view>
    28. u-popup>
    29. view>
    30. template>
    31. <script>
    32. import Pdfh5 from "pdfh5";
    33. import {
    34. invoiceListByOrderNoGet,
    35. invoiceSingleApplication,
    36. invoiceUrlGet,
    37. } from '@/api/invoice'
    38. export default {
    39. name: 'InvoiceList',
    40. components: {},
    41. props: {},
    42. data() {
    43. return {
    44. popupShow: false,
    45. pdfh5: null,
    46. pdfCodeArray: '',
    47. }
    48. },
    49. watch: {},
    50. created() {},
    51. mounted() {},
    52. methods: {
    53. popupOpen() {
    54. //实例化
    55. // 这里使用pdfurl或data,取决后端返回的文件格式,我这里用的是pdf文件流,具体可看文档
    56. this.pdfh5 = new Pdfh5('#pdfH5', {
    57. // pdfurl: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf',
    58. data: this.pdfCodeArray,
    59. cMapUrl: 'https://unpkg.com/pdfjs-dist@3.8.162/cmaps/', //如果是预览发票这里必须加上,否则会丢失字体
    60. scale: 5, //比例越大,pdf越清晰
    61. // responseType: "arraybuffer" // blob arraybuffer
    62. })
    63. //监听完成事件
    64. this.pdfh5.on('complete', (status, msg, time) => {
    65. this.$nextTick(() => {
    66. //禁止手势缩放
    67. // this.pdfh5.zoomEnable(false)
    68. // 下载pdf
    69. // this.pdfh5.download()
    70. // 获取 pdfH5Ref 组件的引用 为解决scale值大时,canvas展示过大问题
    71. const pdfH5Ref = this.$refs.pdfH5Ref
    72. // 查找具有 viewerContainer 类名的元素
    73. const viewerContainer = pdfH5Ref.$el.querySelector('.viewerContainer')
    74. if (viewerContainer) {
    75. // 查找具有 pinch-zoom-container 类名的元素
    76. const pinchZoomContainer = viewerContainer.querySelector(
    77. '.pinch-zoom-container'
    78. )
    79. if (pinchZoomContainer) {
    80. pinchZoomContainer.style.height = 'auto' // 替换为所需的高度
    81. // 查找具有 pageContainer 类名的元素
    82. const pageContainers =
    83. pinchZoomContainer.querySelectorAll('.pageContainer')
    84. // 设置 pinch-zoom-container 元素的高度
    85. if (pageContainers) {
    86. // 循环处理每个 pageContainer
    87. pageContainers.forEach((pageContainer) => {
    88. pageContainer.style.width = '100%'
    89. pageContainer.style.height = '100%'
    90. pageContainer.style.minWidth = '100%'
    91. pageContainer.style.maxWidth = '100%'
    92. pageContainer.style.minHeight = '100%'
    93. pageContainer.style.maxHeight = '100%'
    94. // 查找当前 pageContainer 下的所有 img 元素
    95. const imgElements = pageContainer.querySelectorAll('img')
    96. if (imgElements) {
    97. // 设置每个 img 元素的宽度
    98. imgElements.forEach((imgElement) => {
    99. imgElement.style.width = '100%' // 替换为所需的宽度
    100. imgElement.style.height = '100%' // 替换为所需的宽度
    101. })
    102. }
    103. })
    104. }
    105. }
    106. }
    107. })
    108. })
    109. },
    110. popupClose() {
    111. this.pdfh5.destroy()
    112. this.pdfh5 = null
    113. },
    114. //获取发票下载地址
    115. getInvoiceUrl(invoiceID) {
    116. invoiceUrlGet({ invoiceID }).then((res) => {
    117. if (res.code === 200) {
    118. this.popupShow = true
    119. this.pdfCodeArray = res.data.einvoiceUrl
    120. }
    121. })
    122. },
    123. },
    124. }
    125. script>
    126. <style lang="scss" scoped>
    127. @import "pdfh5/css/pdfh5.css";
    128. style>

    如需开启其它功能或调用相关api请移步GitHub地址自行探索

    pdfh5项目gitee地址

    pdfh5项目GitHub地址

  • 相关阅读:
    java - 七大比较排序 - 详解
    Httpservletrequest与Httpservletresponse
    YoloV5改进策略:独家原创,全网首发,复现Drone-Yolo,以及改进方法
    BellmanFord算法
    Centos7常用基本命令使用(进程管理类、网络状态类、系统定时类)
    数组模拟环形队列(思路分析) [数据结构与算法][Java]
    微信小程序带来了新的创业机会?
    Java多线程(1):线程生命周期
    【MySQL基础】常用指令详解
    Power Apps 学习笔记 -- Plugin
  • 原文地址:https://blog.csdn.net/weixin_43743175/article/details/134292039