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

news2024/11/24 14:09:21

效果预览

项目说明

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的使用

!
<template>
	<view>
		<u-button
			:ripple="true"
			size="medium"
			type="primary"
			:custom-style="{
				backgroundColor: '#378CED !important',
				borderColor: '#378CED !important',
			}"
			@click="getInvoiceUrl('123')"
			>发票下载</u-button
		>

		<!-- 发票预览弹窗 -->
		<u-popup
			width="100%"
			:mask-close-able="false"
			closeable
			mode="center"
			v-model="popupShow"
			@open="popupOpen"
			@close="popupClose"
		>
			<view class="top-tips fs-16 w-full">请长按图片保存到相册</view>
			<scroll-view style="height: auto" scroll-y="true" scroll-x="true">
				<view ref="pdfH5Ref" id="pdfH5"></view>
			</scroll-view>
		</u-popup>
	</view>
</template>

<script>
import Pdfh5 from "pdfh5";
import {
	invoiceListByOrderNoGet,
	invoiceSingleApplication,
	invoiceUrlGet,
} from '@/api/invoice'
export default {
	name: 'InvoiceList',
	components: {},
	props: {},
	data() {
		return {
			popupShow: false,
			pdfh5: null,
			pdfCodeArray: '',
		}
	},
	watch: {},
	created() {},
	mounted() {},
	methods: {
		popupOpen() {
			//实例化
            // 这里使用pdfurl或data,取决后端返回的文件格式,我这里用的是pdf文件流,具体可看文档
			this.pdfh5 = new Pdfh5('#pdfH5', {
				// pdfurl: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf',
				data: this.pdfCodeArray,
				cMapUrl: 'https://unpkg.com/pdfjs-dist@3.8.162/cmaps/', //如果是预览发票这里必须加上,否则会丢失字体
				scale: 5, //比例越大,pdf越清晰
				// responseType: "arraybuffer" // blob arraybuffer
			})
			//监听完成事件
			this.pdfh5.on('complete', (status, msg, time) => {
				this.$nextTick(() => {
					//禁止手势缩放
					// this.pdfh5.zoomEnable(false)
                    // 下载pdf
					// this.pdfh5.download()
					// 获取 pdfH5Ref 组件的引用 为解决scale值大时,canvas展示过大问题
					const pdfH5Ref = this.$refs.pdfH5Ref

					// 查找具有 viewerContainer 类名的元素
					const viewerContainer = pdfH5Ref.$el.querySelector('.viewerContainer')

					if (viewerContainer) {
						// 查找具有 pinch-zoom-container 类名的元素
						const pinchZoomContainer = viewerContainer.querySelector(
							'.pinch-zoom-container'
						)

						if (pinchZoomContainer) {
							pinchZoomContainer.style.height = 'auto' // 替换为所需的高度

							// 查找具有 pageContainer 类名的元素
							const pageContainers =
								pinchZoomContainer.querySelectorAll('.pageContainer')
							// 设置 pinch-zoom-container 元素的高度
							if (pageContainers) {
								// 循环处理每个 pageContainer
								pageContainers.forEach((pageContainer) => {
									pageContainer.style.width = '100%'
									pageContainer.style.height = '100%'
									pageContainer.style.minWidth = '100%'
									pageContainer.style.maxWidth = '100%'
									pageContainer.style.minHeight = '100%'
									pageContainer.style.maxHeight = '100%'
									// 查找当前 pageContainer 下的所有 img 元素
									const imgElements = pageContainer.querySelectorAll('img')

									if (imgElements) {
										// 设置每个 img 元素的宽度
										imgElements.forEach((imgElement) => {
											imgElement.style.width = '100%' // 替换为所需的宽度
											imgElement.style.height = '100%' // 替换为所需的宽度
										})
									}
								})
							}
						}
					}
				})
			})
		},
		popupClose() {
			this.pdfh5.destroy()
			this.pdfh5 = null
		},

		//获取发票下载地址
		getInvoiceUrl(invoiceID) {
			invoiceUrlGet({ invoiceID }).then((res) => {
				if (res.code === 200) {
                    this.popupShow = true
					this.pdfCodeArray = res.data.einvoiceUrl
				}
			})
		},
	},
}
</script>

<style lang="scss" scoped>
@import "pdfh5/css/pdfh5.css";
</style>

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

pdfh5项目gitee地址

pdfh5项目GitHub地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

太细了:美团一面连环夺命20问,搞定就60W起

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个小伙伴成功拿到通过了美团一面面试&#xff0c;现在把面试真题和参考答案收入咱们的宝典。 通过美团一面…

获取代码中所有的中文并排除注释代码

在给项目添加国际化适配时&#xff0c;需要吧代码中的中文一个一个替换成 $t(xxx.xxx) 这种代码&#xff0c;但是一个一个找中文比较麻烦&#xff0c;而且容易遗漏&#xff0c;于是就有了下面的代码&#xff0c;可以快速的帮我们找出对应文件中的所有中文&#xff0c;并且把中文…

链表OJ——环形链表初阶与进阶

呀哈喽&#xff0c;我是结衣。 环形链表1 描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…

TensorFlow学习笔记--(1)张量的随机生成

张量的生成 如何判断一个张量的维数&#xff1a;看张量的中括号有几层 0 1 2 &#xff1a;零维数列 [2 4 6] : 一维向量 [ [1 2 3] [4 5 6] ] : 二维数组 两行三列 第一行数据为 1 2 3 第二行数据为 4 5 6 以此类推 n维张量有n层中括号 tf.zeros(%指定一个张量的维数%) 生成一…

