思源笔记编辑器区域水印 JS 代码块分享

前言

鉴于之前使用过的腾讯文档支持文档水印,后来使用思源笔记,在上课展示文档的时候,习惯性会给弄上水印,思源笔记本身似乎不支持直接在编辑器区域添加水印,故自己写了个 JS 代码片段。

iShot2024072918.02.42.png

代码片段

提醒:水印文本比较多的时候,改一下水印的宽度高度即 watermarkWidth、watermarkHeight,否则水印展示不全。

JS 代码片段:

let watermarkContent = "多仔ヾ";
let watermarkWidth = 120;
let watermarkHeight = 70;

let canvas = document.createElement("canvas");
let ctx = canvas.getContext('2d');
canvas.width = watermarkWidth;
canvas.height = watermarkHeight;
ctx.font = "14px Arial";
ctx.fillStyle = "rgba(211, 211, 211, .3)";
ctx.rotate((-25 * Math.PI) / 180);
ctx.fillText(watermarkContent, 0, canvas.height/2);

let watermarkDataURL = canvas.toDataURL('image/png');
const defaultStyle = document.createElement('style');
defaultStyle.innerHTML = `.protyle::before {
    content: '';
    display: block;
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    background-image: url(${watermarkDataURL});
    background-repeat: repeat;
    pointer-events: none;
    z-index: 10;
}`;
document.head.appendChild(defaultStyle);

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    21208 引用 • 83583 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 我让 GPT 改了一下,可以适应更长的文本:

    //编辑器区域水印 JS片段 https://ld246.com/article/1722247445881
    let watermarkContent = "JeffreyChen"; // 设置水印内容
    let watermarkWidth = 120; // 定义水印画布的宽度
    let watermarkHeight = 70; // 定义水印画布的高度
    
    // 创建一个新的canvas元素,用于绘制水印
    let canvas = document.createElement("canvas");
    let ctx = canvas.getContext('2d'); // 获取canvas的2D渲染上下文
    
    // 计算旋转角度
    const angle = (-25 * Math.PI) / 180; // 旋转角度转换为弧度
    
    // 保存初始状态
    ctx.save();
    
    // 计算文本的宽度和高度
    ctx.font = "18px Arial"; // 设置字体样式,确保与填充文本一致
    const textWidth = ctx.measureText(watermarkContent).width; // 计算文本宽度
    const textHeight = 18; // 字体大小就是文本的高度
    
    // 设置canvas的大小,考虑到旋转后的文本位置
    canvas.width = Math.max(watermarkWidth, textHeight * Math.abs(Math.sin(angle)) + textWidth * Math.abs(Math.cos(angle)));
    canvas.height = Math.max(watermarkHeight, textHeight * Math.abs(Math.cos(angle)) + textWidth * Math.abs(Math.sin(angle)));
    
    // 清空canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 移动Canvas的原点到中心
    ctx.translate(canvas.width / 2, canvas.height / 2);
    
    // 旋转canvas中的文本
    ctx.rotate(angle); // 执行旋转操作
    
    // 设置填充颜色
    ctx.fillStyle = "rgba(211, 211, 211, .3)"; // 设置填充颜色为浅灰色,并设置其透明度
    
    // 在canvas的指定位置绘制水印文本
    ctx.fillText(watermarkContent, -textWidth / 2, textHeight / 2); // 使文本中心对齐
    
    // 恢复canvas原始状态
    ctx.restore();
    
    // 将canvas内容转为data URL格式的图片
    let watermarkDataURL = canvas.toDataURL('image/png');
    
    // 创建一个style标签用于定义水印样式
    const defaultStyle = document.createElement('style');
    defaultStyle.innerHTML = `
    .protyle::before {
        content: ''; /* 创建一个空的伪元素 */
        display: block; /* 将伪元素设为块级元素 */
        position: absolute; /* 绝对定位,使其覆盖在目标元素上 */
        top: 0; /* 伪元素的上边距设置为0 */
        left: 0; /* 伪元素的左边距设置为0 */
        height: 100%; /* 伪元素的高度设置为100%,覆盖整个目标元素 */
        width: 100%; /* 伪元素的宽度设置为100%,覆盖整个目标元素 */
        background-image: url(${watermarkDataURL}); /* 设置背景图片为之前生成的水印图像 */
        background-repeat: repeat; /* 背景图像重复,形成密集的水印效果 */
        pointer-events: none; /* 禁用伪元素的鼠标事件,确保底层元素可以接收事件 */
        z-index: 2; /* 设置z-index,使其在堆叠上下文中显示在其他元素之上 */
    }`;
    
    // 将样式标签添加到文档的<head>部分
    document.head.appendChild(defaultStyle);
    
    1 回复
  • 其他回帖
  • visduo

    秀,哈哈

  • 优秀

  • LazyXP

    技术贴,比较好评。

推荐标签 标签

  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 535 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 499 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 315 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 1 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 9 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 341 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    540 引用 • 672 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 31 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 531 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 15 关注
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 622 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 465 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 65 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 469 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 49 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    490 引用 • 914 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7551 引用 • 34367 回帖 • 198 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 721 关注
  • 安全

    安全永远都不是一个小问题。

    200 引用 • 816 回帖