From 93e8d77069f4cb693560b0536b18fdd7625b1563 Mon Sep 17 00:00:00 2001 From: xuhuajiao <13476289682@163.com> Date: Wed, 23 Sep 2026 13:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E8=A7=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vendors/pdf/PdfView.vue | 76 ++++---- src/views/preview/index.vue | 95 ++++++---- .../processManage/index-old.vue | 167 ++++++++++++++++++ 3 files changed, 269 insertions(+), 69 deletions(-) create mode 100644 src/views/system/fileLibraryManage/processManage/index-old.vue diff --git a/src/vendors/pdf/PdfView.vue b/src/vendors/pdf/PdfView.vue index 45a782b..3464e1e 100644 --- a/src/vendors/pdf/PdfView.vue +++ b/src/vendors/pdf/PdfView.vue @@ -53,7 +53,9 @@ export default { initColor: null, fileParentInfo: null, selectedCategory:null, - formatData:[] + formatData:[], + // 带水印的 PDF 字节,供外部打印使用 + pdfBytes: null } }, mounted() { @@ -78,7 +80,8 @@ export default { return } this.pdf_scale = this.pdf_scale + 0.1 - this.loadFile() + // 只重新渲染 canvas,不重新加载文档,避免大文件每次缩放都卡顿 + this.renderPagePdf() }, scaleX() { // 缩小 @@ -87,7 +90,7 @@ export default { return } this.pdf_scale = this.pdf_scale - 0.1 - this.loadFile() + this.renderPagePdf() }, formateTime() { const time = new Date() @@ -114,35 +117,8 @@ export default { await getInitWatermark().then((res) => { this.watermarkInfo = res if (res.watermarkType === '1') { - // 图片水印 - let dom = document.getElementsByClassName('page') - let canvas = document.createElement('canvas') - let cxt = canvas.getContext('2d') - let divImg = document.createElement('div') - - let imgScale = 0.1 - //创建新的图片对象 - let img = new Image(); - //指定图片的URL - img.src = this.watermarkInfo.context; - let _this = this; - //浏览器加载图片完毕后再绘制图片 - img.onload = function() { - //cxt.drawImage(img,0,0); - cxt.rotate(-20 * Math.PI / 180) - let whScale = img.width / img.height - cxt.clearRect(0, 0, canvas.width, canvas.height); - cxt.drawImage(img, //规定要使用的图像、画布或视频。 - 0, 0, //开始剪切的 x 坐标位置。 - img.width, img.height, //被剪切图像的高度。 - 0, 50,//在画布上放置图像的 x 、y坐标位置。 - img.width * imgScale, img.height * imgScale //要使用的图像的宽度、高度 - ) - - divImg.style.opacity = parseFloat(_this.watermarkInfo.transparency) / 100 - divImg.style.background = 'url(' + canvas.toDataURL('image/png') + ') left top repeat' - _this.drawImage2(divImg,dom) - } + // 图片水印画到 DOM 层(.page div),延迟到页面渲染后再画,避免此时 .page div 还未渲染导致 drawImage2 取不到节点 + this._pendingImageWatermark = true } else if (res.watermarkType === '0') { const rgbaValue = this.watermarkInfo.transparency; const startIndex = rgbaValue.indexOf('('); // 找到第一个括号的位置 @@ -195,9 +171,14 @@ export default { }) const pdfBytes = await pdfDoc.save() + this.pdfBytes = pdfBytes this.pdfDoc = await PDFJS.getDocument(pdfBytes).promise this.pdf_pages = this.pdfDoc.numPages - this.$nextTick(() => this.renderPagePdf()) + this.$nextTick(() => { + this.renderPagePdf() + // 归档章只在文档加载后调一次,不在每页渲染时重复请求 + this.getFilingsealFormat() + }) }, drawImage2 (div,dom) { div.style.pointerEvents = 'none' @@ -273,9 +254,32 @@ export default { return this.renderPagePdf(num + 1) }) } - - // 归档章数据获取操作 - this.getFilingsealFormat() + + // 图片水印延迟到第一页渲染后画,此时 .page div 已存在 + if (num === 1 && this._pendingImageWatermark) { + this._pendingImageWatermark = false + this.drawImageWatermarkToDom() + } + }, + // 图片水印画到 DOM 层(.page div),从 loadFile 延迟到此调用,解决 .page div 未渲染时画不上的竞态 + drawImageWatermarkToDom() { + if (!this.watermarkInfo || this.watermarkInfo.watermarkType !== '1') return + const dom = document.getElementsByClassName('page') + if (!dom || dom.length === 0) return + const canvas = document.createElement('canvas') + const cxt = canvas.getContext('2d') + const divImg = document.createElement('div') + const imgScale = 0.1 + const img = new Image() + img.src = this.watermarkInfo.context + img.onload = () => { + cxt.rotate(-20 * Math.PI / 180) + cxt.clearRect(0, 0, canvas.width, canvas.height) + cxt.drawImage(img, 0, 0, img.width, img.height, 0, 50, img.width * imgScale, img.height * imgScale) + divImg.style.opacity = parseFloat(this.watermarkInfo.transparency) / 100 + divImg.style.background = 'url(' + canvas.toDataURL('image/png') + ') left top repeat' + this.drawImage2(divImg, dom) + } }, getFilingsealFormat() { FetchGetFilingsealFormat().then((res) => { diff --git a/src/views/preview/index.vue b/src/views/preview/index.vue index ba727a2..decded0 100644 --- a/src/views/preview/index.vue +++ b/src/views/preview/index.vue @@ -43,7 +43,7 @@
{{ item.flowName }}
+