当前位置: 首页 > article >正文

uniapp使用canvas生成订单小票图片

<view class="button-cc" @click="handleCreateImg()">
						生成订单图片
					</view>


<canvas canvas-id="receiptCanvas"
				:style="{ width: '300px', height: totalHeight + 'px' }" style="margin-top: 20rpx;"></canvas>

在获取订单信息的位置设置自适应的高度 :

// 设置canvas画布的高度
						const lineHeight = 20; // 每行的高度
						const headerHeight = 110; // 标题和表头的高度
						const footerHeight = 240; // 底部信息和商家信息的高度
						const goodsLines = this.orderDetail.goods.length;
						const goodsHeight = goodsLines * lineHeight;
						const totalHeight = headerHeight + goodsHeight + footerHeight;
						this.totalHeight = `${totalHeight}`;
						console.log(this.totalHeight);
handleCreateImg() {
				const ctx = uni.createCanvasContext('receiptCanvas');
				// 设置背景色为白色
				ctx.setFillStyle('white');
				// 计算所需的 canvas 高度
				// 设置 canvas 的尺寸
				ctx.fillRect(0, 0, 300, this.totalHeight);

				// ctx.fillRect(0, 0, 300, 600); // 这里的坐标 (0, 0) 表示从左上角开始,宽300px、高400px是之前设置的canvas尺寸
				// 后续设置绘图样式以及绘制小票内容等操作
				ctx.setFontSize(14);
				ctx.setTextAlign('left');
				ctx.setTextBaseline('top');
				ctx.setFillStyle('black');

				ctx.font = '20px Arial';
				ctx.fillText(`${this.orderDetail.no}`, 130, 20);
				ctx.beginPath();
				ctx.setLineDash([5, 5]);
				ctx.moveTo(10, 50); // 起点坐标
				ctx.lineTo(290, 50); // 终点坐标,宽度是之前设置的300px,适当减去一点边界值
				ctx.setStrokeStyle('black'); // 设置线条颜色为灰色
				ctx.setLineWidth(1); // 设置线条宽度
				ctx.stroke();
				ctx.font = '14px Arial';
				ctx.fillText('商品', 10, 60);
				ctx.fillText('单价', 180, 60);
				ctx.fillText('数量', 240, 60);

				let y = 90; // 起始纵坐标,从分割线下方开始
				this.orderDetail.goods.forEach(item => {
					ctx.fillText(`${item.name} `, 10, y);
					ctx.fillText(`${item.money} `, 180, y);
					ctx.fillText(`${item.num}`, 240, y);
					y += 20; // 每绘制一行商品信息,纵坐标往下移动一定距离,便于换行显示
				});

				ctx.fillText(`订单号: ${this.orderDetail.order_sn}`, 10, y += 20);
				ctx.fillText(`联系人: ${this.orderDetail.nickname}`, 10, y += 20);
				ctx.fillText(`联系电话: ${this.orderDetail.mobile}`, 10, y += 20);
				ctx.fillText(`联系地址: ${this.orderDetail.address}`, 10, y += 20);
				ctx.fillText(`商品总计: ${this.orderDetail.goods_total}`, 10, y += 20);
				ctx.fillText(`包装费: ${this.orderDetail.packing}`, 10, y += 20);
				ctx.fillText(`总计:  ${this.orderDetail.pay}`, 10, y += 20);
				ctx.fillText(`实付: ${this.orderDetail.pay}`, 10, y += 20);
				// 绘制虚线
				ctx.beginPath();
				ctx.setLineDash([5, 5]);
				ctx.moveTo(10, y += 40); // 起点坐标
				ctx.lineTo(290, y); // 终点坐标,宽度是之前设置的300px,适当减去一点边界值
				ctx.setStrokeStyle('black'); // 设置线条颜色为灰色
				ctx.setLineWidth(1); // 设置线条宽度
				ctx.stroke();
				ctx.fillText('同城配送', 120, y += 10);
				// 绘制虚线
				ctx.beginPath();
				ctx.setLineDash([5, 5]); // 第一个参数表示线段长度,第二个参数表示间隔长度  绘制虚线
				ctx.moveTo(10, y += 20);
				ctx.lineTo(290, y);
				ctx.strokeStyle = 'black';
				ctx.lineWidth = 1;
				ctx.stroke();

				ctx.draw(false, () => {
					uni.canvasToTempFilePath({
						canvasId: 'receiptCanvas',
						success: (res) => {
							const imageDataURL = res.tempFilePath;
							// 此时,imageDataURL 可以用于在页面中显示图片,比如在 <image> 组件中
							this.imageDataURL = imageDataURL;
							this.handleLook(this.imageDataURL)
							// this.saveReceiptImage()
						},
						fail: (err) => {
							console.log(err);
						}
					});
				});
			},
// 保存图片
saveReceiptImage(url) {
				uni.saveImageToPhotosAlbum({
					filePath: url,
					success: () => {
						uni.showToast({
							title: '图片保存成功',
							duration: 2000
						});
					},
					fail: (err) => {
						console.log(err);
						uni.showToast({
							title: '图片保存失败,请检查权限等设置',
							duration: 2000
						});
					}
				});
			},
// 预览图片
			handleLook(url) {
				uni.previewImage({
					urls: [url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
					current: '', // 当前显示图片的http链接,默认是第一个
					success: function(res) {},
					fail: function(res) {},
					complete: function(res) {},
// 长按保存图片
					longPressActions: {
						itemList: ['保存图片'],
						success: function(ress) {
							uni.saveImageToPhotosAlbum({
								filePath: url,
								success: () => {
									uni.showToast({
										title: '图片保存成功',
										duration: 2000
									});
								},
								fail: (err) => {
									console.log(err);
									uni.showToast({
										title: '图片保存失败,请检查权限等设置',
										duration: 2000
									});
								}
							});
						},
						fail: function(res) {
							console.log(res.errMsg);
						}
					}
				})
			},

绘制如图所示:


http://www.kler.cn/a/470634.html

相关文章:

  • 算法5--位运算
  • R语言的网络编程
  • WebSocket 实现指南
  • uni-app 页面生命周期及组件生命周期汇总(Vue2、Vue3)
  • Linux安全防火墙(iptables)配置策略
  • 前端访问一个图片URL时,浏览器默认会尝试下载文件而不是直接显示它
  • 【STM32】点击下载按钮时,提示No ST-LINK detected
  • 创建型模式4.原型模式
  • node.js版本管理之---npm 和 package.json
  • 图像识别-全连接层-卷积层-卷积层的计算-多输入通道场景-多输出通道场景-感受野-填充-VALID 与 SAME-stride-池化-CNN架构
  • 【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
  • Backend - ADO.NET(C# 操作Oracle、PostgreSQL DB)
  • HCIA-Access V2.5_8_1_EPON原理_PON基本概念
  • 在Linux中,SElinux的作用是什么?如何临时和永久的更改SElinux上下文?
  • Linux buildroot和ubuntu的异同点
  • 支付宝手机网站支付
  • 两万字梳理 | 四足机器人的结构、控制及运动控制
  • VTK 鼠标+键盘重构
  • vulnhub potato靶机
  • HackMyVM-Again靶机的测试报告
  • 【智能算法】改进蚁狮优化算法【matlab】
  • arkTs数据存储
  • Visual Studio 2022 C++ gRPC 环境搭建
  • 六十三:七层负载均衡做了些什么?
  • HTML——79.代码快捷输入方式
  • grouped.get_group((‘B‘, ‘A‘))选择分组