pdfjs 插件进行 自定义 遮罩 打印

pdfjs插件进行自定义遮罩 打印


效果展示

在这里插入图片描述

思路

pdfjs插件 每一张pdf都会生成一个canvas   在每个canvas的父级div添加事件    拖拽形成遮罩
(viewer.js  11981行左右  draw()方法 加入监听)

现在 在pdf上拖拽是有遮罩 但是打印的时候是没有的 

需在打印的方法里吧把遮罩的div 用canvas在画到pdf 上 
(viewer.js 15122行左右 useRenderedPage() 方法遮罩画到pdf上) 然后打印

遮罩的位置和大小 和 实际打印时是不一样的 会被缩放   
scratchCanvas.width / 实际宽度 = 遮罩的父级的width / 页面上遮罩的width

画的方法

文件 web/viewer.js
调用位置
  canvasWrapper.classList.add("canvasWrapper");(自行搜索这行位置)
  this.canDraw(canvasWrapper);
画遮罩层
        canDraw(parentNode) {
          let start_x = 0;
          let start_y = 0;
          let move_x = 0;
          let move_y = 0;
          let space = 2;
          parentNode.onmousedown = (e) => {
            let div = document.createElement("div")
            div.classList = "shadowDOM"
            e.stopPropagation();
            e.preventDefault();
            parentNode.appendChild(div);
            start_x = e.offsetX
            start_y = e.offsetY
            parentNode.onmousemove = (_e) => {
              _e.stopPropagation();
              _e.preventDefault();
              move_x = _e.offsetX
              move_y = _e.offsetY
              if (move_x > start_x) {
                div.style.left = start_x - space + "px"
                div.style.width = move_x - start_x - space + "px"
              } else {
                div.style.left = move_x - space + "px"
                div.style.width = start_x - move_x - space + "px"
              }
              if (move_y > start_y) {
                div.style.top = start_y - space + "px"
                div.style.height = move_y - start_y - space + "px"
              } else {
                div.style.top = move_y - space + "px"
                div.style.height = start_y - move_y - space + "px"
              }
            }
            parentNode.onmouseup = (__e) => {
              if (div.style.width == "" || div.style.height == "") {
                div.remove();
              } else {
                let del = document.createElement("div")
                del.classList = "delDOM"
                div.appendChild(del);
                this.del_dom(div, del)
              }
              parentNode.onmousemove = null;
            }
          }
        }

打印方法

文件 web/viewer.js
     重写原本的方法 自行搜索useRenderedPage()方法替换
        useRenderedPage() {
          this.throwIfInactive();
          const img = document.createElement("img");
          const scratchCanvas = this.scratchCanvas;

          let parentNode = document.querySelectorAll("#viewer")[0];
          let nodelist = parentNode.children[index++].querySelectorAll(".shadowDOM")
          if (nodelist.length != 0) {
            this.addW(nodelist, scratchCanvas)
          }

          if ("toBlob" in scratchCanvas && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
            scratchCanvas.toBlob(function (blob) {
              img.src = URL.createObjectURL(blob);
            });
          } else {
            img.src = scratchCanvas.toDataURL();
          }

          const wrapper = document.createElement("div");
          wrapper.className = "printedPage";
          wrapper.appendChild(img);
          this.printContainer.appendChild(wrapper);
          return new Promise(function (resolve, reject) {
            img.onload = resolve;
            img.onerror = reject;
          });
        },
        计算位置方法
        addW(nodelist, scratchCanvas) {
          let ctxx = scratchCanvas.getContext("2d");
          ctxx.fillStyle = "#ffffff";
          let c_w = scratchCanvas.width;
          let c_h = scratchCanvas.height;

          let p_w = 0
          let p_h = 0

          for (let i = 0; i < nodelist.length; i++) {
            p_w = parseInt(nodelist[i].parentElement.style.width.split("px")[0])
            p_h = parseInt(nodelist[i].parentElement.style.height.split("px")[0])

            ctxx.fillRect(
              c_w / p_w * parseInt(nodelist[i].style.left.split("px")[0]),
              c_h / p_h * parseInt(nodelist[i].style.top.split("px")[0]),
              c_w / p_w * parseInt(nodelist[i].style.width.split("px")[0]),
              c_h / p_h * parseInt(nodelist[i].style.height.split("px")[0]),
            )
          }
        },

