diff --git a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj index b6d6609e..b4b27ccb 100644 --- a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj +++ b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj @@ -142,6 +142,7 @@ + @@ -182,6 +183,7 @@ Component + diff --git a/EnvelopeGenerator.Common/Jobs/FinalizeDocument/FinalizeDocumentJob.vb b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/FinalizeDocumentJob.vb index 83e26a7d..be54b15c 100644 --- a/EnvelopeGenerator.Common/Jobs/FinalizeDocument/FinalizeDocumentJob.vb +++ b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/FinalizeDocumentJob.vb @@ -7,8 +7,6 @@ Imports System.Security.Cryptography Imports System.IO Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument.FinalizeDocumentExceptions Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument -Imports System.Web.Caching -Imports System.Web.UI Namespace Jobs Public Class FinalizeDocumentJob @@ -29,8 +27,11 @@ Namespace Jobs Private ActionService As ActionService Private PDFBurner As PDFBurner + Private PDFMerger As PDFMerger Private ReportCreator As ReportCreator + Private ReadOnly CompleteWaitTimeInMinutes As Integer = 5 + Private Class EnvelopeData Public EnvelopeId As Integer Public DocumentPath As String @@ -62,6 +63,9 @@ Namespace Jobs Logger.Debug("Loading PDFBurner..") PDFBurner = New PDFBurner(LogConfig, oGdPictureKey) + Logger.Debug("Loading PDFMerger..") + PDFMerger = New PDFMerger(LogConfig, oGdPictureKey) + Logger.Debug("Loading ReportCreator..") ReportCreator = New ReportCreator(LogConfig, oState) @@ -72,7 +76,7 @@ Namespace Jobs Logger.Debug("ExportPath: [{0}]", Config.ExportPath) Dim oCompleteStatus As Integer = Constants.EnvelopeStatus.EnvelopeCompletelySigned - Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus}" + Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTimeInMinutes}" Dim oTable = Database.GetDatatable(oSql) Dim oEnvelopeIds As List(Of Integer) = oTable.Rows.Cast(Of DataRow). @@ -119,9 +123,11 @@ Namespace Jobs Logger.Debug("Creating report..") Dim oReport As Byte() = ReportCreator.CreateReport(oEnvelope) + Logger.Debug("Report created.") Logger.Debug("Merging documents..") - Dim oMergedDocument As Byte() = MergeDocuments(oBurnedDocument, oReport) + Dim oMergedDocument As Byte() = PDFMerger.MergeDocuments(oBurnedDocument, oReport) + Logger.Debug("Documents merged.") Dim oOutputDirectoryPath = Config.ExportPath Dim oOutputFilePath = Path.Combine(oOutputDirectoryPath, $"{oEnvelope.Uuid}.pdf") @@ -156,50 +162,7 @@ Namespace Jobs Return Task.FromResult(True) End Function - Private Function MergeDocuments(pDocument As Byte(), pReport As Byte()) As Byte() - Using oDocumentStream As New MemoryStream(pDocument) - Using oReportStream As New MemoryStream(pReport) - Using oFinalStream As New MemoryStream() - Using oDocumentPDF As New GdPicturePDF() - Using oReportPDF As New GdPicturePDF() - Dim oStatus As GdPictureStatus = GdPictureStatus.OK - ' Load the source file into memory - oDocumentPDF.LoadFromStream(oDocumentStream, True) - - oStatus = oDocumentPDF.GetStat() - If oStatus <> GdPictureStatus.OK Then - Throw New MergeDocumentException($"Document could not be loaded: {oStatus}") - End If - - ' Load the report file into memory - oReportPDF.LoadFromStream(oReportStream, True) - oStatus = oReportPDF.GetStat() - If oStatus <> GdPictureStatus.OK Then - Throw New MergeDocumentException($"Report could not be loaded: {oStatus}") - End If - - ' Merge the documents - Dim oMergedPDF = oDocumentPDF.Merge2Documents(oDocumentPDF, oReportPDF) - oStatus = oMergedPDF.GetStat() - If oStatus <> GdPictureStatus.OK Then - Throw New MergeDocumentException($"Documents could not be merged: {oStatus}") - End If - - ' Convert to PDF/A - oMergedPDF.ConvertToPDFA(oFinalStream, PdfConversionConformance.PDF_A_1b, True, True) - oStatus = oDocumentPDF.GetStat() - If oStatus <> GdPictureStatus.OK Then - Throw New MergeDocumentException($"Document could not be converted to PDF/A: {oStatus}") - End If - - Return oFinalStream.ToArray() - End Using - End Using - End Using - End Using - End Using - End Function Private Function BurnAnnotationsToPdf(pData As EnvelopeData) As Byte() Dim pEnvelopeId = pData.EnvelopeId diff --git a/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFBurner.vb b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFBurner.vb index 09e10a3b..c348f8b2 100644 --- a/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFBurner.vb +++ b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFBurner.vb @@ -10,7 +10,6 @@ Namespace Jobs.FinalizeDocument Public Class PDFBurner Inherits BaseClass - Private ReadOnly LicenseKey As String Private ReadOnly Manager As AnnotationManager Private ReadOnly LicenseManager As LicenseManager @@ -20,7 +19,6 @@ Namespace Jobs.FinalizeDocument Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String) MyBase.New(pLogConfig) - LicenseKey = pGDPictureLicenseKey LicenseManager = New LicenseManager() LicenseManager.RegisterKEY(pGDPictureLicenseKey) diff --git a/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFMerger.vb b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFMerger.vb new file mode 100644 index 00000000..b672bee3 --- /dev/null +++ b/EnvelopeGenerator.Common/Jobs/FinalizeDocument/PDFMerger.vb @@ -0,0 +1,71 @@ +Imports DigitalData.Modules.Base +Imports DigitalData.Modules.Logging +Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument.FinalizeDocumentExceptions +Imports GdPicture14 +Imports System.IO + +Public Class PDFMerger + Inherits BaseClass + + Private ReadOnly Manager As AnnotationManager + Private ReadOnly LicenseManager As LicenseManager + + Private Const ALLOW_RASTERIZATION = True + Private Const ALLOW_VECTORIZATION = True + + Private ReadOnly PDFAConformanceLevel As PdfConversionConformance = PdfConversionConformance.PDF_A_1b + + Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String) + MyBase.New(pLogConfig) + + LicenseManager = New LicenseManager() + LicenseManager.RegisterKEY(pGDPictureLicenseKey) + + Manager = New AnnotationManager() + End Sub + + Public Function MergeDocuments(pDocument As Byte(), pReport As Byte()) As Byte() + Using oDocumentStream As New MemoryStream(pDocument) + Using oReportStream As New MemoryStream(pReport) + Using oFinalStream As New MemoryStream() + Using oDocumentPDF As New GdPicturePDF() + Using oReportPDF As New GdPicturePDF() + Dim oStatus As GdPictureStatus = GdPictureStatus.OK + + ' Load the source file into memory + oDocumentPDF.LoadFromStream(oDocumentStream, True) + + oStatus = oDocumentPDF.GetStat() + If oStatus <> GdPictureStatus.OK Then + Throw New MergeDocumentException($"Document could not be loaded: {oStatus}") + End If + + ' Load the report file into memory + oReportPDF.LoadFromStream(oReportStream, True) + oStatus = oReportPDF.GetStat() + If oStatus <> GdPictureStatus.OK Then + Throw New MergeDocumentException($"Report could not be loaded: {oStatus}") + End If + + ' Merge the documents + Dim oMergedPDF = oDocumentPDF.Merge2Documents(oDocumentPDF, oReportPDF) + oStatus = oMergedPDF.GetStat() + If oStatus <> GdPictureStatus.OK Then + Throw New MergeDocumentException($"Documents could not be merged: {oStatus}") + End If + + ' Convert to PDF/A + oMergedPDF.ConvertToPDFA(oFinalStream, PDFAConformanceLevel, ALLOW_VECTORIZATION, ALLOW_RASTERIZATION) + oStatus = oDocumentPDF.GetStat() + If oStatus <> GdPictureStatus.OK Then + Throw New MergeDocumentException($"Document could not be converted to PDF/A: {oStatus}") + End If + + Return oFinalStream.ToArray() + End Using + End Using + End Using + End Using + End Using + End Function +End Class diff --git a/EnvelopeGenerator.Common/Services/ActionService.vb b/EnvelopeGenerator.Common/Services/ActionService.vb index 9ee5d0e7..2d1fa7fa 100644 --- a/EnvelopeGenerator.Common/Services/ActionService.vb +++ b/EnvelopeGenerator.Common/Services/ActionService.vb @@ -2,7 +2,7 @@ Imports DigitalData.Modules.Base Public Class ActionService - Inherits BaseClass + Inherits BaseService Private ReadOnly EmailService As EmailService Private ReadOnly HistoryService As HistoryService @@ -11,7 +11,7 @@ Public Class ActionService Public Sub New(pState As State) - MyBase.New(pState.LogConfig) + MyBase.New(pState) EmailService = New EmailService(pState) HistoryService = New HistoryService(pState) diff --git a/EnvelopeGenerator.Common/Services/BaseService.vb b/EnvelopeGenerator.Common/Services/BaseService.vb new file mode 100644 index 00000000..4e0486e0 --- /dev/null +++ b/EnvelopeGenerator.Common/Services/BaseService.vb @@ -0,0 +1,13 @@ +Imports DigitalData.Modules.Base + +Public Class BaseService + Inherits BaseClass + + Friend Property State As State + + Public Sub New(pState As State) + MyBase.New(pState.LogConfig) + + State = pState + End Sub +End Class diff --git a/EnvelopeGenerator.Common/Services/EmailService.vb b/EnvelopeGenerator.Common/Services/EmailService.vb index e57562ed..da531942 100644 --- a/EnvelopeGenerator.Common/Services/EmailService.vb +++ b/EnvelopeGenerator.Common/Services/EmailService.vb @@ -3,7 +3,7 @@ Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Public Class EmailService - Inherits BaseClass + Inherits BaseService Private ReadOnly State As State @@ -14,9 +14,8 @@ Public Class EmailService Private ReadOnly EmailTemplate As EmailTemplate Public Sub New(pState As State) - MyBase.New(pState.LogConfig) + MyBase.New(pState) - State = pState EnvelopeModel = New EnvelopeModel(pState) ReceiverModel = New ReceiverModel(pState) EmailModel = New EmailModel(pState) diff --git a/EnvelopeGenerator.Common/Services/HistoryService.vb b/EnvelopeGenerator.Common/Services/HistoryService.vb index 587590d6..5733b65d 100644 --- a/EnvelopeGenerator.Common/Services/HistoryService.vb +++ b/EnvelopeGenerator.Common/Services/HistoryService.vb @@ -4,18 +4,15 @@ Imports DigitalData.Modules.Logging Imports EnvelopeGenerator.Common.Constants Public Class HistoryService - Inherits BaseClass - - Private ReadOnly State As State + Inherits BaseService Private ReadOnly EnvelopeModel As EnvelopeModel Private ReadOnly ReceiverModel As ReceiverModel Private ReadOnly HistoryModel As HistoryModel Public Sub New(pState As State) - MyBase.New(pState.LogConfig) + MyBase.New(pState) - State = pState EnvelopeModel = New EnvelopeModel(pState) ReceiverModel = New ReceiverModel(pState) HistoryModel = New HistoryModel(pState)