From b7d146ddb55d984da967f80a4aecda5024875e79 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 7 Nov 2025 10:11:48 +0100 Subject: [PATCH] refactor: standardize annotation types and clean up PDF burn handler - Introduced `AnnotationType.PSPDFKit` constants for consistent annotation type references. - Updated `BurnPdfCommandHandler` to use new PSPDFKit annotation types. - Refactored method signatures and local variables for clarity (e.g., using 'var', null-coalescing for annotation properties). - Streamlined `using` statements and memory management in PDF burning process. - Added placeholder methods for form fields, image, and ink annotations to centralize future implementations. --- .../Pdf/BurnPdfCommand.cs | 179 ++++++++++-------- .../Constants/AnnotationType.cs | 13 ++ 2 files changed, 115 insertions(+), 77 deletions(-) create mode 100644 EnvelopeGenerator.Domain/Constants/AnnotationType.cs diff --git a/EnvelopeGenerator.Application/Pdf/BurnPdfCommand.cs b/EnvelopeGenerator.Application/Pdf/BurnPdfCommand.cs index 9c70349c..98bdc1fd 100644 --- a/EnvelopeGenerator.Application/Pdf/BurnPdfCommand.cs +++ b/EnvelopeGenerator.Application/Pdf/BurnPdfCommand.cs @@ -1,6 +1,7 @@ using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Application.Common.Configurations; using EnvelopeGenerator.Application.Exceptions; +using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.PdfEditor; using GdPicture14; @@ -72,93 +73,86 @@ public class BurnPdfCommandHandler : IRequestHandler public byte[] BurnElementAnnotsToPDF(byte[] pSourceBuffer, List elements) { // Add background - using (var doc = PdfEditor.Pdf.FromMemory(pSourceBuffer)) + using var doc = PdfEditor.Pdf.FromMemory(pSourceBuffer); + // TODO: take the length from the largest y + pSourceBuffer = doc.Background(elements, 1.9500000000000002 * 0.93, 2.52 * 0.67) + .ExportStream() + .ToArray(); + + GdPictureStatus oResult; + using var oSourceStream = new MemoryStream(pSourceBuffer); + // Open PDF + oResult = _manager.InitFromStream(oSourceStream); + if (oResult != GdPictureStatus.OK) + throw new BurnAnnotationException($"Could not open document for burning: [{oResult}]"); + + // Imported from background (add to configuration) + var margin = 0.2; + var inchFactor = 72; + + // Y offset of form fields + var keys = new[] { "position", "city", "date" }; // add to configuration + var unitYOffsets = 0.2; + + var yOffsetsOfFF = keys + .Select((k, i) => new { Key = k, Value = unitYOffsets * i + 1 }) + .ToDictionary(x => x.Key, x => x.Value); + + // Add annotations + foreach (var element in elements) { - // TODO: take the length from the largest y - pSourceBuffer = doc.Background(elements, 1.9500000000000002 * 0.93, 2.52 * 0.67) - .ExportStream() - .ToArray(); + var frameX = element.Left - 0.7 - margin; - GdPictureStatus oResult; - using (var oSourceStream = new MemoryStream(pSourceBuffer)) - { - // Open PDF - oResult = _manager.InitFromStream(oSourceStream); - if (oResult != GdPictureStatus.OK) - throw new BurnAnnotationException($"Could not open document for burning: [{oResult}]"); - - // Imported from background (add to configuration) - double margin = 0.2; - double inchFactor = 72; + var frame = element.Annotations?.FirstOrDefault(a => a.Name == "frame"); + var frameY = element.Top - 0.5 - margin; + var frameYShift = (frame!.Y ?? default) - frameY * inchFactor; + var frameXShift = (frame.X ?? default) - frameX * inchFactor; - // Y offset of form fields - var keys = new[] { "position", "city", "date" }; // add to configuration - double unitYOffsets = 0.2; + foreach (var annot in element.Annotations!) + { + if (!yOffsetsOfFF.TryGetValue(annot.Name, out var yOffsetofFF)) + yOffsetofFF = 0; - var yOffsetsOfFF = keys - .Select((k, i) => new { Key = k, Value = unitYOffsets * i + 1 }) - .ToDictionary(x => x.Key, x => x.Value); + var y = frameY + yOffsetofFF; - // Add annotations - foreach (var element in elements) + if (annot.Type == AnnotationType.PSPDFKit.FormField) { - double frameX = element.Left - 0.7 - margin; - - var frame = element.Annotations?.FirstOrDefault(a => a.Name == "frame"); - double frameY = element.Top - 0.5 - margin; - double frameYShift = (frame!.Y ?? default) - frameY * inchFactor; - double frameXShift = (frame.X ?? default) - frameX * inchFactor; - - foreach (var annot in element.Annotations!) - { - double yOffsetofFF; - if (!yOffsetsOfFF.TryGetValue(annot.Name, out yOffsetofFF)) - yOffsetofFF = 0; - - double y = frameY + yOffsetofFF; - - if (annot.Type == AnnotationType.FormField) - { - AddFormFieldValue( - annot.X / inchFactor, - y, - annot.Width / inchFactor, - annot.Height / inchFactor, - element.Page, - annot.Value - ); - } - else if (annot.Type == AnnotationType.Image) - { - AddImageAnnotation( - annot.X / inchFactor, - annot.Name == "signature" ? (annot.Y - frameYShift) / inchFactor : y, - annot.Width / inchFactor, - annot.Height / inchFactor, - element.Page, - annot.Value - ); - } - else if (annot.Type == AnnotationType.Ink) - { - AddInkAnnotation(element.Page, annot.Value); - } - } + AddFormFieldValue( + (annot.X ?? default) / inchFactor, + y, + (annot.Width ?? default) / inchFactor, + (annot.Height ?? default) / inchFactor, + element.Page, + annot.Value + ); } - - // Save PDF - using (var oNewStream = new MemoryStream()) + else if (annot.Type == AnnotationType.PSPDFKit.Image) { - oResult = _manager.SaveDocumentToPDF(oNewStream); - if (oResult != GdPictureStatus.OK) - throw new BurnAnnotationException($"Could not save document to stream: [{oResult}]"); - - _manager.Close(); - - return oNewStream.ToArray(); + AddImageAnnotation( + (annot.X ?? default) / inchFactor, + annot.Name == "signature" ? ((annot.Y ?? default) - frameYShift) / inchFactor : y, + (annot.Width ?? default) / inchFactor, + (annot.Height ?? default) / inchFactor, + element.Page, + annot.Value + ); + } + else if (annot.Type == AnnotationType.PSPDFKit.Ink) + { + AddInkAnnotation(element.Page, annot.Value); } } } + + // Save PDF + using var oNewStream = new MemoryStream(); + oResult = _manager.SaveDocumentToPDF(oNewStream); + if (oResult != GdPictureStatus.OK) + throw new BurnAnnotationException($"Could not save document to stream: [{oResult}]"); + + _manager.Close(); + + return oNewStream.ToArray(); } /// @@ -169,7 +163,38 @@ public class BurnPdfCommandHandler : IRequestHandler /// public byte[] BurnInstantJSONAnnotsToPDF(byte[] pSourceBuffer, List pInstantJSONList) { - return Enumerable.Empty().ToArray(); + throw new NotImplementedException(); + } + + private void AddFormFieldValue(double x, double y, double width, double height, int page, string value) + { + throw new NotImplementedException(); + } + + + private void AddFormFieldValue(Annotation pAnnotation, FormFieldValue formFieldValue) + { + throw new NotImplementedException(); + } + + private void AddImageAnnotation(double x, double y, double width, double height, int page, string base64) + { + throw new NotImplementedException(); + } + + private void AddImageAnnotation(Annotation pAnnotation, Dictionary pAttachments) + { + throw new NotImplementedException(); + } + + private void AddInkAnnotation(int page, string value) + { + throw new NotImplementedException(); + } + + private void AddInkAnnotation(Annotation pAnnotation) + { + throw new NotImplementedException(); } /// diff --git a/EnvelopeGenerator.Domain/Constants/AnnotationType.cs b/EnvelopeGenerator.Domain/Constants/AnnotationType.cs new file mode 100644 index 00000000..3f3b6bf9 --- /dev/null +++ b/EnvelopeGenerator.Domain/Constants/AnnotationType.cs @@ -0,0 +1,13 @@ +namespace EnvelopeGenerator.Domain.Constants +{ + public static class AnnotationType + { + public static class PSPDFKit + { + public const string Image = "pspdfkit/image"; + public const string Ink = "pspdfkit/ink"; + public const string Widget = "pspdfkit/widget"; + public const string FormField = "pspdfkit/form-field-value"; + } + } +} \ No newline at end of file