为什么OA系统要加上名字工号的水印?web前端实现添加水印

1,153 阅读1分钟

你的OA系统也是带名字工号水印的吗?web前端实现添加水印

需求场景描述

在一些文件、网页,我们的OA系统中,经常可以看到界面是携带水印的,而且通常水印的内容是工号加名字。水印的内容通常有一个特点,就是不能太显眼,这是为了避免影响读者正常阅读。而像OA系统这样的水印内容是名字加工号的,通常是为了防泄漏(一定程度上),以及泄露后可以通过水印信息快速追查泄露人。

而像一些文档文件带上水印可能是为了打广告和防抄袭。

而像软件,比如一些视频编辑导出软件,水印功能可能被用来迫使用户购买会员,不开会员带水印,相当于帮他们打广告,开会员可去水印,相当于消费取消水印。

仔细一想,不,是回忆,水印功能还是挺常见的,而且被用于各种目的。

实现水印功能思路分析

  1. 利用canvas创建水印载体画布,并利用旋转等特性制作合适的角度。
  2. 创建 body 下的 div 元素,并利用 canvas 导出 base64 png有透明度图片,作为背景图。
  3. 设置该 div 元素的宽高为页面的100%,使用固定定位并设置元素层级z-index为99999,利用背景图repeat属性重复铺满全屏。

完整示例Demo代码

1.demo效果图如下

image.png

2.代码部分如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>web前端实现水印 Demo</title>
</head>
<body>
<h1 style="text-align: center">水印测试</h1>
<script>
  window.onload = function() {
    initWatermark("张某三");
  };

  // 初始化水印,str:水印内容,例如“张三”
  function initWatermark(str) {
    setWatermark(str);

    // 试图窗口大小被调整的时候,重新设置水印
    window.onresize = function() {
      setWatermark(str);
    };
  }

  function setWatermark(str) {
    // 创建canvas元素,并设置相应的属性
    let can = document.createElement("canvas");
    let context = can.getContext("2d");
    can.width = 150;
    can.height = 120;
    context.rotate(-20 * Math.PI / 180);
    context.font = "15px Microsoft YaHei";
    context.fillStyle = "rgba(0, 0, 0, 0.10)";
    context.textAlign = "center"; // 文字居中方式
    context.fillText(str, can.width / 20, can.height);
    // 另一行水印
    // context.fillText('测试水印', can.width / 20, can.height - 20)

    // 创建body下的div元素,使用固定定位,将canvas所谓背景图并铺满全屏
    let node = document.createElement("div");
    node.style.pointerEvents = "none";
    // 设置元素固定定位,并将宽高设置为100%,铺满全屏
    node.style.position = "fixed";
    node.style.width = "100%";
    node.style.height = "100%";
    node.style.top = "3px";
    node.style.left = "0px";
    node.style.zIndex = "99999";
    // 将canvas作为背景图,并设置左上开始,重复铺满全屏
    node.style.background = "url(" + can.toDataURL("image/png") + ") left top repeat";
    // 将创建的元素插入body中,作为body的子元素
    document.body.appendChild(node);
  }
</script>
</body>
</html>