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

vue中使用print.js实现页面打印并增加水印

1.安装print.js

npm install print-js --save

2.在main.js文件中引入并注册(我使用的是print.js的源码文件,并且做了一修改)

//引入
import Print from './utils/print'//注册
Vue.use(Print); //注册

3.在页面中使用

<template>
<div class="detailsPrint"><div class="move" ref="pdfContent" id="pdfContent">需要打印的内容 </div><el-button type="primary" @click="printPDF">打 印</el-button></div>
</template><script>
export default {name: "",data() {return {};},methods: {// 打印PDFprintPDF() {this.$nextTick(() => {this.$print(this.$refs.pdfContent, {watermark: {companyName: '公司名称',name: '姓名',date: '2024-08-01',}});}},
};
</script>
<style scoped>
//我希望打印出来的格式是A4纸的格式
@media print {@page {size: B5(JIS);margin: 10mm 16mm;margin-top: 8mm;margin-bottom: 8mm;}
}
</style>

4.在utils下新增print.js

/* eslint-disable */
const Print = function (dom, options) {if (!(this instanceof Print)) return new Print(dom, options);this.options = this.extend({'noPrint': '.no-print','watermark': {} // 接受单个水印数据对象}, options);if ((typeof dom) === "string") {this.dom = document.querySelector(dom);} else {this.dom = dom;}setTimeout(() => {this.init();}, 2000);
};Print.prototype = {init: function () {var content = this.getStyle() + this.getHtml();this.writeIframe(content);},extend: function (obj, obj2) {for (var k in obj2) {obj[k] = obj2[k];}return obj;},getStyle: function () {var str = "",styles = document.querySelectorAll('style,link');for (var i = 0; i < styles.length; i++) {str += styles[i].outerHTML;}str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";str += `<style>.watermark {position: absolute;top: 0;left: 0;width: 100%;height: 100%;opacity: 0.2;pointer-events: none;}.watermark-content {color:rgba(0,0,0,0.4)text-align: center;transform: rotate(-45deg);font-size: 24px;}/* 打印样式 */@media print {body, html {width: 100%;height: 100%;margin: 0;padding: 0;}.watermark {opacity: 0.2;pointer-events: none;position: fixed; /* 修正水印固定位置 */}.watermark-content {text-align: center;transform: rotate(-45deg);font-size: 24px;color:rgba(0,0,0,0.4)}/* 隐藏不需要打印的内容 */${this.options.noPrint} {display: none !important;}/* 设置A4纸大小和页边距 */@page {size: B5(JIS);margin: 10mm 16mm;margin-top: 8mm;margin-bottom: 8mm;}}</style>`;return str;},getHtml: function () {var inputs = document.querySelectorAll('input');var textareas = document.querySelectorAll('textarea');var selects = document.querySelectorAll('select');for (var k in inputs) {if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {if (inputs[k].checked == true) {inputs[k].setAttribute('checked', "checked")} else {inputs[k].removeAttribute('checked')}} else if (inputs[k].type == "text") {inputs[k].setAttribute('value', inputs[k].value)}}for (var k2 in textareas) {if (textareas[k2].type == 'textarea') {textareas[k2].innerHTML = textareas[k2].value}}for (var k3 in selects) {if (selects[k3].type == 'select-one') {var child = selects[k3].children;for (var i in child) {if (child[i].tagName == 'OPTION') {if (child[i].selected == true) {child[i].setAttribute('selected', "selected")} else {child[i].removeAttribute('selected')}}}}}// 使用传递的单个水印数据对象生成多个随机位置的水印var watermarkHtml = '';var numWatermarks = 12; // 生成的水印数量var leftStart = -50; // 修改此处,从最左边开始的起始位置(百分比)var leftEnd = 95; // 最右边的结束位置(百分比)var topPositions = ['20%', '40%', '60%', '80%']; // 垂直方向的位置var step = (leftEnd - leftStart) / (numWatermarks - 1); // 计算步长for (var i = 0; i < numWatermarks; i++) {var leftPosition = `${leftStart + i * step}%`;var topPosition = topPositions[i % topPositions.length];watermarkHtml += `<div class="watermark" style="top: ${topPosition}; left: ${leftPosition};"><div class="watermark-content"><div> ${this.options.watermark.companyName}</div><div> ${this.options.watermark.name}</div><div> ${this.options.watermark.date}</div></div></div>`;}return this.dom.outerHTML + watermarkHtml;},writeIframe: function (content) {var iframe = document.createElement('iframe');iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";document.body.appendChild(iframe);var doc = iframe.contentDocument || iframe.contentWindow.document;doc.open();doc.write(content);doc.close();this.toPrint(iframe.contentWindow);setTimeout(function () {document.body.removeChild(iframe);}, 100);},toPrint: function (frameWindow) {try {setTimeout(function () {frameWindow.focus();try {if (!frameWindow.document.execCommand('print', false, null)) {frameWindow.print();}} catch (e) {frameWindow.print();}frameWindow.close();}, 10);} catch (err) {console.log('err', err);}}
};const MyPlugin = {};
MyPlugin.install = function (Vue, options) {Vue.prototype.$print = Print;
};export default MyPlugin;

相关文章:

vue中使用print.js实现页面打印并增加水印

1.安装print.js npm install print-js --save2.在main.js文件中引入并注册(我使用的是print.js的源码文件&#xff0c;并且做了一修改&#xff09; //引入 import Print from ./utils/print//注册 Vue.use(Print); //注册3.在页面中使用 <template> <div class&quo…...

计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)

文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…...

简单洗牌算法

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 在学习了ArrayList之后&#xff0c;我们可以通过写一个洗…...

JVM: 堆上的数据存储

文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局&#xff0c;指的是对象在堆中存放时的各个组成部分&#xff0c;主要分为以下几个部分&#xff1a; 1、对象在堆中的…...

AI产品经理的职责与能力:将AI技术转化为实际价值

一、AI产品经理的职责 发现和解决问题&#xff1a;AI产品经理需要具备敏锐的洞察力&#xff0c;能够发现用户需求和痛点&#xff0c;并提出相应的解决方案。传递价值给用户&#xff1a;AI产品经理需要确保产品能够满足用户的需求&#xff0c;提供价值&#xff0c;并提升用户体…...

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测 目录 【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本…...

如何对B站的热门视频进行分析

1. 视频内容分析 主题和类型&#xff1a;确定视频的主题和类型&#xff08;如游戏、教育、生活、科技等&#xff09;&#xff0c;分析其是否符合当前流行趋势或特定兴趣群体。内容创意&#xff1a;评估视频内容的创意性和原创性&#xff0c;是否具有吸引力和独特性。内容质量&…...

MobaXterm tmux 配置妥当

一、事出有因 缘由&#xff1a;接上篇文章&#xff0c;用Docker搭建pwn环境后&#xff0c;用之前学过的多窗口tmux进行调试程序&#xff0c;但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法&#xff0c;最后还是找到了一篇英文文章&#xff0c;解决了&…...

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…...

step:菜单栏静态加载和动态加载

文章目录 文章介绍静态加载动态加载补充材料 文章介绍 对比静态加载和动态加载。 主界面main.qml之前使用的是动态加载&#xff0c;动态加载导致的问题&#xff1a;菜单栏选择界面切换时&#xff0c;之前的界面内容被清空。 修改方法&#xff1a;将动态加载改为静态加载 左边是…...

【简历】武汉某985大学:前端简历指导,拿offer可能性低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份985武汉某大学25届的前端简历&#xff0c;那么985面向的肯定是大厂的层次&#xff0c;但是作为前端简历&#xff0c;学校部分&a…...

推荐系统的核心逻辑 MVP

我们将设计一个基于内容经济的推荐系统&#xff08;Minimum Viable Product, MVP&#xff09;。这个系统将通过收集用户行为数据&#xff0c;计算用户相似度&#xff0c;并生成个性化的推荐结果。推荐系统将包括数据收集、数据存储、数据处理和推荐服务几个关键部分。 MVP功能…...

Java中的BIO,NIO与操作系统IO模型的区分

Java中的IO模型 Java中的BIO&#xff0c;NIO&#xff0c;AIO概念可以是针对输入输出流&#xff0c;文件&#xff0c;和网络编程等其他IO操作的。 但是主要还是在网络编程通信过程中比较重要&#xff0c;因为很多情况网络编程需要它们来提供更好的性能。 所以本篇文章偏向于网络…...

AI砸掉了这些人的饭碗

在一般打工人眼里&#xff0c;金融圈往往被认为是高端脑力工作者的聚集地&#xff0c;他们工资高&#xff0c;学历高&#xff0c;能力强&#xff0c;轻易无法被替代。 可最近&#xff0c;偏偏一个“非人类”的物种&#xff0c;要来抢他们的饭碗。相关报道称&#xff0c;华尔街…...

端口及对应服务

端口是计算机网络中用于区分不同服务的逻辑概念。每个端口号都是一个16位的数字&#xff0c;其取值范围从0到65535。端口号被分为以下几类&#xff1a; 公认端口&#xff08;Well-known ports&#xff09;&#xff1a;范围从0到1023&#xff0c;这些端口通常被分配给常见的服务…...

剑指offer题解合集——Week7day1[滑动窗口的最大值]

滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小&#xff0c;请找出所有滑动窗口里的最大值。 例如&#xff0c;如果输入数组 [2,3,4,2,6,2,5,1] 及滑动窗口的大小 3 &#xff0c;那么一共存在 6 个滑动窗口&#xff0c;它们的最大值分别为 [4,4,6,6,6,5] 注意&am…...

深入解读财报,开启美股投资之旅

投资股票市场&#xff0c;尤其是美股市场&#xff0c;对于许多投资者来说是一项充满挑战的活动。然而&#xff0c;无论投资者是倾向于技术分析还是基本面分析&#xff0c;财报都是他们不可或缺的工具。本文将带领读者深入了解如何通过阅读和分析财报&#xff0c;发现潜在的投资…...

邦芒支招:成功找到工作要掌握的3个知识点

社会进步&#xff0c;企业商业竞争越来越激烈&#xff0c;不管身为一名职场小白或是想调换一下目前的工作的人&#xff0c;都想找到一个称心如意的好工作。拥有以下三点知识点&#xff0c;可以使我们找到工作。 1、迫不得已&#xff0c;别做这件事 拍桌子说“我不开了”的时候有…...

Educational Codeforces Round 168 (Rated for Div. 2)-7.30复盘

A. Strong Password 简单题&#xff0c;找到相同的两个相邻字母之间插一个跟他们不同的大写字母即可 inline void solve(){cin>>s;int id0;char hh ;for(int i1;i<s.size();i){if(s[i-1]s[i]){idi;break;}} for(int i0;i<26;i){if(s[id]!ai&&s[id1]!ai) …...

Web开发:小结Apache Echarts官网上常用的配置项(前端可视化图表)

目录 一、须知 二、Title 三、 Legend 四、Grid 一、须知 配置项官方文档&#xff1a;点此进入。 我总结了比较常用的功能&#xff0c;写进注释里面&#xff0c;附带链接分享和效果图展示。&#xff08;更新中....&#xff09; 二、Title option {title: {text: Weekl…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...