uniapp使用html2canvas截图,显示合同

        目前有个uniapp封装app里展示合同的需求,数据都在页面拼接展示,合同是写到页面里的,数据是活的。

用到了html2canvas,renderjshtml2canvas-renderjs - DCloud 插件市场

后面可能还有一系列优化需求,持续更新

附上官网renderjs | uni-app官网

<template>
	<view>
        <image v-for="(item,index) in img":src="item" mode="widthFix" style="width: 100%;height: auto;"></image>
		<view style="position: fixed;left: 750rpx;top: 0;">
            <view class="page" id="contractimage1">第1页内容</view>
            <view class="page" id="contractimage2">第2页内容</view>
            <view class="page" id="contractimage3">第3页内容</view>
            <view class="page" id="contractimage4">第4页内容</view>
            <view class="page" id="contractimage5">第5页内容
                <view class="signature" style="display: flex;align-items: center;">
					<text>甲方:(盖章)</text>
                    <image :src="form.onePicture" style="width: 200rpx;height: 200rpx;" @load="html2canvas.load"></image>
				</view>
            </view>
        </view>
    </view>
</template>

<!-- 逻辑层 -->
<script>
	import html2canvas from 'html2canvas';
	export default {
		data() {
			return {
				img:[],
				pages: 5,
				form:'',
				days:''
			}
		},
        //此处数据是上一页面传过来的-也可以自行在onload里请求获取
		onLoad({info}) {
			this.showLoading()
			this.form=JSON.parse(decodeURIComponent(info))
		},
		methods: {
			showLoading() {
				uni.showLoading({
					title: '加载中……',
					mask: true
				})
			},
			hideLoading() {
				uni.hideLoading()
			},
            //接受视图层传的数据
			renderFinish(opt) {
				this.img.push(opt)
				if(this.img.length==this.pages)this.hideLoading()
			},
		}
	}
</script>
<!-- 动态生成 script -->
<!-- renderjs 视图(渲染层)层可以操作dom和window  -->
<!-- 扩展:相当于使用 mixin 方式,可以直接访问逻辑层数据 -->
<!-- 扩展:f2、threejs等库都可以这么用 -->
<script module="html2canvas" lang="renderjs">
	import html2canvas from 'html2canvas'
	export default {
		//create()html完成前就开始了
		//mounted()html渲染完成 执行
		mounted() {
            //因为页面中有网络图片,加载时间和html渲染时间不能同步完成,直接截图会导致图片空白,故使用load去监听图片加载完成,完成后再截图
            //this.create()
		},
		//生命周期不支持 beforeDestroy、destroyed、beforeUnmount、unmounted),不可以使用 App、Page 的生命周期
		methods: {
			//@load="html2canvas.load"
			//逻辑层 绑定了事件 到渲染层
			load(e){//图片加载完成
				console.log('load2',e)
				//图片加载完-再执行html2canvas
				this.create();
			},
			async create() {
				for(let i=0;i<5;i++){
					html2canvas(document.querySelector('#contractimage'+Number(i+1)), {
						scale:3,
						dpi:window.devicePixelRatio * 1,
						useCORS:true,
					}).then(canvas => {
						//向逻辑层的renderFinish传值
						this.$ownerInstance.callMethod('renderFinish',canvas.toDataURL('image/png'))
					});
				}
			}
		}
	}
</script>

<style lang="scss" scoped>
    .page {
		margin: 0 auto;
		width: 592.28pt;//592.28
		height: 840pt;// 841.89
		padding: 70pt 80pt;
		box-sizing: border-box;
		position: relative;
		color: #000000;
	}
    .signature {
		width: 50%;
		margin-top: 50px;
		flex: 1;
		font-size: 12pt;

		&:last-child {
			padding-bottom: 30px;
		}
	}
</style>

PS(懒得再开文章)

附上另一个展示合同需求:

1.合同内容是docx形式展示,2.前端实现签名操作,3.后台合成签名图片和docx后在小程序展示。

小程序签名,DCloud 插件市场有现成的插件canves 手写 签名 画板(开箱即用) - DCloud 插件市场

因为后台使用的插件不支持https,但小程序必须https,故后台设计了多步文件转换(这里前端先不考虑)

 

方法思路如下:(有点绕)

第一步,在小程序里展示docx

