Link Search Menu Expand Document

convert Email with attachemnts to PDF - VB.NET

PDF SDK sample in VB.NET demonstrating ‘convert Email with attachemnts to PDF’

Program.vb
Imports System.Drawing.Printing
Imports System.IO
Imports System.Text
Imports Bytescout.PDF
Imports Bytescout.PDF.Converters

Imports Font = Bytescout.PDF.Font
Imports SolidBrush = Bytescout.PDF.SolidBrush

Module Program

    Sub Main()

        Try
            ' Parse MessageContents using MsgReader Library
            ' MsgReader library can be obtained from: https://github.com/Sicos1977/MSGReader
            Using msg = New MsgReader.Outlook.Storage.Message("EmailWithAttachments.msg")

                ' Get Sender information
                Dim from = msg.GetEmailSender(False, False)

                ' Message sent datetime
                Dim sentOn = msg.SentOn

                ' Recipient To information
                Dim recipientsTo = msg.GetEmailRecipients(MsgReader.Outlook.RecipientType.[To], False, False)

                ' Recipient CC information
                Dim recipientsCc = msg.GetEmailRecipients(MsgReader.Outlook.RecipientType.Cc, False, False)

                ' Recipient BCC information
                Dim recipientBcc = msg.GetEmailRecipients(MsgReader.Outlook.RecipientType.Bcc, False, False)

                ' Message subject
                Dim subject = msg.Subject

                ' Get Message Body
                Dim msgBody = msg.BodyHtml

                ' Prepare PDF docuemnt
                Using outputDocument As Document = New Document()

                    ' Add registration keys
                    outputDocument.RegistrationName = "demo"
                    outputDocument.RegistrationKey = "demo"

                    ' If you wish to load an existing document uncomment the line below And comment the Add page section instead
                    ' pdfDocument.Load(".\existing_document.pdf")

                    ' Add page
                    Dim page As Page = New Page(PaperFormat.A4)
                    outputDocument.Pages.Add(page)

                    ' Default font and brush
                    Dim font As Font = New Font(StandardFonts.Times, 12)
                    Dim brush As Brush = New SolidBrush()

                    ' Add Email contents
                    Dim topMargin As Integer = 0
                    topMargin += 20
                    page.Canvas.DrawString($"File Name: {msg.FileName}", font, brush, 20, topMargin)

                    topMargin += 20
                    page.Canvas.DrawString($"From: {from}", font, brush, 20, topMargin)

                    topMargin += 20
                    page.Canvas.DrawString($"Sent On: {(If(sentOn.HasValue, sentOn.Value.ToString("MM/dd/yyyy HH:mm"), ""))}", font, brush, 20, topMargin)

                    topMargin += 20
                    page.Canvas.DrawString($"To: {recipientsTo}", font, brush, 20, topMargin)

                    If Not String.IsNullOrEmpty(recipientsCc) Then
                        topMargin += 20
                        page.Canvas.DrawString($"CC: {recipientsCc}", font, brush, 20, topMargin)
                    End If

                    If Not String.IsNullOrEmpty(recipientBcc) Then
                        topMargin += 20
                        page.Canvas.DrawString($"BCC: {recipientBcc}", font, brush, 20, topMargin)
                    End If

                    topMargin += 20
                    page.Canvas.DrawString($"Subject: {subject}", font, brush, 20, topMargin)

                    topMargin += 20
                    page.Canvas.DrawString("Message body in next page.", font, brush, 20, topMargin)

                    Using converter As HtmlToPdfConverter = New HtmlToPdfConverter()
                        converter.PageSize = PaperKind.A4
                        converter.Orientation = Bytescout.PDF.Converters.PaperOrientation.Portrait

                        ' Get all inline attachment, and replace them
                        For Each itmAttachment As MsgReader.Outlook.Storage.Attachment In msg.Attachments

                            If itmAttachment.IsInline Then
                                Dim oData = itmAttachment.Data
                                Dim dataBase64 = Convert.ToBase64String(oData)

                                ' Replace within email
                                msgBody = msgBody.Replace($"src=""{itmAttachment.FileName}""", $"src=""data:image/jpeg;base64,{dataBase64}""")
                            End If
                        Next

                        ' Convert input HTML to stream
                        Dim byteArrayBody As Byte() = Encoding.UTF8.GetBytes(msgBody)
                        Dim inputStream As MemoryStream = New MemoryStream(byteArrayBody)

                        ' Create output stream to store generated PDF file
                        Using outputStream = New MemoryStream()

                            ' Convert HTML to PDF
                            converter.ConvertHtmlToPdf(inputStream, outputStream)

                            ' Create new document from generated output stream
                            Dim docContent As Document = New Document(outputStream)

                            ' Append all pages to main PDF
                            For Each item As Page In docContent.Pages
                                outputDocument.Pages.Add(item)
                            Next

                            ' Apped all other attachments
                            For Each itmAttachment As MsgReader.Outlook.Storage.Attachment In msg.Attachments

                                If Not itmAttachment.IsInline Then
                                    ' Attachment is image, so adding accordingly
                                    Dim pageAttachment = New Page(PaperFormat.A4)
                                    Dim canvas As Canvas = pageAttachment.Canvas

                                    Dim oAttachmentStream = New MemoryStream(itmAttachment.Data)
                                    Dim imageAttachment As Image = New Image(oAttachmentStream)

                                    canvas.DrawImage(imageAttachment, 20, 20)

                                    ' Add attachment
                                    outputDocument.Pages.Add(pageAttachment)
                                End If
                            Next
                            ' Save output file
                            outputDocument.Save("result.pdf")
                        End Using
                    End Using

                    ' Open output file
                    Process.Start("result.pdf")
                End Using
            End Using

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Console.WriteLine("Press enter key to exit...")
            Console.ReadLine()
        End Try

    End Sub

End Module

Download Source Code (.zip)

Return to the previous page Explore PDF SDK