Add watermarks to word processing documents
Microsoft Word allows the user to divide and format the document into multiple sections. Defining sections in the document enables the user to set specific page layout and formatting for different parts of the document. An example of the sections is headers and footers. Headers and footers are used to display text or any graphical object on all the pages.
Adding watermark to a particular section
GroupDocs.Watermark API allows you to add watermark objects in the headers and footers of the page. Adding watermark to a section of a Word document using GroupDocs.Watermark consists of following steps.
- Load the document
- Create and initialize watermark object
- Set watermark properties
- Create WordProcessingWatermarkSectionOptions and set SectionIndex
- Add watermark to the section of the document
- Save the document
Following code adds watermark to the headers of a particular section.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingAddWatermarkToSection
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
TextWatermark watermark = new TextWatermark("Test watermark", new Font("Arial", 19));
// Add watermark to all headers of the first section
WordProcessingWatermarkSectionOptions options = new WordProcessingWatermarkSectionOptions();
options.SectionIndex = 0;
watermarker.Add(watermark, options);
watermarker.Save(Constants.OutDocumentDocx);
}
The code snippet above adds watermark to the first section (to all headers of this section). So, it will be displayed on all pages belonging to the section.
Getting page size
If for some reasons you want to use absolute sizing and positioning, you may also need to get some page properties for a section. GroupDocs.Watermark allows you to extract information about a particular section.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingGetSectionProperties
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
Console.WriteLine(content.Sections[0].PageSetup.Width);
Console.WriteLine(content.Sections[0].PageSetup.Height);
Console.WriteLine(content.Sections[0].PageSetup.TopMargin);
Console.WriteLine(content.Sections[0].PageSetup.RightMargin);
Console.WriteLine(content.Sections[0].PageSetup.BottomMargin);
Console.WriteLine(content.Sections[0].PageSetup.LeftMargin);
}
Adding watermark to the images inside a particular section
Using GroupDocs.Watermark, you can add watermark to the images that belong to a particular section.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingAddWatermarkToSectionImages
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
TextWatermark watermark = new TextWatermark("Protected image", new Font("Arial", 8));
watermark.HorizontalAlignment = HorizontalAlignment.Center;
watermark.VerticalAlignment = VerticalAlignment.Center;
watermark.RotateAngle = 45;
watermark.SizingType = SizingType.ScaleToParentDimensions;
watermark.ScaleFactor = 1;
// Get all images belonging to the first section
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
WatermarkableImageCollection images = content.Sections[0].FindImages();
// Add watermark to all found images
foreach (WatermarkableImage image in images)
{
image.Add(watermark);
}
watermarker.Save(Constants.OutDocumentDocx);
}
Adding watermark to the image shapes in a word document
Word document may also contain different shapes. The API allows you to use shape collection to add watermark to images in a document. Below example shows how to add watermark to image shapes.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingAddWatermarkToShapeImages
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
TextWatermark watermark = new TextWatermark("Protected image", new Font("Arial", 8));
watermark.HorizontalAlignment = HorizontalAlignment.Center;
watermark.VerticalAlignment = VerticalAlignment.Center;
watermark.RotateAngle = 45;
watermark.SizingType = SizingType.ScaleToParentDimensions;
watermark.ScaleFactor = 1;
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
foreach (WordProcessingSection section in content.Sections)
{
foreach (WordProcessingShape shape in section.Shapes)
{
// Headers&Footers usually contains only service information.
// So, we skip images in headers/footers, expecting that they are probably watermarks or backgrounds
if (shape.HeaderFooter == null && shape.Image != null)
{
shape.Image.Add(watermark);
}
}
}
watermarker.Save(Constants.OutDocumentDocx);
}
Adding watermark to a particular page of word document
GroupDocs.Watermark enables you to add watermark to a particular page of a Word document. You can use following example to achieve this.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingAddWatermarkToParticularPage
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
TextWatermark textWatermark = new TextWatermark("DRAFT", new Font("Arial", 42));
// Add watermark to the last page
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
WordProcessingWatermarkPagesOptions options = new WordProcessingWatermarkPagesOptions();
options.PageNumbers = new int[] {content.PageCount};
watermarker.Add(textWatermark, options);
watermarker.Save(Constants.OutDocumentDocx);
}
Working with headers and footers
Linking headers and footers
Header or footer in a Word document can be linked to the corresponding header or footer in the previous section. In this way, the same content is displayed in the linked header or footer. GroupDocs.Watermark API provides the option to link the header or footer using IsLinkedToPrevious property of WordProcessingHeaderFooter class. Following code snippet serves this purpose.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingLinkHeaderFooterInSection
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
// Link footer for even numbered pages to corresponding footer in previous section
content.Sections[1].HeadersFooters[OfficeHeaderFooterType.FooterEven].IsLinkedToPrevious = true;
watermarker.Save(Constants.OutDocumentDocx);
}
Linking all headers and footers
Following code snippet links all the headers and footers in a particular section.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingLinkAllHeaderFooterInSection
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
// Link footer for even numbered pages to corresponding footer in previous section
content.Sections[1].HeadersFooters[1].IsLinkedToPrevious = true;
watermarker.Save(Constants.OutDocumentDocx);
}
Add watermark to headers and footers with linking
This feature can be useful to reduce resultant file size when you’re adding image watermark to all sections.
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingAddImageWatermark
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
using (ImageWatermark watermark = new ImageWatermark(Constants.LargePng))
{
// Add watermark to all headers of the first section
WordProcessingWatermarkSectionOptions options = new WordProcessingWatermarkSectionOptions();
options.SectionIndex = 0;
watermarker.Add(watermark, options);
}
// Link all other headers&footers to corresponding headers&footers of the first section
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
for (int i = 1; i < content.Sections.Count; i++)
{
content.Sections[i].HeadersFooters.LinkToPrevious(true);
}
watermarker.Save(Constants.OutDocumentDocx);
}
Setting different headers or footers
Using GroupDocs.Watermark API, you can also set different headers or footers for even and odd numbered pages and for the first page of the document (as shown in below example).
AdvancedUsage.AddingWatermarks.AddWatermarksToWordProcessing.WordProcessingSetDifferentFirstPageHeaderFooter
WordProcessingLoadOptions loadOptions = new WordProcessingLoadOptions();
// Constants.InDocumentDocx is an absolute or relative path to your document. Ex: @"C:\Docs\document.docx"
using (Watermarker watermarker = new Watermarker(Constants.InDocumentDocx, loadOptions))
{
WordProcessingContent content = watermarker.GetContent<WordProcessingContent>();
content.Sections[0].PageSetup.DifferentFirstPageHeaderFooter = true;
content.Sections[0].PageSetup.OddAndEvenPagesHeaderFooter = true;
watermarker.Save(Constants.OutDocumentDocx);
}
Advanced use cases
- Existing objects in word processing document
- Locking watermark in word processing document
- Protecting word processing documents
- Watermarks in word processing document
More resources
GitHub examples
You may easily run the code above and see the feature in action in our GitHub examples:
Free online document watermarking App
Along with full featured .NET library we provide simple, but powerful free Apps.
You are welcome to add watermark to PDF, DOC, DOCX, PPT, PPTX, XLS, XLSX, Emails and more with our free online Free Online Document Watermarking App.