@acrodata/watermark
Version:
Add watermark to your page
1 lines • 30.1 kB
Source Map (JSON)
{"version":3,"file":"acrodata-watermark.mjs","sources":["../../../projects/watermark/src/lib/utils.ts","../../../projects/watermark/src/lib/watermark.ts","../../../projects/watermark/src/lib/watermark.directive.ts","../../../projects/watermark/src/public-api.ts","../../../projects/watermark/src/acrodata-watermark.ts"],"sourcesContent":["import { WatermarkOptions, DrawPatternResult } from './types';\n\n/** 用于标记是否需要保护 */\nexport const attributeNameTag = 'data-watermark-tag';\n\nexport const observeOptions = {\n childList: true,\n subtree: true,\n attributeFilter: ['style', 'class', attributeNameTag],\n};\n\n/** 获取 DataSetKey */\nexport function getDataSetKey(attributeName: string) {\n return attributeName\n .split('-')\n .slice(1)\n .reduce((prev, cur, index) => {\n if (index === 0) {\n return cur;\n }\n\n return `${prev}${cur[0].toUpperCase() + cur.slice(1)}`;\n });\n}\n\n/** 将样式对象转换为字符串 */\nexport const getStyleStr = (style: Record<string, string | number>) => {\n let str = '';\n\n Object.keys(style).forEach(key => {\n const k = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n if (style[key] !== '' && style[key] != null) {\n str += `${k}:${style[key]};`;\n }\n });\n\n return str;\n};\n\n/** 创建随机 ID */\nexport const getRandomId = (prefix = '') => {\n const uid = window.btoa(decodeURI(encodeURIComponent(prefix)));\n return `${uid}-${new Date().getTime()}-${Math.floor(Math.random() * Math.pow(10, 8))}`;\n};\n\n/** 获取水印挂载节点 */\nexport const getContainer = (container: WatermarkOptions['container']) => {\n let dom: HTMLElement | null;\n\n if (typeof container === 'string') {\n dom = document.querySelector(container);\n if (!dom) {\n throw new Error(`The watermark container element '${container}' not found!`);\n }\n } else {\n dom = container ?? document.body;\n }\n\n return dom;\n};\n\n/** 盲水印解密 */\nexport const decrypt = (ctx: CanvasRenderingContext2D) => {\n const originalData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);\n const data = originalData.data;\n for (let i = 0; i < data.length; i++) {\n // 筛选每个像素点的R值\n if (i % 4 == 0) {\n if (data[i] % 2 == 0) {\n // 如果 R 值为偶数,说明这个点是没有水印信息的,将其 R 值设为0\n data[i] = 0;\n } else {\n // 如果 R 值为奇数,说明这个点是有水印信息的,将其 R 值设为255\n data[i] = 255;\n }\n } else if (i % 4 == 3) {\n // 透明度不作处理\n continue;\n } else {\n // G、B 值设置为 0,不影响\n data[i] = 0;\n }\n }\n // 至此,带有水印信息的点都将展示为 `255,0,0`,而没有水印信息的点将展示为 `0,0,0`,将结果绘制到画布\n ctx.putImageData(originalData, 0, 0);\n};\n\nexport const createHost = (watermarkTag: string) => {\n const dom = document.createElement('div');\n // 可以隐藏元素的 CSS 属性\n const hiddenCSS = {\n 'display': 'block !important',\n 'position': 'static !important',\n 'opacity': '1 !important',\n 'visibility': 'visible !important',\n 'transform': 'none !important',\n 'clip-path': 'none !important',\n };\n dom.setAttribute('style', getStyleStr(hiddenCSS));\n dom.setAttribute(attributeNameTag, watermarkTag);\n return dom;\n};\n\nexport function getDrawPattern(opts: WatermarkOptions): Promise<DrawPatternResult> {\n const {\n text,\n gapX,\n gapY,\n offsetY,\n offsetX,\n width,\n height,\n rotate,\n opacity,\n fontSize,\n fontStyle,\n fontVariant,\n fontWeight,\n fontFamily,\n fontColor,\n textAlign,\n textBaseline,\n image,\n blindText,\n blindFontSize,\n blindOpacity,\n } = opts as Required<WatermarkOptions>;\n return new Promise((resolve, reject) => {\n const canvas = document.createElement('canvas');\n\n const ctx = canvas.getContext('2d');\n const ratio = 1;\n\n const canvasWidth = (Number(gapX) + Number(width)) * ratio;\n const canvasHeight = (Number(gapY) + Number(height)) * ratio;\n const canvasOffsetLeft = Number(offsetX) || Number(gapX) / 2;\n const canvasOffsetTop = Number(offsetY) || Number(gapY) / 2;\n\n canvas.setAttribute('width', `${canvasWidth}px`);\n canvas.setAttribute('height', `${canvasHeight}px`);\n\n if (ctx) {\n const markWidth = width * ratio;\n const markHeight = height * ratio;\n\n // 1. 根据元素中心点旋转\n ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio);\n ctx.translate(markWidth / 2, markHeight / 2); // 1\n ctx.rotate((Math.PI / 180) * Number(rotate));\n ctx.translate(-markWidth / 2, -markHeight / 2); // 1\n\n // 是否需要增加盲水印文字\n if (blindText) {\n // 盲水印需要低透明度\n ctx.globalAlpha = blindOpacity;\n ctx.font = `${blindFontSize}px normal`;\n ctx.fillText(blindText, 0, 0);\n }\n\n // 设置透明度\n ctx.globalAlpha = opacity;\n\n // 优先使用图片\n if (image) {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.referrerPolicy = 'no-referrer';\n img.src = image;\n img.onload = () => {\n ctx.drawImage(img, 0, 0, markWidth, markHeight);\n resolve({\n url: ctx.canvas.toDataURL(),\n width: canvasWidth,\n height: canvasHeight,\n });\n };\n return;\n }\n\n // 获取文本的最大宽度\n const texts = typeof text === 'string' ? text.split('\\n') : text;\n const widths = texts.map(item => ctx.measureText(item).width);\n const maxWidth = Math.max(...widths);\n\n const markSize = Number(fontSize) * ratio;\n\n // 设置文本对齐方式\n ctx.textAlign = textAlign;\n // 设置文本位置\n ctx.textBaseline = textBaseline;\n // 设置字体颜色\n ctx.fillStyle = fontColor;\n // 设置字体\n ctx.font = getFont(`${markSize}px`);\n\n // 文案宽度大于画板宽度\n if (maxWidth > width) {\n ctx.font = getFont(`${markSize / 2}px`);\n }\n\n // 多行文本的上下间距\n const textGap = 4;\n\n // 获取行高\n const lineHeight = markSize;\n\n // 计算水印在 y 轴上的初始位置\n let initY = (markHeight - (fontSize + 4) * texts.length - textGap * (texts.length - 1)) / 2;\n initY = initY < 0 ? 0 : initY;\n\n for (let i = 0; i < texts.length; i++) {\n ctx.fillText(texts[i] || '', markWidth / 2, initY + lineHeight * (i + 1) + textGap * i);\n }\n resolve({\n url: ctx.canvas.toDataURL(),\n width: canvasWidth,\n height: canvasHeight,\n });\n }\n\n function getFont(fontSize: string) {\n return `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize} ${fontFamily}`;\n }\n\n return reject();\n });\n}\n","import { WatermarkOptions } from './types';\nimport {\n attributeNameTag,\n createHost,\n decrypt,\n getContainer,\n getDataSetKey,\n getDrawPattern,\n getRandomId,\n getStyleStr,\n observeOptions,\n} from './utils';\n\nexport const defaultOptions: WatermarkOptions = {\n gapX: 100,\n gapY: 100,\n offsetX: 0,\n offsetY: 0,\n width: 120,\n height: 60,\n opacity: 0.15,\n rotate: -24,\n fontSize: 16,\n fontWeight: '400',\n fontStyle: 'normal',\n fontVariant: 'normal',\n fontColor: '#000',\n fontFamily: 'sans-serif',\n textAlign: 'center',\n textBaseline: 'alphabetic',\n secure: true,\n blindFontSize: 16,\n blindOpacity: 0.005,\n repeat: 'multiply',\n zIndex: 9999,\n};\n\nexport class Watermark {\n /** 水印配置 */\n private options: WatermarkOptions = {};\n /** 水印挂载容器 */\n private container?: HTMLElement;\n /** 水印的宿主节点 */\n private watermarkHost?: HTMLElement;\n /** 水印节点 */\n private watermarkDom?: HTMLElement;\n /** 水印样式 */\n private style: Record<string, string | number> = {\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n };\n private watermarkTag = getRandomId('watermark');\n private shadowRoot?: ShadowRoot | HTMLElement;\n private mutationObserver: MutationObserver | null = null;\n\n constructor(options: WatermarkOptions = {}) {\n this.options = Object.assign({}, defaultOptions, options);\n\n this._render();\n }\n\n static decrypt = decrypt;\n\n update(options: WatermarkOptions = {}) {\n this.options = {\n ...this.options,\n ...options,\n };\n\n this._render();\n }\n\n show() {\n if (this.watermarkDom) {\n this.style['display'] = 'block';\n this.watermarkDom.setAttribute('style', getStyleStr(this.style));\n }\n }\n\n hide() {\n if (this.watermarkDom) {\n this.style['display'] = 'none';\n this.watermarkDom.setAttribute('style', getStyleStr(this.style));\n }\n }\n\n destroy() {\n this.shadowRoot = undefined;\n\n if (this.watermarkHost) {\n this.watermarkHost.remove();\n this.watermarkHost = undefined;\n }\n\n if (this.watermarkDom) {\n this.watermarkDom.remove();\n this.watermarkDom = undefined;\n }\n\n this._destroyMutationObserver();\n }\n\n _shouldRerender = (mutation: MutationRecord) => {\n // 修改样式或属性\n if (mutation.type === 'attributes') {\n if (mutation.attributeName === attributeNameTag) {\n return true;\n }\n if (this.watermarkTag === this._getNodeRandomId(mutation.target)) {\n return true;\n }\n }\n\n // 删除节点\n if (\n mutation.removedNodes.length &&\n this.watermarkTag === this._getNodeRandomId(mutation.removedNodes[0])\n ) {\n return true;\n }\n\n return false;\n };\n\n _getNodeRandomId = (node: Node) => {\n return (node as HTMLElement)?.dataset?.[getDataSetKey(attributeNameTag)];\n };\n\n _destroyMutationObserver = () => {\n if (this.mutationObserver) {\n this.mutationObserver.takeRecords();\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n };\n\n _getWatermarkDom = async () => {\n if (!this.watermarkDom) {\n this.watermarkDom = document.createElement('div');\n }\n\n const bgConfig = await getDrawPattern(this.options);\n\n if (bgConfig?.url) {\n const bgImg = bgConfig.url;\n\n this.style['zIndex'] = this.options.zIndex!;\n\n if (this.options.repeat === 'multiply') {\n this.style['backgroundImage'] = `url(${bgImg}), url(${bgImg})`;\n this.style['backgroundRepeat'] = 'repeat';\n this.style['backgroundPosition'] = `${bgConfig.width / 2}px ${bgConfig.height / 2}px, 0 0`;\n } else {\n this.style['backgroundImage'] = `url(${bgImg})`;\n this.style['backgroundRepeat'] = 'repeat';\n this.style['backgroundPosition'] = '';\n\n if (this.options.repeat === 'none') {\n this.style['backgroundRepeat'] = 'no-repeat';\n this.style['backgroundPosition'] = this.options.position || 'center';\n }\n }\n\n if (!this.options.container) {\n this.style['position'] = 'fixed';\n }\n\n if (this.options.scrollHeight) {\n const height = this.options.scrollHeight;\n this.style['height'] = isNaN(Number(height)) ? height : height + 'px';\n }\n\n this.watermarkDom.setAttribute('style', getStyleStr(this.style));\n }\n\n this.watermarkDom.setAttribute(attributeNameTag, this.watermarkTag);\n\n return this.watermarkDom;\n };\n\n async _render() {\n this._destroyMutationObserver();\n\n // 获取水印挂载节点\n this.container = getContainer(this.options.container);\n // 获取水印父节点\n if (!this.watermarkHost) {\n this.watermarkHost = createHost(this.watermarkTag);\n this.container.append(this.watermarkHost);\n }\n\n // 获取水印 DOM\n this.watermarkDom = await this._getWatermarkDom();\n\n // 删除已有水印\n if (this.watermarkHost) {\n const children = this.watermarkHost.childNodes || [];\n\n children.forEach(child => {\n this.watermarkHost!.removeChild(child);\n });\n }\n\n // 判断是否支持 Shadow DOM\n if (typeof this.watermarkHost.attachShadow === 'function') {\n if (!this.shadowRoot) {\n this.shadowRoot = this.watermarkHost.attachShadow({ mode: 'open' });\n }\n } else {\n this.shadowRoot = this.watermarkHost;\n }\n\n this.shadowRoot.append(this.watermarkDom);\n\n if (MutationObserver && this.options.secure) {\n this.mutationObserver = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (this._shouldRerender(mutation)) {\n this.destroy();\n this._render();\n return;\n }\n });\n });\n this.mutationObserver.observe(this.container, observeOptions);\n if (this.shadowRoot) {\n this.mutationObserver.observe(this.shadowRoot, observeOptions);\n }\n }\n }\n}\n","import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n Input,\n NgZone,\n numberAttribute,\n OnChanges,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { WatermarkOptions } from './types';\nimport { Watermark } from './watermark';\n\n@Directive({\n selector: '[watermark]',\n exportAs: 'watermark',\n standalone: true,\n host: {\n '[style.position]': '\"relative\"',\n },\n})\nexport class WatermarkDirective implements OnInit, OnChanges, OnDestroy {\n @Input({ alias: 'watermarkOptions' }) options: WatermarkOptions = {};\n\n @Input({ alias: 'watermarkContainer' }) container?: HTMLElement | string | null;\n\n @Input({ alias: 'watermarkSecure', transform: booleanAttribute }) secure = true;\n\n @Input({ alias: 'watermarkZIndex', transform: numberAttribute }) zIndex = 9999;\n\n @Input({ alias: 'watermarkScrollHeight' }) scrollHeight?: string | number;\n\n private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private _ngZone = inject(NgZone);\n\n private _watermark?: Watermark;\n\n ngOnInit(): void {\n const el = this._elementRef.nativeElement;\n\n this._watermark = this._ngZone.runOutsideAngular(\n () =>\n new Watermark({\n ...this.options,\n container: this.container || (el.childNodes.length > 0 ? el : null),\n secure: this.secure,\n zIndex: this.zIndex,\n scrollHeight: this.scrollHeight,\n })\n );\n }\n\n ngOnChanges(): void {\n this.update(this.options);\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n update(options: WatermarkOptions) {\n this._watermark?.update(options);\n }\n\n show() {\n this._watermark?.show();\n }\n\n hide() {\n this._watermark?.hide();\n }\n\n destroy() {\n this._watermark?.destroy();\n }\n}\n","/*\n * Public API Surface of watermark\n */\n\nexport { WatermarkOptions } from './lib/types';\nexport * from './lib/watermark';\nexport * from './lib/watermark.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}