feat(sender-editor): use rendered page metadata for field placement

This commit is contained in:
2026-09-29 19:22:01 +02:00
parent 7a114f47a6
commit 776700b247
2 changed files with 39 additions and 28 deletions

View File

@@ -14,6 +14,7 @@
@inject AppVersionService AppVersion
@inject ILogger<SenderEditorPage> Logger
@inject DocumentService DocumentService
@inject PdfRenderService PdfRenderService
@inject ReceiverService ReceiverService
@inject EnvelopeService EnvelopeService
@inject IStringLocalizer<Resource> UiLocalizer
@@ -278,7 +279,7 @@
{
<SenderPdfImageEditor IsPlacementMode="@(_pendingReceiverForPlacement is not null)"
PageCount="@_pageCount"
PageImageDataUrls="@_pageImageDataUrls"
Pages="@_pagePreviews"
PdfDataUrl="@PdfDataUrl"
Fields="@FieldOverlays"
EditorClick="OnPdfAreaClickAsync"
@@ -471,7 +472,7 @@
string? _errorMessage;
byte[]? _originalPdfBytes; // Pristine upload — never modified, used as base for redraw
int _pageCount;
Dictionary<int, string> _pageImageDataUrls = [];
List<PdfPageImageDto> _pagePreviews = [];
int? _loadedEnvelopeId;
int? _editingEnvelopeId;
bool _isLoadingEnvelopeForEdit;
@@ -594,9 +595,11 @@
_originalPdfBytes = document?.ByteData;
_pdfLoaded = _originalPdfBytes is { Length: > 0 };
_pageCount = EstimatePdfPageCount(_originalPdfBytes) ??
Math.Max(1, _signatureFields.Select(f => f.Page).DefaultIfEmpty(1).Max());
_pageImageDataUrls.Clear();
_pagePreviews = [];
_pageCount = _pagePreviews.Count > 0
? _pagePreviews.Count
: EstimatePdfPageCount(_originalPdfBytes)
?? Math.Max(1, _signatureFields.Select(f => f.Page).DefaultIfEmpty(1).Max());
_fileName = $"Envelope-{envelopeId}.pdf";
_pendingReceiverForPlacement = null;
_loadedEnvelopeId = envelopeId;
@@ -638,8 +641,12 @@
_originalPdfBytes = ms.ToArray();
_fileName = file.Name;
_pdfLoaded = true;
_pageCount = EstimatePdfPageCount(_originalPdfBytes) ?? 1;
_pageImageDataUrls.Clear();
_pagePreviews = (await PdfRenderService.RenderPagesAsync(_originalPdfBytes))
.OrderBy(p => p.PageNumber)
.ToList();
_pageCount = _pagePreviews.Count > 0
? _pagePreviews.Count
: EstimatePdfPageCount(_originalPdfBytes) ?? 1;
_signatureFields.Clear();
_pendingReceiverForPlacement = null;
@@ -682,10 +689,10 @@
return;
}
// Approximate points based on A4. This is temporary until the image-based viewer
// pipeline provides precise per-page dimensions.
const double pageWidthPt = 595.0;
const double pageHeightPt = 842.0;
int page1Based = coords.PageIndex + 1;
var pagePreview = _pagePreviews.FirstOrDefault(p => p.PageNumber == page1Based);
var pageWidthPt = pagePreview?.WidthPt ?? 595.0;
var pageHeightPt = pagePreview?.HeightPt ?? 842.0;
// Convert normalised [0,1] → PDF points; clamp so box stays inside page
double xPt = coords.NormX * pageWidthPt;
@@ -694,8 +701,6 @@
xPt = Math.Max(0, Math.Min(xPt, pageWidthPt - SigWidthPt));
yPt = Math.Max(0, Math.Min(yPt, pageHeightPt - SigHeightPt));
int page1Based = coords.PageIndex + 1;
var field = new SignatureFieldDraft(
XPt: xPt,
YPt: yPt,