设置页面的水印,往页面中插入你想要的水印内容

页面水印插件实现:JavaScript代码详解
本文详细解释了如何使用JavaScript创建一个可自定义内容和位置的动态水印功能,涉及canvas元素、DOM操作及如何在主文件中导入和全局使用。

1、整体引用的代码

"use strict";

const watermark = {};

/**
 *
 * @param {要设置的水印的内容} str
 * @param {需要设置水印的容器} container
 */
// 禁止复制文本 111111111111
document.onselectstart = function () {
  return false;
};
const setWatermark = (str, container) => {
  const id = "1.23452384164.123412415";

  if (container === undefined) {
    return;
  }
  // 查看页面上有没有,如果有则删除
  if (document.getElementById(id) !== null) {
    const childelement = document.getElementById(id);
    childelement.parentNode.removeChild(childelement);
  }

  var containerWidth = container.offsetWidth; // 获取父容器宽
  var containerHeight = container.offsetHeight; // 获取父容器高
  container.style.position = "relative"; // 设置布局为相对布局
  // 创建canvas元素(先制作一块背景图)
  const can = document.createElement("canvas");
  can.width = 450; // 设置每一块的宽度
  can.height = 150; // 高度
  const cans = can.getContext("2d"); // 获取canvas画布
  cans.rotate((-20 * Math.PI) / 180); // 逆时针旋转π/9
  cans.font = "20px Vedana"; // 设置字体
  cans.fillStyle = "rgba(200, 200, 200, 0.4)"; // 设置字体的颜色
  cans.textAlign = "left"; // 文本对齐方式
  cans.textBaseline = "Middle"; // 文本基线
  cans.fillText(str, 0, (4 * can.height) / 5); // 绘制文字

  // 创建一个div元素
  const div = document.createElement("div");
  div.id = id; // 设置id
  div.style.pointerEvents = "none"; // 取消所有事件
  div.style.top = "0px";
  div.style.left = "0px";
  // div.style.opacity=0.5    //调节字体颜色的深浅
  div.style.position = "absolute";
  div.style.zIndex = "100000";
  div.style.width = containerWidth + "px";
  div.style.height = containerHeight + "px";
  div.style.background =
    "url(" + can.toDataURL("image/png") + ") left top repeat";
  container.appendChild(div); // 追加到页面

  return id;
};

// 该方法只允许调用一次
watermark.set = (str, container) => {
  let id = setWatermark(str, container);
  setInterval(() => {
    if (document.getElementById(id) === null) {
      id = setWatermark(str, container);
    }
  }, 500);
  // 监听页面大小的变化
  window.onresize = () => {
    setWatermark(str, container);
  };
};

export default watermark;

2、在项目的main.js文件引入和全局引用

3、在你想要引用的页面中写以下的代码

括号第一个是要加入的水印的内容,第二个是绑定id的容器,就是你要放的位置

  this.$watermark.set(this.$store.state.user.roles[0], this.$refs.all);

4、案例图:

 

