Working with Watermark

This topic discusses how to work programmatically with watermark using Aspose.Words. A watermark is a background image that displays behind the text in a document. A watermark can contain a text or an image represented by the Watermark class.

Add a Watermark to a Document

In Microsoft Word, a watermark can easily be inserted in a document using the Insert Watermark command. Aspose.Words provides the watermark class to add or remove watermark in documents. Aspose.Words provides the WatermarkType enumeration defining three possible types of watermarks (Text, Image, and None) to work with. 

Add Text Watermark

The following code example demonstrates how to insert a text watermark in a document by defining TextWatermarkOptions using the SetText method.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Document.doc");
auto options = System::MakeObject<TextWatermarkOptions>();
options->set_FontFamily(u"Arial");
options->set_FontSize(36);
options->set_Color(System::Drawing::Color::get_Black());
options->set_Layout(WatermarkLayout::Horizontal);
options->set_IsSemitrasparent(false);
doc->get_Watermark()->SetText(u"Test", options);
auto outputPath = outputDataDir + u"AddTextWatermark.docx";
doc->Save(outputPath);

Add Image Watermark

The following code example demonstrates how to insert an image watermark in a document by defining ImageWatermarkOptions using the SetImage method.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Document.doc");
auto options = System::MakeObject<ImageWatermarkOptions>();
options->set_Scale(5);
options->set_IsWashout(false);
doc->get_Watermark()->SetImage(System::Drawing::Image::FromFile(inputDataDir + u"Watermark.png"), options);
auto outputPath = outputDataDir + u"AddImageWatermark.docx";
doc->Save(outputPath);

The watermark can also be inserted using shape class as well. It is very easy to insert any shape or image into a header or footer and thus create a watermark of any imaginable type. The following code example inserts a watermark into a Word document.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
namespace
{
void InsertWatermarkIntoHeader(const System::SharedPtr<Paragraph>& watermarkPara, const System::SharedPtr<Section>& sect, HeaderFooterType headerType)
{
System::SharedPtr<HeaderFooter> header = sect->get_HeadersFooters()->idx_get(headerType);
if (header == nullptr)
{
// There is no header of the specified type in the current section, create it.
header = System::MakeObject<HeaderFooter>(sect->get_Document(), headerType);
sect->get_HeadersFooters()->Add(header);
}
// Insert a clone of the watermark into the header.
header->AppendChild((System::StaticCast<Node>(watermarkPara))->Clone(true));
}
void InsertWatermarkText(const System::SharedPtr<Document>& doc, const System::String& watermarkText)
{
// Create a watermark shape. This will be a WordArt shape.
// You are free to try other shape types as watermarks.
System::SharedPtr<Shape> watermark = System::MakeObject<Shape>(doc, ShapeType::TextPlainText);
watermark->set_Name(u"WaterMark");
// Set up the text of the watermark.
watermark->get_TextPath()->set_Text(watermarkText);
watermark->get_TextPath()->set_FontFamily(u"Arial");
watermark->set_Width(500);
watermark->set_Height(100);
// Text will be directed from the bottom-left to the top-right corner.
watermark->set_Rotation(-40);
// Remove the following two lines if you need a solid black text.
watermark->get_Fill()->set_Color(System::Drawing::Color::get_Gray());
// Try LightGray to get more Word-style watermark
watermark->set_StrokeColor(System::Drawing::Color::get_Gray());
// Try LightGray to get more Word-style watermark
// Place the watermark in the page center.
watermark->set_RelativeHorizontalPosition(RelativeHorizontalPosition::Page);
watermark->set_RelativeVerticalPosition(RelativeVerticalPosition::Page);
watermark->set_WrapType(WrapType::None);
watermark->set_VerticalAlignment(VerticalAlignment::Center);
watermark->set_HorizontalAlignment(HorizontalAlignment::Center);
// Create a new paragraph and append the watermark to this paragraph.
System::SharedPtr<Paragraph> watermarkPara = System::MakeObject<Paragraph>(doc);
watermarkPara->AppendChild(watermark);
// Insert the watermark into all headers of each document section.
for (System::SharedPtr<Node> sectionNode : System::IterateOver(doc->get_Sections()))
{
System::SharedPtr<Section> sect = System::DynamicCast<Section>(sectionNode);
// There could be up to three different headers in each section, since we want
// The watermark to appear on all pages, insert into all headers.
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType::HeaderPrimary);
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType::HeaderFirst);
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType::HeaderEven);
}
}
}
void AddWatermark()
{
std::cout << "AddWatermark example started." << std::endl;
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithImages();
System::String outputDataDir = GetOutputDataDir_WorkingWithImages();
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.Watermark.doc");
InsertWatermarkText(doc, u"CONFIDENTIAL");
System::String outputPath = outputDataDir + u"AddWatermark.doc";
doc->Save(outputPath);
std::cout << "Added watermark to the document successfully." << std::endl << "File saved at " << outputPath.ToUtf8String() << std::endl;
std::cout << "AddWatermark example finished." << std::endl << std::endl;
}

