feat(sender-editor): use rendered page metadata for field placement
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user