通用型 SPI-Flash 相关知识汇总(w25q16\q64,gd25q128\q256)

目录 管脚定义&#xff1a; 常用指令&#xff1a; GD25q16: gd25Q28 ​编辑 gw25q16 ​编辑 芯片丝印说明&#xff1a; GD系列&#xff1a; winbond系列&#xff1a; Read Identification&#xff08;9FH&#xff09;&#xff1a; 常见ID&#xff1a; GD: ​编辑…

class类默认导出,header字段在请求中的位置

这是封装好的&#xff0c;没封装的如下 如果没有用uni.post那么就是如下的结构 let header {Content-Type: application/x-www-form-urlencoded,tenant: MDAwMA, } request({url:/sal/formula/validFormula,method:post,data:{},header })

react-native技术难点与亮点

记录在数字化矿山 react-native App项目上所使用的知识点 文章目录 1&#xff0c;宽度自适应表格实现2&#xff0c;新建作业手势动画3&#xff0c;tabBar中间midTabBar动态展示4&#xff0c;堆料图实现5&#xff0c;语音识别实现6&#xff0c;待办事项上下滑动切换页面7&#x…

2022最新版-李宏毅机器学习深度学习课程-P46 自监督学习Self-supervised Learning(BERT)

一、概述&#xff1a;自监督学习模型与芝麻街 参数量 ELMO&#xff1a;94MBERT&#xff1a;340MGPT-2&#xff1a;1542MMegatron&#xff1a;8BT5&#xff1a;11BTuring NLG&#xff1a;17BGPT-3&#xff1a;175BSwitch Transformer&#xff1a;1.6T 二、Self-supervised Lear…

leaflet 地图遮罩、扣洞

leaflet地图遮罩效果图 主要代码&#xff1a; geojson也在下面 地图加载完成之后直接调用 drawBoundaryMask 方法 //边界高亮及遮罩效果drawBoundaryMask() {L.geoJSON(this.geojson, {style: function(feature) {return {fillColor: #000,stroke: #CD853F,fillOpacity: 0.4,c…

如何导出PPT画的图为高清图片?插入到world后不压缩图像的设置方法?

期刊投稿的时候&#xff0c;需要图片保持一定的清晰度数&#xff0c;那么我们怎么才能从PPT中导出符合要求的图片呢&#xff1f; 对于矢量图绘图软件所画的图&#xff0c;直接导出即可。 而PPT导出的图片清晰度在60pi&#xff0c;就很模糊。 整体思路&#xff1a; PPT绘图——…

国内做的好的工业RFID品牌有哪些?

随着数字化转型与智能制造的深入推荐&#xff0c;工业自动化程度的不断提高&#xff0c;RFID技术作为重要的自动识别与数据采集技术&#xff0c;越来越多地应用在工业领域。国内涉及RFID领域的企业也越来越多&#xff0c;那么&#xff0c;国内做的好的工业RFID品牌有那些呢&…

基于SpringBoot+Vue的招生管理系统

基于springbootvue的招生管理系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 专业信息 登录界面 管理员界面 录取通知管理 专业报名管理 摘要 基于Spring Boot和V…

安防监控系统视频融合平台EasyCVR页面地图功能细节详解

安防监控视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff…

原始手工配置ipsec vpn案例

两边防火墙的基本配置&#xff1a; 接口加入到对应的zone 默认路由 ip route-static 0.0.0.0 0 1.1.1.2 保证公网能ping通 抓包

vue3介绍

介绍 3完全兼容2的语法 vue3&#xff1a;体积更小&#xff0c;性能会更高。底层做了很多优化 2倍左右 vue3vitets 渐进式框架 vue3和vue2 的区别 新语法&#xff0c;性能上提升很多 思想是一致的&#xff1a;动态绑定&#xff1a;状态data&计算属性&#xff0c;监听某些状态…

Kevin is Counting Stars(规律)---牛客练习赛117

解析&#xff1a; 当任意一个数都1&#xff0c;这个数都会变成最大值时为sum-max-min 否则都为 sum-max-min1 只需要排序后&#xff0c;从第二个到最后都相等时不成立 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int n,a[N]; …

C语言 指针进阶

目录 数组指针 指针数组访问数组元素 再次讨论数组名 数组指针访问一维数组&#xff08;但是这样会很别扭&#xff09; 访问二维数组元素 非数组指针访问 数组指针访问 数组传参Demo 一维数组传参 二维数组传参 指针数组指针 字符指针 函数指针 函数指针调用时可以…

C语言迭代法求一个数的平方根。迭代公式:Xn+1=(Xn+a/Xn)/2,其中a是输入的数字

完整代码&#xff1a; // 迭代法求一个数的平方根。迭代公式&#xff1a;Xn1(Xna/Xn)/2&#xff0c;其中 a 是输入的数字。 #include<stdio.h> #include<math.h> int main() {double x1, x2;double a;//a是要求的数printf("请输入一个数&#xff1a;")…

优化AI机器人外呼体验二

优化体验一的时候分享了影响语音机器人效果的五大因素&#xff1a;交互流程设计、语音质量、交互速度、用户反馈机制和数据隐私保护。本篇我就其中的话术制作来做一些分享&#xff0c;其实也就是把上次的交互流程设计分享的更详细。 先说一下话术制作流程。一般是由语音机器人厂…