From 34b620e749932737c719e66e759a4ca804f53d88 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 5 Jun 2026 12:55:23 +0200 Subject: [PATCH] Preserve scroll position during PDF page rendering Added functionality to maintain the scroll position and viewport center of the `.pdf-frame` container during PDF page rendering. This ensures the user's view remains centered on the same content after re-rendering, even if the canvas dimensions change. Implemented logic to store the scroll position and viewport center before rendering and restore them afterward using scaling factors calculated from the canvas's old and new dimensions. --- .../wwwroot/js/pdf-viewer.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.js b/EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.js index 871c801f..ac0c0b72 100644 --- a/EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.js +++ b/EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.js @@ -115,6 +115,22 @@ window.pdfViewer = { this.pageRendering = true; try { + // Get scroll container + const container = this.canvas.closest('.pdf-frame'); + + // Store scroll position and viewport center BEFORE rendering + let scrollLeft = 0, scrollTop = 0; + let centerX = 0, centerY = 0; + let oldWidth = this.canvas.width; + let oldHeight = this.canvas.height; + + if (container) { + scrollLeft = container.scrollLeft; + scrollTop = container.scrollTop; + centerX = scrollLeft + container.clientWidth / 2; + centerY = scrollTop + container.clientHeight / 2; + } + const page = await this.pdfDoc.getPage(num); const viewport = page.getViewport({ scale: this.scale }); @@ -138,6 +154,18 @@ window.pdfViewer = { console.log('Page rendered successfully'); + // Restore viewport center position AFTER rendering + if (container && oldWidth > 0 && oldHeight > 0) { + const scaleX = this.canvas.width / oldWidth; + const scaleY = this.canvas.height / oldHeight; + + const newCenterX = centerX * scaleX; + const newCenterY = centerY * scaleY; + + container.scrollLeft = newCenterX - container.clientWidth / 2; + container.scrollTop = newCenterY - container.clientHeight / 2; + } + this.currentRenderTask = null; this.pageRendering = false;