From 4cf19d1dbe38dcd5f469c9897d2f039f6844af02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Sat, 25 Apr 2026 08:45:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84=20?= =?UTF-8?q?=E5=8E=BB=E6=8E=89JQ=E8=84=9A=E6=9C=AC=20=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E6=B0=B4=E5=8D=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/static/js/pdfwatermark.js | 69 ---------- .../resources/static/pdfjs/web/viewer.html | 2 - .../resources/static/pdfjs/web/viewer.mjs | 120 +++++++++++++++--- 3 files changed, 101 insertions(+), 90 deletions(-) delete mode 100644 server/src/main/resources/static/js/pdfwatermark.js diff --git a/server/src/main/resources/static/js/pdfwatermark.js b/server/src/main/resources/static/js/pdfwatermark.js deleted file mode 100644 index 2e047754..00000000 --- a/server/src/main/resources/static/js/pdfwatermark.js +++ /dev/null @@ -1,69 +0,0 @@ - -function isNotEmpty(value) { - return value !== null && value !== undefined && value !== '' && value !== 'false' ; -} - -function watermarkObj(watermarkContainer,watermarkTxt) { -try { -if (!isNotEmpty(watermarkTxt)) { - return ; -} - var watermarkSettings = { - watermark_txt: watermarkTxt, - watermark_start_x:80,//水印起始位置x轴坐标 - watermark_start_y:80,//水印起始位置Y轴坐标 - watermark_x_space:80,//水印x轴间隔 - watermark_y_space:80,//水印y轴间隔 - watermark_color:'black',//水印字体颜色 - watermark_alpha:0.2,//水印透明度 - watermark_fontsize:'18px',//水印字体大小 - watermark_font:'微软雅黑',//水印字体 - watermark_width:200,//水印宽度 - watermark_height:80,//水印高度 - watermark_angle:30//水印倾斜度数 - }; - // console.log(watermarkContainer); - var page_width = $(watermarkContainer).width() - watermarkSettings.watermark_width; - var page_height = $(watermarkContainer).height() - watermarkSettings.watermark_height; - page_width = (page_width < 250) ? 250 : page_width; - page_height = (page_height < 250) ? 250 : page_height; - var oTemp = document.createDocumentFragment(); - for (var x = watermarkSettings.watermark_start_x; x < page_width; x+= watermarkSettings.watermark_x_space) { - for (var y = watermarkSettings.watermark_start_y; y < page_height; y+= watermarkSettings.watermark_y_space) { - var mask_div = document.createElement('div'); - // mask_div.id = 'mask_div' + x + y; - mask_div.className = 'mask_div'; - mask_div.appendChild(document.createTextNode(watermarkTxt)); - // 设置水印div倾斜显示 - mask_div.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity="+(watermarkSettings.watermark_alpha*100)+")"; - mask_div.style.webkitTransform = "rotate(-" + watermarkSettings.watermark_angle + "deg)"; - mask_div.style.MozTransform = "rotate(-" + watermarkSettings.watermark_angle + "deg)"; - mask_div.style.msTransform = "rotate(-" + watermarkSettings.watermark_angle + "deg)"; - mask_div.style.OTransform = "rotate(-" + watermarkSettings.watermark_angle + "deg)"; - mask_div.style.transform = "rotate(-" + watermarkSettings.watermark_angle + "deg)"; - mask_div.style.visibility = ""; - mask_div.style.position = "absolute"; - mask_div.style.left = x + 'px'; - mask_div.style.top = y + 'px'; - mask_div.style.overflow = "hidden"; - mask_div.style.zIndex = "100"; - mask_div.style.pointerEvents='none';//pointer-events:none 让水印不遮挡页面的点击事件 - //mask_div.style.border="solid #eee 1px"; - mask_div.style.opacity = watermarkSettings.watermark_alpha; - mask_div.style.fontSize = watermarkSettings.watermark_fontsize; - mask_div.style.fontFamily = watermarkSettings.watermark_font; - mask_div.style.color = watermarkSettings.watermark_color; - mask_div.style.textAlign = "center"; - mask_div.style.width = watermarkSettings.watermark_width + 'px'; - mask_div.style.height = watermarkSettings.watermark_height + 'px'; - mask_div.style.display = "block"; - oTemp.appendChild(mask_div); - } - } - $(watermarkContainer).append(oTemp); - } catch (e) { - console.log(e); - } - -} - diff --git a/server/src/main/resources/static/pdfjs/web/viewer.html b/server/src/main/resources/static/pdfjs/web/viewer.html index 48548ca8..6c8d957f 100644 --- a/server/src/main/resources/static/pdfjs/web/viewer.html +++ b/server/src/main/resources/static/pdfjs/web/viewer.html @@ -1221,8 +1221,6 @@ See https://github.com/adobe-type-tools/cmap-resources - -
diff --git a/server/src/main/resources/static/pdfjs/web/viewer.mjs b/server/src/main/resources/static/pdfjs/web/viewer.mjs index 390156fa..6e09b26b 100644 --- a/server/src/main/resources/static/pdfjs/web/viewer.mjs +++ b/server/src/main/resources/static/pdfjs/web/viewer.mjs @@ -9,6 +9,83 @@ if (kkpdfAutoFetch == "true") { } else { kkpdfAutoFetch = false } + +function isNotEmpty(value) { + return value !== null && value !== undefined && value !== '' && value !== 'false' ; +} +/** + * 通用水印生成函数 + * @param {HTMLElement} container - 水印容器(相对定位的父元素) + * @param {string} watermarkTxt - 水印文字 + * @param {number} [explicitWidth] - 可选:显式指定容器宽度(px),不传则自动获取 + * @param {number} [explicitHeight] - 可选:显式指定容器高度(px),不传则自动获取 + */ +function addWatermark(container, watermarkTxt, explicitWidth = null, explicitHeight = null) { + if (!isNotEmpty(watermarkTxt)) return; + + // 公共配置 + const settings = { + start_x: 80, + start_y: 80, + x_space: 80, + y_space: 80, + color: 'black', + alpha: 0.2, + fontsize: '18px', + font: '微软雅黑', + width: 200, + height: 80, + angle: 30 + }; + + // 确定实际使用的宽高 + let pageWidth, pageHeight; + if (explicitWidth !== null && explicitHeight !== null) { + pageWidth = explicitWidth; + pageHeight = explicitHeight; + } else { + const rect = container.getBoundingClientRect(); + pageWidth = rect.width; + pageHeight = rect.height; + } + + let maxX = pageWidth - settings.width; + let maxY = pageHeight - settings.height; + maxX = Math.max(maxX, 250); + maxY = Math.max(maxY, 250); + + const fragment = document.createDocumentFragment(); + for (let x = settings.start_x; x < maxX; x += settings.x_space) { + for (let y = settings.start_y; y < maxY; y += settings.y_space) { + const div = document.createElement('div'); + div.className = 'mask_div'; + div.appendChild(document.createTextNode(watermarkTxt)); + div.style.cssText = ` + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=${settings.alpha * 100}); + transform: rotate(-${settings.angle}deg); + visibility: visible; + position: absolute; + left: ${x}px; + top: ${y}px; + overflow: hidden; + z-index: 100; + pointer-events: none; + opacity: ${settings.alpha}; + font-size: ${settings.fontsize}; + font-family: ${settings.font}; + color: ${settings.color}; + text-align: center; + width: ${settings.width}px; + height: ${settings.height}px; + display: block; + `; + fragment.appendChild(div); + } + } + container.appendChild(fragment); +} + + /******/ var __webpack_modules__ = ({ /***/ 34: @@ -13877,32 +13954,37 @@ class PDFPrintService { useRenderedPage() { this.throwIfInactive(); const img = document.createElement("img"); - this.scratchCanvas.toBlob(blob => { - img.src = URL.createObjectURL(blob); - }); const wrapper = document.createElement("div"); wrapper.className = "printedPage"; + wrapper.style.position = "relative"; + + // 获取当前页面的尺寸(单位:点,1pt=1/72英寸) + const pageSizePt = this.pagesOverview[0]; + // 转换为 CSS 像素(1pt = 96/72 px) + const pageWidthPx = pageSizePt.width * 96 / 72; + const pageHeightPx = pageSizePt.height * 96 / 72; + + // 设置 wrapper 尺寸(CSS 像素) + wrapper.style.width = `${pageWidthPx}px`; + wrapper.style.height = `${pageHeightPx}px`; + wrapper.style.backgroundColor = "white"; + + this.scratchCanvas.toBlob(blob => { + img.src = URL.createObjectURL(blob); + }); + wrapper.append(img); - - // 关键:定义 pageSize 和 pageCount - const pageSize = this.pagesOverview[0]; - const pageCount = this.pagesOverview.length; - - var printWatermarkDiv = document.createElement('div'); - printWatermarkDiv.style.position = 'absolute'; - printWatermarkDiv.style.left = '0px'; - printWatermarkDiv.style.top = '0px'; - printWatermarkDiv.style.width = '1024px'; - printWatermarkDiv.style.height = pageSize.height * pageCount + "px"; - watermarkObj(printWatermarkDiv, watermarkTxt); - wrapper.appendChild(printWatermarkDiv); this.printContainer.append(wrapper); const { promise, resolve, reject } = Promise.withResolvers(); - img.onload = resolve; + img.onload = () => { + // 使用专用函数生成水印,直接传入页面像素尺寸 + addWatermark(wrapper, watermarkTxt, pageWidthPx, pageHeightPx); + resolve(); + }; img.onerror = reject; promise.catch(() => {}).then(() => { - URL.revokeObjectURL(img.src); + URL.revokeObjectURL(img.src); }); return promise; } @@ -17613,7 +17695,7 @@ class PDFPageView extends BasePDFPageView { } }); } - watermarkObj(div,watermarkTxt); + addWatermark(div,watermarkTxt); if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { const { annotationStorage,