Remove Watermark from a Document

The Watermark class provides the remove method to remove the watermark from a document.

The following code example shows how to remove a watermark from documents:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"TextWatermark.docx");
if (doc->get_Watermark()->get_Type() == WatermarkType::Text)
{
doc->get_Watermark()->Remove();
}
auto outputPath = outputDataDir + u"RemoveWatermark.docx";
doc->Save(outputPath);

If the watermarks are added using the Shape class object then to remove the watermark from a document you have to set only the name of the watermark shape during inserting and then remove the watermark shape by an assigned name.

The following code example show you how to set the name of the watermark shape and remove it from the document:

// Set name to be able to remove it afterwards
watermark->set_Name(u"WaterMark");
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
namespace
{
void RemoveWatermarkText(const System::SharedPtr<Document>& doc)
{
System::SharedPtr<NodeCollection> headerFooterNodes = doc->GetChildNodes(NodeType::HeaderFooter, true);
for (System::SharedPtr<HeaderFooter> hf : System::IterateOver<System::SharedPtr<HeaderFooter>>(headerFooterNodes))
{
System::SharedPtr<NodeCollection> shapeNodes = hf->GetChildNodes(NodeType::Shape, true);
for (System::SharedPtr<Shape> shape: System::IterateOver<System::SharedPtr<Shape>>(shapeNodes))
{
if (shape->get_Name().Contains(u"WaterMark"))
{
shape->Remove();
}
}
}
}
}
void RemoveWatermark()
{
std::cout << "RemoveWatermark example started." << std::endl;
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithImages();
System::String outputDataDir = GetOutputDataDir_WorkingWithImages();
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"RemoveWatermark.docx");
RemoveWatermarkText(doc);
System::String outputPath = outputDataDir + u"RemoveWatermark.docx";
doc->Save(outputPath);
std:: cout << "File saved at " << outputPath.ToUtf8String() << std::endl;
std::cout << "RemoveWatermark example finished." << std::endl << std::endl;
}

Add a Watermark in Table Cell

Sometimes you need to insert a watermark/image into a table’s cell and display it outside the table, you can use IsLayoutInCell property. This property gets or sets a flag indicating whether the shape is displayed inside a table or outside of it. Note that this property works only when you optimize the document for Microsoft Word 2010 using the OptimizeFor method.

The following code example shows how to use this property:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"LayoutInCell.docx");
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
System::SharedPtr<Shape> watermark = System::MakeObject<Shape>(doc, ShapeType::TextPlainText);
watermark->set_RelativeHorizontalPosition(RelativeHorizontalPosition::Page);
watermark->set_RelativeVerticalPosition(RelativeVerticalPosition::Page);
watermark->set_IsLayoutInCell(true);
// Display the shape outside of table cell if it will be placed into a cell.
watermark->set_Width(300);
watermark->set_Height(70);
watermark->set_HorizontalAlignment(HorizontalAlignment::Center);
watermark->set_VerticalAlignment(VerticalAlignment::Center);
watermark->set_Rotation(-40);
watermark->get_Fill()->set_Color(System::Drawing::Color::get_Gray());
watermark->set_StrokeColor(System::Drawing::Color::get_Gray());
watermark->get_TextPath()->set_Text(u"watermarkText");
watermark->get_TextPath()->set_FontFamily(u"Arial");
watermark->set_Name(System::String::Format(u"WaterMark_{0}",System::Guid::NewGuid()));
watermark->set_WrapType(WrapType::None);
System::SharedPtr<Run> run = System::DynamicCast_noexcept<Run>(doc->GetChildNodes(NodeType::Run, true)->idx_get(doc->GetChildNodes(NodeType::Run, true)->get_Count() - 1));
builder->MoveTo(run);
builder->InsertNode(watermark);
doc->get_CompatibilityOptions()->OptimizeFor(MsWordVersion::Word2010);
System::String outputPath = outputDataDir + u"WorkingWithShapes.SetShapeLayoutInCell.docx";
// Save the document to disk.
doc->Save(outputPath);