vue3 将当前的页面转换成图片

<template>
	<div class="order-detail-container" v-if="!base64">
		<div class="camera-box">
			<div class="camera-box-detail">
				<div class="camera-box-detail-row1">
					<div class="camera-box-detail-row1-right">
						<image class="img" crossOrigin="anonymous" style="width: 135px; border-radius: 3px"
							mode="widthFix" :src="objectDeatil?.image" />
					</div>
					<div class="camera-box-detail-row1-left">
						<div class="camera-box-detail-row1-left-name">
							<div>{{objectDeatil?.filmName}}</div>
							<div style="color: #ee0a24;font-size: 14px;">{{objectDeatil?.cityName}}</div>
						</div>
						<div class="camera-box-detail-row1-left-type">
							{{objectDeatil?.cinemaName}}
						</div>
						<div class="camera-box-detail-row1-left-type"> {{objectDeatil?.ticketNum}} 张</div>
						<div class="camera-box-detail-row1-left-time">
							<div class="camera-box-detail-row1-left-time1">
								{{ formatShowTimeYear(objectDeatil?.showTime) }}
							</div>
							<div class="camera-box-detail-row1-left-time2">
								{{ formatShowTime(objectDeatil?.showTime) }}

								开场
							</div>
						</div>
						<div class="camera-box-detail-row1-left-address">
							{{ objectDeatil?.address }}

						</div>
						<div class="camera-box-detail-row1-left-position-Name">
							{{ objectDeatil?.hallName }}

						</div>

						<div class="camera-box-detail-row1-left-position">
							<div class="camera-box-detail-row1-left-position-seat">
								<div class="camera-box-detail-row1-left-position-seat-item">
									{{objectDeatil?.seatInfo}}


								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div style="height: 50px;">

		</div>

		<div style="border-bottom: 1px solid #ccc;"></div>
		<div style="margin-top: 50px;display: flex;justify-content: center;align-items: center;">
			<canvas style="width: 200px; height: 200px" canvas-id="myQrcode1"></canvas>

		</div>





	</div>
	<div v-if="base64">
		<img :src="base64" class="custom-image" alt="">
	</div>

</template>
<script setup>
	import {
		computed,
		onMounted,
		ref
	}
	from "vue"

	import drawQrcode from "weapp-qrcode";

	import moment from "moment";
	import html2canvas from "html2canvas"


	const objectDeatil = ref({})
	const flag = ref(false)
	const base64 = ref("")

	const formatShowTimeYear = computed(() => {
		return (str) => {
			return moment(str).format("YYYY-MM-DD");
		};
	});


	const formatQrCode = computed(() => {
		return (str) => {
			return moment(str).format("YYYY-MM-DD");
		};
	});
	// 【格式化】开场时间
	const formatShowTime = computed(() => {
		return (str) => {
			return moment(str).format("HH:mm");
		};
	});
	const capturePageAsImage = () => {
		const elementToCapture = document.body; // 捕获整个页面

		html2canvas(elementToCapture, {

			allowTaint: true, //开启跨域
			useCORS: true,
			scrollY: 0,
			scrollX: 0,


		}).then(canvas => {
			// 将生成的 canvas 元素转换为图片 URL
			const imageDataURL = canvas.toDataURL('image/png');

			// 创建一个新的 Image 元素,将图片 URL 设置为源
			// const imageElement = new Image();
			// imageElement.src = imageDataURL;
			// console.log(imageElement.src, imageDataURL.slice(15));
			base64.value = imageDataURL
			console.log(base64.value, "base64.value");
			if (window.navigator.msSaveOrOpenBlob) {
				let bstr = atob(base64.value.split(",")[1]);
				let n = bstr.length;
				let u8arr = new Uint8Array(n);
				while (n--) {
					u8arr[n] = bstr.charCodeAt(n);
				}
				let blob = new Blob([u8arr]);
				window.navigator.msSaveOrOpenBlob(blob, "chart-download" + "." + "png");
			} else {
				// 这里就按照chrome等新版浏览器来处理
				let a = document.createElement("a");
				a.href = base64.value;
				a.setAttribute("download", "chart-download");
				a.click();
			}
		});
	}
	onMounted(() => {


		const query = uni.getLaunchOptionsSync().query;
		objectDeatil.value = query

		console.log('启动参数:', query);

		if (query) {
			objectDeatil.value = query
			// console.log(objectDeatil.value, "ppppppppp");
			drawQrcode({
				width: 200,
				height: 200,
				canvasId: "myQrcode1",
				text: query.voteCode,
			});
		}




		setTimeout(() => {
			capturePageAsImage();
		}, 100)

	})
