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

PC端直接打印功能(包括两张图片合并功能)

一、 效果图

二、demo代码

<template><div class="box"><divref="printContent"class="print-content"><div class="print-title">打印图片</div><imgclass="preview-image":src="mergedImage"alt="Merged Image"/></div><div class="btn" @click="handlePrint">打印</div></div></template><script lang="ts" setup>
import { onMounted, ref } from 'vue';
import image1 from '../../assets/images/cs.jpg'
import image2 from '../../assets/images/huang1.png'
const printContent = ref();
const codeImg = ref()
const photoUrl = ref()
const mergedImage = ref(null);
onMounted(() => {mergeImages()
})
// 打印
const handlePrint = () => {return new Promise((resolve) => {// 创建隐藏的iframeconst iframe = document.createElement('iframe');iframe.style.position = 'fixed';iframe.style.right = '0';iframe.style.bottom = '0';iframe.style.width = '0';iframe.style.height = '0';iframe.style.border = '0';// 插入DOMdocument.body.appendChild(iframe);// 获取打印内容const content = `<html><head><title>打印</title><style>@page { margin: 0; }body { margin: 1cm; }img { max-width: 100%!important; height: auto!important;}</style></head><body>${printContent.value.innerHTML}</body></html>`;// 写入内容const doc = iframe.contentWindow.document;doc.open();doc.write(content);doc.close();// 打印完成后清理iframe.contentWindow.onafterprint = () => {document.body.removeChild(iframe);closeModal();resolve();};// 触发打印setTimeout(() => {iframe.contentWindow.focus();iframe.contentWindow.print();}, 500);});
};
// 合并两张图片
const mergeImages = async () => {const img1 = new Image();const img2 = new Image();img1.src = image1img2.src = image2await new Promise((resolve) => {img1.onload = resolve;});await new Promise((resolve) => {img2.onload = resolve;});const canvas = document.createElement('canvas');canvas.width = img1.width;canvas.height = img1.height;const ctx: any = canvas.getContext('2d');ctx.drawImage(img1, 0, 0);// 假设头像位置在左上角,你可以根据需要调整位置// const avatarSize = 300; // 头像大小ctx.drawImage(img2, 230, 30, 425, 425);  // 距离左边位置,距离上边位置,图片宽度,图片高度mergedImage.value = canvas.toDataURL('image/png');
};
</script>
<style lang="scss" scoped>
.box {width: 100%;height: 100%;box-sizing: border-box;padding: 20px;
}
@media print {/* 打印时隐藏所有内容 */body * {visibility: hidden !important;}/* 显示打印区域 */.print-content,.print-content * {visibility: visible !important;}/* 定位到页面顶部 */.print-content {position: absolute;left: 0;top: 0;width: 100% !important;}
}
.print-title {text-align: left;font-size: 28px;
}
.preview-image {width: 500px;
}
.btn{width: 80px;height: 44px;line-height: 44px;text-align: center;background-color: rgb(56, 68, 240);color: #fff;cursor: pointer;
}
</style>
http://www.lryc.cn/news/2402527.html

相关文章:

  • Vue前端篇——项目目录结构介绍
  • 基于端到端深度学习模型的语音控制人机交互系统
  • 原生js操作元素类名(classList,classList.add...)
  • 抽象工厂模式深度解析:从原理到与应用实战
  • 35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
  • Linux常用命令学习手册
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解
  • Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
  • COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
  • 配置sudo免密却不生效的问题
  • 大模型赋能:金融智能革命中的特征工程新纪元
  • Significant Location Change
  • springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
  • LHA9924芯片可代替AD7190,CS5530
  • 短视频矩阵系统技术saas源头6年开发构架
  • 枫之谷Artale端午节大当机----后端技术的巨大风险
  • 前端删除评论操作(局部更新数组)
  • 数学复习笔记 28
  • Delphi 实现远程连接 Access 数据库的指南
  • 在线OJ项目测试
  • C++ --- vector
  • 【python基础知识】变量名和方法名的单下划线(_)和双下划线(__)总结
  • FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
  • ✅ 常用 Java HTTP 客户端汇总及使用示例
  • 快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
  • Keil调试模式下,排查程序崩溃简述
  • Python读取PDF:文本、图片与文档属性
  • 基于SpringBoot+Vue2的租房售房二手房小程序
  • 数学:学好数学需要对数系进行系统的对比和分析
  • 基于本地LLM与MCP架构构建AI智能体全指南