(找了好多方法都直接展示不出来签名按钮和docx,或者只能直接打开文件)

 如直接打开满足需求,强烈建议优先使用!

uni.downloadFile({
  url: 'https://example.com/somefile.pdf',
  success: function (res) {
    var filePath = res.tempFilePath;
    uni.openDocument({
      filePath: filePath,
      showMenu: true,
      success: function (res) {
        console.log('打开文档成功');
      }
    });
  }
});

另辟蹊径:用webview嵌套web页面,在web页面中显示docx和签名按钮

  1.  小程序新建页面webview.vue
<template>
	<view>
		<web-view :src="url"></web-view>
        <!-- <cover-view class="public-btn" @click="navback">业主签字</cover-view> -->
	</view>
</template>

<script>
	export default {
		data() {
			return {
				url:'',//这个页面是自己写的
			}
		},
		onLoad() {
			if(uni.getStorageSync('token')){
				this.url='https://***/h5/#/pages/contract?token='+uni.getStorageSync('token')
			}
		}
	}
</script>

有钱嫌麻烦的客户,可以直接找三方链接

https://view.xdocin.com/xdoc?img=true&_xdoc=前10天还是15天免费,后面就会停服收费,但是也要嵌套在web里,(设置成img类型可以不用在小程序后台填xdocxin的webview域名,但是长期服务收三方费)

免费的 Microsoft 365 Online | Word、Excel、PowerPoint

微软的虽然免费,但是webview域名没法填,样式也有限,web会自动重定向到微软里,还没有办法解决。但是非小程序的可以使用

<iframe v-if="filesrc" ref="iframe" id="iframe" width="100%" height="100%" frameborder="0" :src="filesrc" scrolling="no" security="restricted" sandbox=""></iframe>

2.web页面

用到了mammoth,但是图片无法正常显示,果断换docx-preview,如下:

<template>
	<view>
		<view :style="'width: 100%;height:'+height+'px;overflow:hidden;'">
			<view id="file"></view>
		</view>
		<!-- 判断签过名不显示按钮 -->
		<view v-if="!sign&&status==4" class="public-btn" @click="navback">业主签字</view>
	</view>
</template>
用户端 访问的合同H5
<script>
	import wx from 'weixin-js-sdk';
	import { renderAsync } from 'docx-preview'
    // const docx2html=require("docx2html")
	// import mammoth from "mammoth";//--m
	export default {
		data() {
			return {
				sign:false,//签字板
				file:'',
				img:'',
				filesrc:'',
				status:'',
				wordText:'',
				docxOptions:{
					className: "filestyle", // string:默认和文档样式类的类名/前缀
					inWrapper:  true, // boolean:启用围绕文档内容的包装器渲染
					ignoreWidth: false, // boolean:禁用页面的渲染宽度
					ignoreHeight: false, // boolean:禁止渲染页面高度
					ignoreFonts: false, // boolean:禁用字体渲染
					breakPages: true, // boolean:在分页符上启用分页
					ignoreLastRenderedPageBreak: true, // boolean:在 lastRenderedPageBreak 元素上禁用分页
					experimental: false, // boolean:启用实验功能(制表符停止计算)
					trimXmlDeclaration: true, // boolean:如果为true,解析前会从​​ xml 文档中移除 xml 声明
					useBase64URL: false, // boolean:如果为true,图片、字体等会转为base 64 URL,否则使用URL.createObjectURL
					useMathMLPolyfill: true, // boolean:包括用于 chrome、edge 等的 MathML polyfill。
					showChanges: false, // boolean:启用文档更改的实验性渲染(插入/删除)
					debug: false, // boolean:启用额外的日志记录
				},
				height:700
			};
		},
		onLoad({token}) {
			if(token)uni.setStorageSync('token',token)
		},
		onShow() {
			this.getinfo()
		},
		methods:{
            //回到小程序指定页面
			navback(){
				wx.miniProgram.navigateTo({
				   url: '/pages/order/sign' //小程序必须有该目录--此处是签名页
				})
			},
			//合同模板
			getinfo(){
				uni.showLoading({
					mask:true
				})
				setTimeout(()=>{
					uni.hideLoading()
				},5000)
				this.$Fly.post('api/order/kanChaList').then(res=>{
					if(res.code==1){
						this.status=res.data.status
					}
				})
				this.$Fly.post('api/Order/contract').then(res=>{
					if(res.code==1){
						this.file=res.data.file
						uni.request({
							url:this.file,
							responseType:'arraybuffer',
							header:{
								Authorization:"Bearer e2589fc8-8748-481b-8ec4-c63df33e4371",
								token:uni.getStorageSync('token')
							},
							method:'GET',
							success: (rres) => {
								renderAsync(rres.data,document.getElementById('file'), null,this.docxOptions).then(rr=>{
									uni.hideLoading()
									this.height=document.getElementById('file').clientHeight*55/100+200
								})
							}
						})
					}
				})
			},
		}
	}
