From babd96200a539fa062fa2216bc9686b37a6651a4 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 24 Aug 2026 14:33:03 +0200 Subject: [PATCH] Refactor and enhance PDF finalization process - Added new imports to integrate additional services. - Renamed `envelope` to `oEnvelopeEntity` for clarity. - Improved envelope retrieval logic and error handling. - Refactored `ReadOnly` envelope handling for readability. - Reintroduced and enhanced annotation processing logic. - Updated `BurnAnnotsToPDF` call with better logging. - Added envelope domain model loading for report creation. - Implemented signing certificate report generation. - Merged burned document with signing certificate report. - Updated output file naming and adjusted save logic. - Improved method structure with clear steps and logging. --- EnvelopeGenerator.BBTests/frmFinalizePDF.vb | 106 +++++++++++++------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb index 5e58eaed..3597b2b4 100644 --- a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb +++ b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb @@ -1,6 +1,7 @@ Imports System.IO Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging +Imports EnvelopeGenerator.CommonServices Imports EnvelopeGenerator.CommonServices.Jobs Imports EnvelopeGenerator.CommonServices.Jobs.FinalizeDocument Imports GdPicture14 @@ -145,64 +146,91 @@ Public Class frmFinalizePDF log.AppendLine($"Document bytes: {oBuffer.Length}") ' 3. Check what BurnAnnotsToPDF will do internally + Dim oEnvelopeEntity As Envelope = Nothing Using scope = Factory.Shared.ScopeFactory.CreateScope() Dim envRepo = scope.ServiceProvider.Repository(Of Envelope)() - Dim envelope = envRepo.Where(Function(env) env.Id = envelopeId).FirstOrDefault() + oEnvelopeEntity = envRepo.Where(Function(env) env.Id = envelopeId).FirstOrDefault() - If envelope Is Nothing Then + If oEnvelopeEntity Is Nothing Then log.AppendLine("ERROR: Envelope not found in EF Core!") txtResult.Text = log.ToString() Return End If - log.AppendLine($"Envelope found: Id={envelope.Id}, EnvelopeTypeId={envelope.EnvelopeTypeId}") - log.AppendLine($"ReadOnly (IsReadAndConfirm): {envelope.ReadOnly}") + log.AppendLine($"Envelope found: Id={oEnvelopeEntity.Id}, EnvelopeTypeId={oEnvelopeEntity.EnvelopeTypeId}") + log.AppendLine($"ReadOnly (IsReadAndConfirm): {oEnvelopeEntity.ReadOnly}") - If envelope.ReadOnly Then - log.AppendLine(">>> EARLY RETURN: ReadOnly=True, original PDF returned without burning") - txtResult.Text = log.ToString() - Return - End If - - Dim sigRepo = scope.ServiceProvider.Repository(Of DocReceiverElement)() - Dim elements = sigRepo _ - .Where(Function(sig) sig.Document.EnvelopeId = envelopeId) _ - .Include(Function(sig) sig.Annotations) _ - .ToList() - - log.AppendLine($"Elements (Signature) count: {elements.Count}") - - If elements.Any() Then - log.AppendLine(">>> PATH: BurnElementAnnotsToPDF (new element-based path)") - For Each elem In elements - Dim annotCount = If(elem.Annotations IsNot Nothing, elem.Annotations.Count(), 0) - log.AppendLine($" Element Id={elem.Id}, Page={elem.Page}, X={elem.X}, Y={elem.Y}, W={elem.Width}, H={elem.Height}, Annotations={annotCount}") - If elem.Annotations IsNot Nothing Then - For Each annot In elem.Annotations - log.AppendLine($" Annot: Name={annot.Name}, Type={annot.Type}, X={annot.X}, Y={annot.Y}, W={annot.Width}, H={annot.Height}") - Next - End If - Next + If oEnvelopeEntity.ReadOnly Then + log.AppendLine(">>> ReadOnly=True: original PDF will be used without burning (annotations skipped)") Else - log.AppendLine(">>> PATH: BurnInstantJSONAnnotsToPDF (old JSON-based path)") + Dim sigRepo = scope.ServiceProvider.Repository(Of DocReceiverElement)() + Dim elements = sigRepo _ + .Where(Function(sig) sig.Document.EnvelopeId = envelopeId) _ + .Include(Function(sig) sig.Annotations) _ + .ToList() + + log.AppendLine($"Elements (Signature) count: {elements.Count}") + + If elements.Any() Then + log.AppendLine(">>> PATH: BurnElementAnnotsToPDF (new element-based path)") + For Each elem In elements + Dim annotCount = If(elem.Annotations IsNot Nothing, elem.Annotations.Count(), 0) + log.AppendLine($" Element Id={elem.Id}, Page={elem.Page}, X={elem.X}, Y={elem.Y}, W={elem.Width}, H={elem.Height}, Annotations={annotCount}") + If elem.Annotations IsNot Nothing Then + For Each annot In elem.Annotations + log.AppendLine($" Annot: Name={annot.Name}, Type={annot.Type}, X={annot.X}, Y={annot.Y}, W={annot.Width}, H={annot.Height}") + Next + End If + Next + Else + log.AppendLine(">>> PATH: BurnInstantJSONAnnotsToPDF (old JSON-based path)") + End If End If End Using - ' 4. Actually call BurnAnnotsToPDF (same as Service) + ' 4. Burn annotations (ReadOnly envelopes return original PDF unchanged) log.AppendLine("") log.AppendLine("Calling BurnAnnotsToPDF...") - Dim oNewBuffer = PDFBurner.BurnAnnotsToPDF(oBuffer, oJsonList, envelopeId) - log.AppendLine($"Result bytes: {oNewBuffer.Length}") - log.AppendLine($"Same as input: {oBuffer.Length = oNewBuffer.Length AndAlso oBuffer.SequenceEqual(oNewBuffer)}") + Dim oBurnedBuffer As Byte() = PDFBurner.BurnAnnotsToPDF(oBuffer, oJsonList, envelopeId) + log.AppendLine($"Burned bytes: {oBurnedBuffer.Length}") + log.AppendLine($"Unchanged (ReadOnly): {oBuffer.Length = oBurnedBuffer.Length AndAlso oBuffer.SequenceEqual(oBurnedBuffer)}") - ' 5. Write output + ' 5. Build State and load Envelope domain model for ReportCreator + log.AppendLine("") + log.AppendLine("Loading envelope domain model for report...") + Dim oState As New State() With { + .Database = Database, + .LogConfig = LogConfig + } + Dim oEnvelopeModel As New EnvelopeModel(oState) + Dim oEnvelope = oEnvelopeModel.GetById(envelopeId) + If oEnvelope Is Nothing Then + log.AppendLine("ERROR: Envelope not found via EnvelopeModel!") + txtResult.Text = log.ToString() + Return + End If + log.AppendLine($"Envelope loaded: {oEnvelope.Id}") + + ' 6. Create signing certificate report + log.AppendLine("Creating signing certificate report...") + Dim oReportCreator As New ReportCreator(LogConfig, oState) + Dim oReportBuffer As Byte() = oReportCreator.CreateReport(oEnvelope) + log.AppendLine($"Report bytes: {oReportBuffer.Length}") + + ' 7. Merge burned document + report (last page) + log.AppendLine("Merging documents...") + Dim oMerger As New PDFMerger(LogConfig, pGDPictureLicenseKey) + Dim oMergedBuffer As Byte() = oMerger.MergeDocuments(oBurnedBuffer, oReportBuffer) + log.AppendLine($"Merged bytes: {oMergedBuffer.Length}") + + ' 8. Save and open Dim desktopPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) - Dim oNewPath = Path.Combine(desktopPath, $"E{txtEnvelope.Text}_FullTest.burned.pdf") - File.WriteAllBytes(oNewPath, oNewBuffer) - log.AppendLine($"Output: {oNewPath}") + Dim oMergedPath = Path.Combine(desktopPath, $"E{txtEnvelope.Text}_FullTest.merged.pdf") + File.WriteAllBytes(oMergedPath, oMergedBuffer) + log.AppendLine($"Output: {oMergedPath}") txtResult.Text = log.ToString() - Process.Start(oNewPath) + Process.Start(oMergedPath) Catch ex As Exception txtResult.Text = $"ERROR: {ex.Message}{vbCrLf}{vbCrLf}{ex.ToString()}"