样式部分

自行加入viewer.html
 .canvasWrapper {
      position: relative;
      z-index: 999;
    }

    .shadowDOM {
      position: absolute;
      border: 1px dashed #0099FF;
      background-color: #C3D5ED;
      z-index: 1000;
      opacity: 0.6;
    }

    .delDOM {
      position: absolute;
      top: 4px;
      right: 1px;
      cursor: pointer;
      height: 10px;
      width: 10px;
      z-index: 99;

    }

    .delDOM::after {
      position: absolute;
      content: "";
      top: 0;
      right: 0;
      height: 2px;
      width: 10px;
      background-color: red;
      transform: rotate(45deg);
    }

    .delDOM::before {
      position: absolute;
      content: "";
      top: 0;
      right: 0;
      height: 2px;
      width: 10px;
      background-color: red;
      transform: rotate(-45deg);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
FairyGUI 是一款强大的 UI 编辑器和 UI 框架,其中的遮罩功能可以让我们在 UI 中实现一些非常有趣的效果。在 FairyGUI 中,我们可以使用自定义图形作为遮罩,这篇文章将会介绍如何实现自定义遮罩。 1. 创建自定义遮罩 首先,在 FairyGUI 编辑器中创建一个 UI 节点,并将其属性中的 Mask Type 设置为 Image,这将使该节点成为一个遮罩层。然后,为该节点添加一个 Image 组件,并将其作为遮罩的图像。 接下来,我们需要编写脚本来指定遮罩的形状。我们可以创建一个自定义脚本,继承自 FairyGUI 的 IMask 接口,并实现其中的一个方法:OnPopulateMesh。在这个方法中,我们需要创建一个 Mesh 对象,并设置其顶点和三角形,以定义遮罩的形状。 下面是一个简单的例子: ```csharp using UnityEngine; using FairyGUI; public class CustomMask : MonoBehaviour, IMask { public void OnPopulateMesh(VertexHelper vertexHelper) { Mesh mesh = new Mesh(); Vector3[] vertices = new Vector3[4]; int[] triangles = new int[6]; float width = 200f; float height = 100f; vertices[0] = new Vector3(0f, 0f); vertices[1] = new Vector3(0f, height); vertices[2] = new Vector3(width, height); vertices[3] = new Vector3(width, 0f); triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; triangles[3] = 0; triangles[4] = 2; triangles[5] = 3; mesh.vertices = vertices; mesh.triangles = triangles; vertexHelper.AddUIVertexStream(new List<UIVertex>(), mesh); } } ``` 在这个例子中,我们创建了一个矩形的遮罩,并将其顶点和三角形添加到了 Mesh 对象中。然后,我们使用 VertexHelper 对象将这个 Mesh 对象传递给遮罩层,以便在 UI 中显示出来。 2. 将自定义脚本添加遮罩层 在脚本编写完成后,我们需要将其添加遮罩层中。在 FairyGUI 编辑器中,我们可以选择遮罩层节点,并在属性中的 Mask 中选择 Custom Mask。然后,在 Custom Mask 中选择我们刚才编写的自定义脚本。 3. 测试效果 现在,我们可以在场景中测试我们的自定义遮罩了。我们可以在遮罩层的子节点中添加一些 UI 元素,并在运行时观察遮罩的效果。如果一切正常,我们应该能够看到 UI 元素被遮罩的效果。 总结 FairyGUI 的自定义遮罩功能非常强大,可以让我们在 UI 中实现各种有趣的效果。通过编写自定义脚本,我们可以创建各种形状的遮罩,并将其应用到 UI 中。希望这篇文章能够帮助你理解 FairyGUI 的自定义遮罩功能,以及如何使用它来实现自己的 UI 效果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值