</script>

文档持续更新。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: UniApp是一种基于Vue.js的跨平台开发框架,可以用于开发微信小程序、H5、安卓和iOS应用。H5是一种基于HTMLCSS和JavaScript的网页开发技术,可以在支持HTML5的浏览器中运行。 Html2canvas是一个JavaScript库,可以将HTML元素转换为Canvas图像。通过使用html2canvas,可以将H5页面中的HTML元素截图,并将其转换为Canvas图像,从而实现一些有趣的效果和功能。 在UniApp使用html2canvas可以实现一些独特的功能。例如,可以将H5页面上的特定元素转换为Canvas图像,并将其保存为图片或在页面上展示。这对于一些需要在应用中操作和处理截图的功能非常有用。 使用html2canvas还可以实现H5页面的模板分享功能。通过将H5页面转换为Canvas图像,可以将页面保存为图片,并通过分享功能分享给其他用户,实现页面内容的传播和分享。 总之,UniApphtml2canvas的结合可以为开发者提供更多有趣和实用的功能。无论是实现特定元素的截图,还是实现页面内容的分享,都可以通过使用这两种技术来实现。这对于开发具有创新和交互性的H5应用来说是非常有帮助的。 ### 回答2: Uniapp是一种跨平台的开发框架,可以用于开发移动端和Web端应用。而HTML2Canvas是一个将HTML元素转换为Canvas图像的JavaScript库。 在Uniapp中,我们可以使用HTML2Canvas库来实现H5页面元素的截图功能。首先,我们需要在Uniapp项目中引入HTML2Canvas库的代码。可以通过npm安装HTML2Canvas库,然后在需要使用的页面中导入该库。 接下来,在需要截图的页面中,我们可以通过选择器或者获取元素的DOM对象将需要截图的元素传入HTML2Canvas的API函数中。HTML2Canvas会将传入的元素转换为Canvas图像。 然后,我们可以获取到转换后的Canvas对象,通过Canvas提供的toDataURL方法将其转换为DataURL格式的图片数据。我们可以将DataURL格式的图片数据传递给后端进行保存、上传或者展示。 需要注意的是,由于Uniapp是跨平台开发框架,HTML2Canvas库在不同平台上的兼容性可能存在差异。在使用HTML2Canvas时,需要测试兼容性并进行适当的调整。 总结起来,UniappHTML2Canvas的结合可以实现在H5页面中将HTML元素转换为Canvas图像的功能,可以实现元素截图、保存等操作。 ### 回答3: uniapp是一个跨平台的开发框架,它基于Vue.js,可以用于开发多个平台上的应用程序,包括H5、小程序、App等。而html2canvas是一个JavaScript库,可以将网页中的内容转换为图片。 在uniapp使用html2canvas可以实现将H5页面的内容生成图片的功能。首先需要将html2canvas库引入到uniapp的项目中。然后需要在需要生成图片的页面中调用html2canvas的相关方法,将页面内容转换为图片。生成图片后,可以通过uniapp的API将图片保存到本地或者上传到服务器。 使用html2canvas生成图片可以应用于一些场景,比如制作截图功能、生成分享图等。比如,我们可以在uniapp的H5页面中添加一个“生成图片”按钮,当用户点击按钮时,调用html2canvas将页面内容转换为图片,并将图片保存到本地或者分享出去。 值得注意的是,由于html2canvas是通过解析网页中的DOM结构来生成图片的,所以在使用过程中需要注意一些限制和兼容性问题,比如图片中可能不包含视频、动画等一些特殊的元素,以及一些浏览器的兼容性问题。 总之,使用uniapp结合html2canvas可以实现在H5页面中将网页内容转换为图片的功能,为开发者提供了更多的可能性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值