I went through many articles in order to insert a page break in word document with C#. Though they seemed to work for others, they did not for me. But I did find a way to insert breaks.
object oEndOfDoc = "\\endofdoc";
object paramNextPage = WdBreakType.wdSectionBreakNextPage;
wrdDocument.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertBreak(ref paramNextPage);
WHERE
wrdDocument
- Active word document object of type : Microsoft.Office.Interop.Word.Document
As I work, I keep noting about my work here. Earlier, I wrote about inserting images in a word document at a bookmark in this post. Later, arose the need for having text wrapping around an image if it is small for document width. Solution is to use frames to achieve it and here is how I did it.
CImage class definition:
public class CImage
{
public string Path
{
get;
set;
}
public decimal Id
{
get;
set;
}
public string Title
{
get;
set;
}
public Image Bitmap
{
get;
set;
}
public bool BusyLoading
{
get;
set;
}
public void GetImage()
{
try
{
BusyLoading = true;
WebRequest req = WebRequest.Create(Path);
WebResponse response = req.GetResponse();
Stream stream = response.GetResponseStream();
Bitmap = Image.FromStream(stream);
stream.Close();
}
catch
{
Bitmap = null;
}
finally
{
BusyLoading = false;
}
}
public override bool Equals(object obj)
{
CImage objToCompare = obj as CImage;
if (objToCompare == null)
return false;
return this.Id.Equals(objToCompare.Id);
}
}
Adding frame at end of the document (can be any bookmark for that matter)
Frame wrdFrame = wrdDocument.Frames.Add(wrdDocument.Bookmarks.get_Item(ref oEndOfDoc).Range);
WHERE
wrdDocument
- Active word document object of type : Microsoft.Office.Interop.Word.Document
Setting frame properties for textwrap and autosize
wrdFrame.TextWrap = true;
wrdFrame.VerticalDistanceFromText = 7;
wrdFrame.HorizontalDistanceFromText = 10;
wrdFrame.HeightRule = WdFrameSizeRule.wdFrameAuto;
wrdFrame.WidthRule = WdFrameSizeRule.wdFrameAuto;
Inserting image in frame
Clipboard.SetDataObject(objImage.Bitmap);
wrdFrame.Range.Paste();
WHERE
objImage
- Object of type CImage
And you are done !
Important information
You need to add a COM reference to your favorite word object library which should in turn add
- Microsoft.Office.Core
- VBIDE
- Word
Related Posts
I was looking for a way to insert images at a bookmark in a word document and thought should document these for future reference
CImage class Definition
public class CImage
{
public string Path
{
get;
set;
}
public decimal Id
{
get;
set;
}
public string Title
{
get;
set;
}
public Image Bitmap
{
get;
set;
}
public bool BusyLoading
{
get;
set;
}
public void GetImage()
{
try
{
BusyLoading = true;
WebRequest req = WebRequest.Create(Path);
WebResponse response = req.GetResponse();
Stream stream = response.GetResponseStream();
Bitmap = Image.FromStream(stream);
stream.Close();
}
catch
{
Bitmap = null;
}
finally
{
BusyLoading = false;
}
}
}
Scenario 1:
You have a path of the image file which is to be inserted
public static void SetBookMark(Document p_objWordDocument, string p_strName,
CImage p_objImage)
{
if (p_objWordDocument.Bookmarks.Exists(p_strName))
{
object objBookMark = p_strName;
p_objWordDocument.Bookmarks.get_Item(ref objBookMark).Range.InlineShapes.AddPicture(p_objImage.Path, ... dozons of object params ...);
}
}
Scenario 2:
When you have the bitmap in memory
public static void SetBookMark(Document p_objWordDocument, string p_strName,
CImage p_objImage)
{
if (p_objWordDocument.Bookmarks.Exists(p_strName))
{
object objBookMark = p_strName;
Clipboard.SetDataObject(p_objImage.Bitmap);
p_objWordDocument.Bookmarks.get_Item(ref objBookMark).Range.Paste();
}
}
Important information
You need to add a COM reference to your favorite word object library which should in turn add
- Microsoft.Office.Core
- VBIDE
- Word
Related Posts
Module: CEmailManager
Calling function:
public static bool SendDummyEmail()
{
return SendEmail(CGlobalParams.AdminEmail, "dummy", "Hi");
}
Worker function:
private static bool SendEmail(string p_strTo, string p_strSubject, string p_strBody)
{
try
{
MailMessage objMessage = new MailMessage();
string[] lstRecipient = p_strTo.Split(',');
foreach (string strTo in lstRecipient)
{
objMessage.To.Add(strTo);
}
objMessage.From = new MailAddress(CGlobalParams.SMTPUser, CGlobalParams.EmailSenderDisplay);
objMessage.Subject = p_strSubject;
objMessage.Body = p_strBody;
SmtpClient objClient = new SmtpClient(CGlobalParams.SMTPServer, CGlobalParams.SMTPPort);
objClient.UseDefaultCredentials = false;
objClient.Credentials = new System.Net.NetworkCredential(CGlobalParams.SMTPUser, CGlobalParams.SMTPPassword);
objClient.DeliveryMethod = SmtpDeliveryMethod.Network;
if (CGlobalParams.SMTPRequireSSL)
{
objClient.EnableSsl = true;
}
objClient.Send(objMessage);
return true;
}
catch
{
return false;
}
}
Where
CGlobalParams: A class responsible for reading values for global parameters
Global parameters used here:
SMTPPassword : somevalue
SMTPPort : 587
SMTPRequireSSL : true
SMTPServer : smtp.gmail.com
SMTPUser : jyotsnas@philogy.com
With currently set global parameters, the code sends email with gmail/ google apps over SSL. Setting the SMTPRequireSSL to false, will make the code send email with SMTP server which requires authentication but not SSL.