<think>我们注意到用户的问题:如何将水印设置页面内容的上层?并且用户希望使用draftwatermark包来实现。 但是,根据之前的知识,draftwatermark包默认将水印放置在页面背景上(即内容下层)。要将其置于上层,我们需要调整其绘制层级。 然而,draftwatermark包本身没有提供直接设置水印内容上层的选项。因此,我们需要换一种方法。 回顾之前提供的方法二(使用eso-pic包),我们可以通过调整水印的绘制顺序和z-index来将其置于上层。但是,在LaTeX中,我们通常使用TikZ等图形库来绘制上层内容,但水印通常作为背景。 不过,我们可以尝试使用`background`包,它提供了更灵活的背景设置,并且可以设置背景在内容之上(通过`placement=top`选项)。但是,请注意,水印通常设计为在内容下层以免干扰阅读,置于上层可能会遮挡文字。 下面提供一个使用`background`包将水印置于内容上层的示例: ```latex \documentclass{article} \usepackage[pages=some]{background} % 使用background包 \usepackage{tikz} % 用于绘制水印 % 设置水印内容 \backgroundsetup{ scale=1, % 缩放 angle=45, % 旋转角度 opacity=0.2, % 透明度 color=black, % 颜色 contents={% \includegraphics[width=0.5\textwidth]{example-image}% 图片水印 % 或者使用文字水印: % \tikz \node[rotate=45,font=\Huge] {Confidential};% }, placement=top, % 关键:将水印放在内容上层 position=current page.center, % 位置 vshift=0cm, hshift=0cm } \begin{document} 文档内容... % 在需要水印页面使用\BgThispage命令 \BgThispage \end{document} ``` 但是,请注意: 1. `placement=top`选项将水印放在内容上方(上层),`placement=bottom`(默认)则放在下层。 2. 由于水印在上层,可能会遮挡文字,因此建议设置较低的透明度(如0.1~0.3)。 3. 该包需要至少两次编译。 如果用户坚持要使用`draftwatermark`包,那么很遗憾,它不支持将水印放在上层。因此,我们建议使用`background`包或之前提到的`eso-pic`包(通过调整绘制顺序,但eso-pic默认也是背景下层,要放在上层需要一些技巧,例如使用`\AddToShipoutPictureFG`而不是`\AddToShipoutPictureBG`,但eso-pic包中`\AddToShipoutPictureFG`是用于前景的,即内容上层)。 使用`eso-pic`包将水印放在上层的示例: ```latex \documentclass{article} \usepackage{eso-pic} \usepackage{graphicx} \usepackage{xcolor} % 添加水印到前景(上层) \AddToShipoutPictureFG{% \AtPageCenter{% \makebox[0pt]{\textcolor{blue!20}{\rotatebox{45}{\fontsize{3cm}{3cm}\selectfont{DRAFT}}}% }% } \begin{document} 文档内容... \end{document} ``` 注意:这里使用了`\AddToShipoutPictureFG`(FG表示foreground,前景),这样水印就会绘制在内容的上层。 因此,总结两种方法: 1. 使用`background`包,并设置`placement=top`。 2. 使用`eso-pic`包,并调用`\AddToShipoutPictureFG`。 根据用户的需求(使用draftwatermark包)我们无法实现上层水印,所以建议使用上述两种替代方法。 由于用户之前可能已经尝试过draftwatermark,现在需要调整到上层,我们推荐使用eso-pic的FG方法,因为它更直接。 因此,我们给出一个完整的例子,使用eso-pic将文字水印放在上层: ```latex \documentclass{article} \usepackage{eso-pic} \usepackage{graphicx} \usepackage{xcolor} % 设置水印(前景) \AddToShipoutPictureFG{% \AtPageLowerLeft{% \put(0,\LenToUnit{0.5\paperheight}){% 放在页面左边中间位置 \begin{minipage}{\paperwidth}% \centering \textcolor{red!20}{\rotatebox{45}{\fontsize{3cm}{3cm}\selectfont{CONFIDENTIAL}}% \end{minipage}% }% }% } % 或者更简单的方式:在页面中心放置一个旋转的水印 % \AddToShipoutPictureFG{% % \AtPageCenter{% % \makebox[0pt]{\textcolor{blue!20}{\rotatebox{45}{\fontsize{3cm}{3cm}\selectfont{DRAFT}}}% % }% % } \begin{document} 这里是文档内容水印会覆盖在文字上方,但因为是半透明的,所以文字仍然可见。 \end{document} ``` 重要提示:水印放在上层可能会影响阅读,请谨慎调整透明度和位置。 如果用户需要图片水印,可以使用: ```latex \AddToShipoutPictureFG{% \AtPageCenter{% \makebox[0pt]{\includegraphics[width=0.8\paperwidth,opacity=0.1]{watermark-image}}% }% } ``` 最后,我们强调:编译两次以查看效果。 相关问题: 1. 如何调整水印的透明度以避免遮挡文字? 2. 如何为特定页面添加水印? 3. 如何创建自定义形状的水印(如公司Logo)?</think>要使用 `draftwatermark` 包将水印设置页面内容的上层(覆盖在文本上方),需要通过修改源码或结合其他包实现,因为该包默认将水印置于背景层。以下是两种解决方案: ### 方法一:修改 `draftwatermark` 源码(推荐) 在文档导言区重写水印绘制命令,强制水印绘制在前景层: ```latex \documentclass{article} \usepackage{draftwatermark} \usepackage{eso-pic} % 关键:重写水印绘制层 % 重写水印绘制命令(置于前景层) \makeatletter \renewcommand\DWM@shipout{% \AddToShipoutPictureFG*{\DWM@watermark} % 修改BG为FG(前景层) } \makeatother % 设置水印参数 \SetWatermarkText{Confidential} \SetWatermarkScale{5} \SetWatermarkAngle{45} \SetWatermarkColor[gray]{0.5} % 适当降低透明度确保文字可见 \begin{document} 文档内容...(水印将覆盖在文字上方) \end{document} ``` **核心修改说明**: 1. `\AddToShipoutPictureBG` → `\AddToShipoutPictureFG`:将水印从背景层移至前景层[^1] 2. `*` 参数:确保水印应用到所有页面 3. 调整透明度(`0.5`):避免完全遮挡文字 --- ### 方法二:结合 `tcolorbox` 创建浮动水印层 通过透明浮动层覆盖在内容上方: ```latex \documentclass{article} \usepackage{tcolorbox} \usepackage{lipsum} % 示例文本 % 创建全局水印层 \newtcolorbox{watermarkoverlay}{ blanker, breakable, enhanced, overlay={ \node[rotate=45,scale=10,text=gray!30,opacity=0.7] at (current page.center) {Confidential}; % 水印内容 }, before=\begin{tcolorbox}, % 在页面开始前插入 after=\end{tcolorbox} % 在页面结束后结束 } \begin{document} \begin{watermarkoverlay} % 激活水印层 \lipsum[1-10] % 文档内容水印覆盖在文字上) \end{watermarkoverlay} \end{document} ``` **参数说明**: - `rotate=45`:旋转角度 - `scale=10`:缩放比例 - `text=gray!30`:颜色+透明度 - `at (current page.center)`:居中位置 --- ### 效果对比 | **特性** | 默认 `draftwatermark` | 修改后方案 | |------------------|----------------------|-------------------| | 水印位置 | 背景层 | **内容上层** | | 文字遮挡 | 无 | **可控半透明遮挡**| | 多页支持 | 自动 | 自动 | | 编译要求 | 2次编译 | 2次编译 | > ⚠️ **注意事项**: > 1. 上层水印会遮挡部分文字,建议设置透明度 >0.5(如 `gray!30`) > 2. 若需动态水印(如页码),在 `\node[...]` 中添加 `\thepage` 等命令 > 3. 复杂布局文档需调整 `scale` 参数避免边缘裁剪 --- ### 替代方案:使用 `tikz` 直接绘制上层水印 ```latex \usepackage{tikz} \usetikzlibrary{calc} % 每页添加上层水印 \AddToHook{shipout/background}{ \put(0,0){% \begin{tikzpicture}[remember picture,overlay] \node[rotate=45,scale=8,text=black!15] at (current page.center) {TOP SECRET}; \end{tikzpicture}% } } ``` 此方法直接操作页面绘制层,无需额外包修改[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值