Imports System.Drawing Imports System.IO Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports GdPicture14 Imports Newtonsoft.Json Namespace Jobs Public Class PDFBurner Inherits BaseClass Private ReadOnly LicenseKey As String Private ReadOnly Manager As AnnotationManager Private ReadOnly LicenseManager As LicenseManager Private Const ANNOTATION_TYPE_IMAGE = "pspdfkit/image" Private Const ANNOTATION_TYPE_INK = "pspdfkit/ink" Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String) MyBase.New(pLogConfig) LicenseKey = pGDPictureLicenseKey LicenseManager = New LicenseManager() LicenseManager.RegisterKEY(pGDPictureLicenseKey) Manager = New AnnotationManager() End Sub Public Function BurnInstantJSONAnnotationsToPDF(pSourceFilePath As String, pInstantJSONList As List(Of String), pDestinationDirectoryPath As String) As Boolean If Manager.InitFromFile(pSourceFilePath) <> GdPictureStatus.OK Then Logger.Warn("Could not open file [{0}] for burning.", pSourceFilePath) Return False End If For Each oJSON In pInstantJSONList If AddInstantJSONAnnotationToPDF(oJSON) = False Then Logger.Warn("Adding Annotation failed. Exiting") Return False End If Next Dim oFileInfo As New FileInfo(pSourceFilePath) Dim oDestinationFilePath As String = Path.Combine(pDestinationDirectoryPath, oFileInfo.Name) Try Manager.BurnAnnotationsToPage(RemoveInitialAnnots:=True, VectorMode:=True) Manager.SaveDocumentToPDF(oDestinationFilePath) Manager.Close() Return True Catch ex As Exception Logger.Warn("Could not burn and save annotations to file [{0}]!", oDestinationFilePath) Logger.Error(ex) Return False End Try End Function Private Function AddInstantJSONAnnotationToPDF(pInstantJSON As String) As Boolean Try Dim oAnnotationData = JsonConvert.DeserializeObject(Of AnnotationData)(pInstantJSON) For Each oAnnotation In oAnnotationData.annotations Select Case oAnnotation.type Case ANNOTATION_TYPE_IMAGE AddImageAnnotation(oAnnotation, oAnnotationData.attachments) Case ANNOTATION_TYPE_INK AddInkAnnotation(oAnnotation) End Select Next Return True Catch ex As Exception Logger.Warn("Could not create annotation from InstantJSON") Logger.Error(ex) Return False End Try End Function Private Function AddImageAnnotation(pAnnotation As Annotation, pAttachments As Dictionary(Of String, Attachment)) As Boolean Try Dim oAttachment = pAttachments.Where(Function(a) a.Key = pAnnotation.imageAttachmentId). SingleOrDefault() ' Convert pixels to Inches Dim oBounds = pAnnotation.bbox.Select(AddressOf ToInches).ToList() Dim oX = oBounds.Item(0) Dim oY = oBounds.Item(1) Dim oWidth = oBounds.Item(2) Dim oHeight = oBounds.Item(3) Manager.AddEmbeddedImageAnnotFromBase64(oAttachment.Value.binary, oX, oY, oWidth, oHeight) Return True Catch ex As Exception Logger.Warn("Could not add image annotation!") Logger.Error(ex) Return False End Try End Function Private Function AddInkAnnotation(pAnnotation As Annotation) As Boolean Try Dim oSegments = pAnnotation.lines.points Dim oColor = ColorTranslator.FromHtml(pAnnotation.strokeColor) Manager.SelectPage(pAnnotation.pageIndex) For Each oSegment As List(Of List(Of Single)) In oSegments Dim oPoints = oSegment. Select(AddressOf ToPointF). ToArray() Manager.AddFreeHandAnnot(oColor, oPoints) Next Return True Catch ex As Exception Logger.Warn("Could not add image annotation!") Logger.Error(ex) Return False End Try End Function Private Function ToPointF(pPoints As List(Of Single)) As PointF Dim oPoints = pPoints.Select(AddressOf ToInches).ToList() Return New PointF(oPoints.Item(0), oPoints.Item(1)) End Function Private Function ToInches(pValue As Double) As Double Return pValue / 72 End Function Private Function ToInches(pValue As Single) As Single Return pValue / 72 End Function Friend Class AnnotationData Public Property annotations As List(Of Annotation) Public Property attachments As Dictionary(Of String, Attachment) End Class Friend Class Annotation Public Property id As String Public Property bbox As List(Of Double) Public Property type As String Public Property isSignature As Boolean Public Property imageAttachmentId As String Public Property lines As Lines Public Property pageIndex As Integer Public Property strokeColor As String End Class Friend Class Lines Public Property points As List(Of List(Of List(Of Single))) End Class Friend Class Attachment Public Property binary As String Public Property contentType As String End Class End Class End Namespace