You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ngx-extended-pdf-viewer与Konva Groups的KonvaJS输入框尺寸问题

KonvaJS输入框在Angular+ngx-extended-pdf-viewer应用中制作端与签署端尺寸不一致

问题描述

我正在开发一款基于Angular、KonvaJS和ngx-extended-pdf-viewer库的电子文档签署Web应用。文档制作人员可添加由包含rectangles和text的Konva groups组成的输入字段,供签署人填写。

目前遇到的核心问题:

  • 输入框尺寸已通过后端正确保存至MongoDB,两端展示时输入框位置完全正确
  • 调整输入框尺寸后,制作端显示正常,但签署端的输入框尺寸显示异常
  • 仅移动输入框不修改尺寸时,签署端显示完全正常

补充背景信息

  • 制作与签署视图仅通过背景色区分,核心展示逻辑完全一致
  • 使用ngx-extended-pdf-viewer展示PDF,通过<div>创建专用容器承载Konva图层,该容器在两端的尺寸完全相同
  • 两端使用完全相同的代码渲染Konva groups
  • 已尝试复用制作端的Konva图层缩放值,问题仍未解决

解决方案建议

1. 统一坐标与尺寸的基准单位

检查制作端调整尺寸时的计算逻辑:

  • 避免直接使用容器的DOM屏幕像素作为尺寸保存,因为ngx-extended-pdf-viewer会根据视图缩放PDF,两端的PDF缩放比例可能存在差异。
  • 建议将输入框的尺寸和位置都基于PDF文档的原始坐标系统(比如以PDF的点为单位)保存,渲染时根据当前PDF的实时缩放比例转换为Konva的绘制单位。

2. 同步两端Konva Stage的核心参数

即使容器尺寸相同,Konva Stage的缩放、偏移参数可能因PDF加载时机不同出现差异:

  • 监听ngx-extended-pdf-viewer的zoomChanged或pageRendered事件,获取当前PDF的缩放比例,以此初始化Konva Stage:
    // 示例:根据PDF缩放比例设置Konva Stage
    const pdfScale = this.pdfViewerService.getCurrentZoom();
    this.stage.scale({ x: pdfScale, y: pdfScale });
    this.stage.draw();
    
  • 确保两端Stage的scaleX/scaleY、offsetX/offsetY完全一致后,再渲染Konva groups。

3. 修正尺寸的保存与渲染逻辑

  • 制作端调整尺寸时,确保保存的是输入框的原始尺寸值,而非经过Konva Stage缩放后的数值。如果保存的是缩放后的尺寸,签署端Stage再次缩放时会导致尺寸叠加异常。
  • 渲染时直接使用数据库中存储的原始尺寸,结合当前Stage的缩放比例计算最终绘制尺寸,而非直接赋值。

4. 验证数据库存储的尺寸数据

再次确认MongoDB中存储的width/height数值:

  • 调整尺寸后,检查数据库中的数据是否与制作端调整后的实际原始尺寸完全一致,排除数据被意外转换、截断或精度丢失的可能。

内容的提问来源于stack exchange,提问作者Haffoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:30