Program.cs
using Bytescout.PDF;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Font = Bytescout.PDF.Font;
using SolidBrush = Bytescout.PDF.SolidBrush;
namespace EmailToPDF_TextEmail
{
class Program
{
static void Main(string[] args)
{
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 (var msg = new MsgReader.Outlook.Storage.Message("TxtSampleEmail.msg"))
{
// Get Sender information
var from = msg.GetEmailSender(false, false);
// Message sent datetime
var sentOn = msg.SentOn;
// Recipient To information
var recipientsTo = msg.GetEmailRecipients(MsgReader.Outlook.RecipientType.To, false, false);
// Recipient CC information
var recipientsCc = msg.GetEmailRecipients(MsgReader.Outlook.RecipientType.Cc, false, false);
// Message subject
var subject = msg.Subject;
// Get Message Body
var msgBody = msg.BodyText;
// Prepare PDF docuemnt
using (Document outputDocument = new Document())
{
// Add registration keys
outputDocument.RegistrationName = "demo";
outputDocument.RegistrationKey = "demo";
// Add page
Page page = new Page(PaperFormat.A4);
outputDocument.Pages.Add(page);
// Add sample content
Font font = new Font(StandardFonts.Times, 12);
Brush brush = new SolidBrush();
// Add Email contents
int topMargin = 20;
page.Canvas.DrawString($"File Name: {msg.FileName}", font, brush, 20, (topMargin += 20));
page.Canvas.DrawString($"From: {from}", font, brush, 20, (topMargin += 20));
page.Canvas.DrawString($"Sent On: {(sentOn.HasValue ? sentOn.Value.ToString("MM/dd/yyyy HH:mm") : "")}", font, brush, 20, (topMargin += 20));
page.Canvas.DrawString($"To: {recipientsTo}", font, brush, 20, (topMargin += 20));
if (!string.IsNullOrEmpty(recipientsCc))
{
page.Canvas.DrawString($"CC: {recipientsCc}", font, brush, 20, (topMargin += 20));
}
page.Canvas.DrawString($"Subject: {subject}", font, brush, 20, (topMargin += 20));
page.Canvas.DrawString("Message body in next page.", font, brush, 20, (topMargin += 20));
// Get string splitted so that it can be fit properly into page canvas.
var splittedStringList = _GetStringMeasuredAndSplitted(msgBody, font);
foreach (var itmString in splittedStringList)
{
Page pageBody = new Page(PaperFormat.A4);
pageBody.Canvas.DrawString(itmString, font, brush, 20, 20);
// Add new page
outputDocument.Pages.Add(pageBody);
}
// Save output file
outputDocument.Save("result.pdf");
// Open result document in default associated application (for demo purpose)
ProcessStartInfo processStartInfo = new ProcessStartInfo("result.pdf");
processStartInfo.UseShellExecute = true;
Process.Start(processStartInfo);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Press enter key to exit...");
Console.ReadLine();
}
}
/// <summary>
/// Gets string measured and splitted properly
/// </summary>
private static List<string> _GetStringMeasuredAndSplitted(string msgBody, Font font)
{
List<string> lstStringRet = new List<string>();
KeyValuePair<string, string> oMeasuredString = new KeyValuePair<string, string>();
while (!string.IsNullOrEmpty(msgBody))
{
oMeasuredString = _MeasuredString(msgBody, font);
lstStringRet.Add(oMeasuredString.Key);
msgBody = oMeasuredString.Value;
}
return lstStringRet;
}
/// <summary>
/// Measure string
/// </summary>
private static KeyValuePair<string, string> _MeasuredString(string msgBody, Font font)
{
Page pageBody = new Page(PaperFormat.A4);
var msgBodySplitted = msgBody.Split("\n".ToCharArray());
string strTemp = "";
for (int i = 0; i < msgBodySplitted.Length; i++)
{
// Here, using Canvas.MeasureString method which measures string against canvas, so we can split to multiple pages it if text is big
var sizeF = pageBody.Canvas.MeasureString(strTemp + "" + msgBodySplitted[i], font);
// Page height should be below 800 in-order to fit into page properly
if (sizeF.Height > 800)
{
var lstRetString_Value = string.Join("\n", msgBodySplitted.Skip(i));
// return splittd string and remained of it
return new KeyValuePair<string, string>(strTemp, lstRetString_Value);
}
strTemp += msgBodySplitted[i];
}
// No need to split more
return new KeyValuePair<string, string>(msgBody, "");
}
}
}
Click here to get your Free Trial version of the SDK
also available as: