Imports System.Collections.Generic Imports System.IO Imports DigitalData.Modules.Logging Imports GdPicture14 Public Class PDFAttachments Private Logger As Logger Private Const ZUGFERD_XML_FILENAME = "ZUGFeRD-invoice.xml" Public Class AttachmentResult Public FileName As String Public FileContents As Byte() End Class Public Sub New(LogConfig As LogConfig) Logger = LogConfig.GetLogger End Sub Public Function Extract(FileName As String, AllowedExtensions As List(Of String)) As List(Of AttachmentResult) Dim oResults As New List(Of AttachmentResult) Dim oExtensions = AllowedExtensions.ConvertAll(Of String)(New Converter(Of String, String)(Function(ext) ext.ToUpper)) Try Using oGDPicturePDF As New GdPicturePDF() If oGDPicturePDF.LoadFromFile(FileName, False) = GdPictureStatus.OK Then Dim oEmbeddedFileCount As Integer = oGDPicturePDF.GetEmbeddedFileCount() If oGDPicturePDF.GetStat() = GdPictureStatus.OK Then If oEmbeddedFileCount > 1 Then For index = 0 To oEmbeddedFileCount - 1 Dim oFileName As String = oGDPicturePDF.GetEmbeddedFileName(index) If oGDPicturePDF.GetStat() = GdPictureStatus.OK Then Dim oExtension = New FileInfo(oFileName).Extension.ToUpper.Substring(1) If oFileName.ToUpper <> ZUGFERD_XML_FILENAME.ToUpper Then If oExtensions.Contains(oExtension) Then Dim FileSize As Integer = oGDPicturePDF.GetEmbeddedFileSize(index) If oGDPicturePDF.GetStat() = GdPictureStatus.OK Then Dim oFileData As Byte() = New Byte(FileSize) {} Dim status As GdPictureStatus = oGDPicturePDF.ExtractEmbeddedFile(index, oFileData) If status = GdPictureStatus.OK Then oResults.Add(New AttachmentResult() With { .FileContents = oFileData, .FileName = oFileName }) Else Logger.Error("The embedded file [{0}] has failed to extract. Status: {1}", oFileName, oGDPicturePDF.GetStat().ToString()) Continue For End If 'If status = GdPictureStatus.OK Then ' Dim oVersionedName = Filesystem.GetVersionedFilename(oFileName) ' Dim oTempName As String = Path.Combine(Path.GetTempPath(), oVersionedName) ' Using oFileStream As New FileStream(oTempName, FileMode.OpenOrCreate) ' oFileStream.Write(oFileData, 0, oFileData.Length) ' End Using ' oResults.Add(New FileInfo(oTempName)) 'Else ' Logger.Error("The embedded file [{0}] has failed to extract. Status: {1}", oFileName, oGDPicturePDF.GetStat().ToString()) ' Continue For 'End If Else Logger.Error("An error occurred getting the file size for [{0}]. Status: {1}", oFileName, oGDPicturePDF.GetStat().ToString()) Continue For End If Else Logger.Warn("File [{0}] was skipped because its extension [{1}] is not allowed.", oFileName, oExtension) Continue For End If Else Logger.Debug("File [{0}] was skipped because its name indicates the invoice data file.", oFileName) Continue For End If Else Logger.Error("An error occurred getting the file name for [{0}]. Status: {1}", oFileName, oGDPicturePDF.GetStat().ToString()) Continue For End If Next End If Else Logger.Error("An error occurred getting the number of embedded files. Status: {0}", oGDPicturePDF.GetStat().ToString()) Return Nothing End If Else Logger.Error("The file [{0}] can't be loaded.", FileName) Return Nothing End If End Using Return oResults Catch ex As Exception Logger.Warn("Unexpected Error while Extracting attachments from File [{0}]", FileName) Logger.Error(ex) Return Nothing End Try End Function End Class