</script>
<style lang="less">
	.custom-image {
		width: 100%;
		height: 100%;
		/* 添加其他样式规则 */
	}

	page {
		height: 100%;
		width: 100%;
	}

	.order-detail-container {

		padding: 10px 15px;
		box-sizing: border-box;

		.camera-title {
			display: flex;
			// justify-content: center;
			align-items: center;
			font-size: 14px;
			background-color: #fff;
			padding: 20px;
			border-bottom: 1px solid #eee;
			color: #15181d;
			border-top-left-radius: 20px;
			border-top-right-radius: 20px;

			.icon {
				display: flex;
				flex-direction: column;
				align-items: center;
				justify-content: center;
				background: linear-gradient(to right, #ff6034, #ee0a24);
				height: 50px;
				width: 50px;
				border-radius: 50px;

				// margin-right: 15px;
				.iconfont {
					font-size: 16px;
					color: #ffffff;
				}
			}

			.camera-right {
				display: flex;
				flex-direction: column;
				// align-items: center;
				justify-content: flex-start;
				margin-left: 20px;

				.camera-right-time {
					color: #858a99;
					font-size: 16px;
					display: flex;
					justify-content: center;
					align-items: center;

					.nut-countdown__content {
						color: #ee0a24 !important;
						font-size: 16px;
						font-weight: normal;
					}
				}

				.camera-right-status {
					color: #15181d;
					font-weight: 700;
					font-size: 16px;
				}
			}

			.camera-title-jt {
				font-size: 16px;
				font-weight: 700;
			}
		}

		.camera-box {
			background-color: #fff;
			// border-radius: 30px;
			padding: 20px 10px;
			border-bottom-left-radius: 20px;
			border-bottom-right-radius: 20px;

			box-sizing: border-box;

			.camera-box-detail {

				.camera-box-detail-row1 {
					display: flex;
					justify-content: flex-start;

					// align-items: center;
					.camera-box-detail-row1-left {
						font-size: 14px;
						margin-left: 20px;

						.camera-box-detail-row1-left-name {
							color: #15181d;
							font-size: 18px;
							font-weight: 700;
							display: flex;
							justify-content: space-between;
							align-items: center;
							// margin-top: 10px;
						}

						.camera-box-detail-row1-left-time {
							color: #858a99;
							margin-top: 8px;
							display: flex;
							align-items: center;

							.camera-box-detail-row1-left-time1 {}

							.camera-box-detail-row1-left-time2 {
								color: #ee0a24;
								margin-left: 8px;
							}
						}

						.camera-box-detail-row1-left-position-Name {
							color: #858a99;
							margin-top: 8px;

							display: -webkit-box;
							/* autoprefixer: ignore next */
							-webkit-box-orient: vertical;
							-webkit-line-clamp: 1;
							text-overflow: ellipsis;
							overflow: hidden;
						}

						.camera-box-detail-row1-left-address {
							color: #858a99;
							margin-top: 8px;

							display: -webkit-box;
							/* autoprefixer: ignore next */
							-webkit-box-orient: vertical;
							-webkit-line-clamp: 1;
							text-overflow: ellipsis;
							overflow: hidden;
						}

						.camera-box-detail-row1-left-position {
							margin-top: 8px;
							display: -webkit-box;
							/* autoprefixer: ignore next */
							-webkit-box-orient: vertical;
							-webkit-line-clamp: 1;
							text-overflow: ellipsis;
							overflow: hidden;

							color: #858a99;

							.camera-box-detail-row1-left-position-seat {
								display: flex;
								flex-wrap: wrap;

								.camera-box-detail-row1-left-position-seat-item:nth-child(n + 2) {
									margin-left: 5px;
								}
							}
						}

						.camera-box-detail-row1-left-type {
							color: #858a99;
							margin-top: 8px;
						}
					}
				}

				.camera-box-detail-row2 {
					margin-top: 25px;
					display: flex;
					justify-content: space-between;
					align-items: center;

					.camera-box-detail-row2-left {
						display: flex;
						justify-content: center;
						align-items: center;
						color: #ee0a24;
						font-weight: 700;
						font-size: 28px;

						.sanjiantouFont {
							font-size: 42px;
							margin-left: 5px;
						}
					}
				}
			}
		}





	}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现页面转换成 PDF 并导出的最好方案,主要有两种方法:前端实现和后端实现。 前端实现: 在前端实现页面转换成 PDF 并导出,可以使用 jsPDF 和 html2canvas 库。jsPDF 是一个用于生成 PDF 文件的 JavaScript 库,而 html2canvas 是一个用于将 HTML 元素转换为 Canvas 的 JavaScript 库。 以下是一个简单的例子,展示如何在 Vue 中使用 jsPDF 和 html2canvas 实现页面转换成 PDF 并导出: 1. 安装 jsPDF 和 html2canvas 库: ```bash npm install jspdf html2canvas --save ``` 2. 在 Vue 组件中引入 jsPDF 和 html2canvas 库: ```javascript import jsPDF from 'jspdf' import html2canvas from 'html2canvas' ``` 3. 在 Vue 组件中定义导出 PDF 的方法: ```javascript export default { methods: { exportPDF() { // 获取需要导出的元素 let element = document.getElementById('pdf-content') // 将元素转换为 Canvas html2canvas(element).then(canvas => { // 获取 Canvas 图片数据 let imgData = canvas.toDataURL('image/png') // 计算 PDF 页面大小 let pageWidth = 210 let pageHeight = canvas.height * pageWidth / canvas.width // 创建 PDF 对象 let pdf = new jsPDF('p', 'mm', 'a4') // 添加 PDF 页面 pdf.addImage(imgData, 'PNG', 0, 0, pageWidth, pageHeight) // 导出 PDF 文件 pdf.save('export.pdf') }) } } } ``` 在以上代码中,`exportPDF` 方法用于导出 PDF 文件。首先,通过 `document.getElementById` 获取需要导出的元素,这里假设元素的 ID 为 `pdf-content`。然后,使用 `html2canvas` 将元素转换为 Canvas,再通过 Canvas 的 `toDataURL` 方法获取图片数据。接着,计算 PDF 页面大小,创建 jsPDF 对象,并将图片添加到 PDF 中。最后,使用 `pdf.save` 方法导出 PDF 文件。 后端实现: 在后端实现页面转换成 PDF 并导出,可以使用一些开源的 PDF 库,比如 wkhtmltopdf、WeasyPrint、PDFKit 等。 其中,wkhtmltopdf 是一个开源的 HTML 到 PDF 转换器,可以在 Linux、Windows 和 macOS 等操作系统上使用。WeasyPrint 是一个开源的 HTML 和 CSS 到 PDF 转换器,支持 Linux、macOS 和 Windows 等操作系统。PDFKit 是一个 Node.js 库,可以用于生成 PDF 文件。 以下是一个简单的例子,展示如何在 Vue 中使用 wkhtmltopdf 实现页面转换成 PDF 并导出: 1. 安装 wkhtmltopdf: ```bash sudo apt-get install wkhtmltopdf ``` 2. 在 Vue 组件中定义导出 PDF 的方法: ```javascript export default { methods: { exportPDF() { // 计算 PDF 文件名 let filename = 'export.pdf' // 获取当前页面 URL let url = window.location.href // 发送 GET 请求,生成 PDF 文件 axios.get(`/api/pdf?url=${encodeURIComponent(url)}&filename=${encodeURIComponent(filename)}`, { responseType: 'blob' }).then(response => { // 创建 blob 对象 let blob = new Blob([response.data], { type: 'application/pdf' }) // 创建下载链接 let link = document.createElement('a') link.href = URL.createObjectURL(blob) link.download = filename // 触发下载 link.click() }) } } } ``` 在以上代码中,`exportPDF` 方法用于导出 PDF 文件。首先,计算 PDF 文件名,这里假设文件名为 `export.pdf`。然后,获取当前页面 URL,将 URL 和文件名作为参数,发送 GET 请求到后端 API,生成 PDF 文件。最后,将返回的二进制数据转换为 blob 对象,创建下载链接,并触发下载。 你可以根据需要选择前端实现或后端实现,以满足你的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值