Program.vb
Imports System.Linq Imports Bytescout.PDF Imports Font = Bytescout.PDF.Font Imports SolidBrush = Bytescout.PDF.SolidBrush Module Program Sub Main() Try Console.WriteLine("Please wait while PDF is being created...") ' Parse MessageContents using MsgReader Library ' MsgReader library can be obtained from: https://github.com/Sicos1977/MSGReader Using msg = New MsgReader.Outlook.Storage.Message("TxtSampleEmail.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.BodyText ' Prepare PDF docuemnt Using outputDocument As Document = New Document() ' Add registration keys outputDocument.RegistrationName = "demo" outputDocument.RegistrationKey = "demo" ' 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) ' Get string splitted so that it can be fit properly into page canvas. Dim splittedStringList = _GetStringMeasuredAndSplitted(msgBody, font) For Each itmString As String In splittedStringList Dim pageBody As New Page(PaperFormat.A4) pageBody.Canvas.DrawString(itmString, font, brush, 20, 20) ' Add new page outputDocument.Pages.Add(pageBody) Next ' Save output file outputDocument.Save("result.pdf") ' 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 ''' <summary> ''' Gets string measured and splitted properly ''' </summary> Private Function _GetStringMeasuredAndSplitted(ByVal msgBody As String, ByVal font As Font) As List(Of String) Dim lstStringRet As List(Of String) = New List(Of String)() Dim oMeasuredString As KeyValuePair(Of String, String) = New KeyValuePair(Of String, String)() While Not String.IsNullOrEmpty(msgBody) oMeasuredString = _MeasuredString(msgBody, font) lstStringRet.Add(oMeasuredString.Key) msgBody = oMeasuredString.Value End While Return lstStringRet End Function ''' <summary> ''' Measure string ''' </summary> ''' <param name="msgBody"></param> ''' <param name="font"></param> ''' <returns></returns> Private Function _MeasuredString(ByVal msgBody As String, ByVal font As Font) As KeyValuePair(Of String, String) Dim pageBody As Page = New Page(PaperFormat.A4) Dim msgBodySplitted = msgBody.Split(vbLf.ToCharArray()) Dim strTemp As String = "" For i As Integer = 0 To msgBodySplitted.Length - 1 Dim sizeF = pageBody.Canvas.MeasureString(strTemp & "" & msgBodySplitted(i), font) If sizeF.Height > 800 Then Dim lstRetString_Value = String.Join(vbLf, msgBodySplitted.Skip(i)) Return New KeyValuePair(Of String, String)(strTemp, lstRetString_Value) End If strTemp += msgBodySplitted(i) Next Return New KeyValuePair(Of String, String)(msgBody, "") End Function End Module
Click here to get your Free Trial version of the SDK
also available as: