Travailler avec un filigrane

Cette rubrique explique comment travailler par programmation avec un filigrane à l’aide de Aspose.Words. Un filigrane est une image d’arrière-plan qui s’affiche derrière le texte d’un document. Un filigrane peut contenir un texte ou une image représentée par la classe Watermark.

Ajouter un filigrane à un document

Dans Microsoft Word, un filigrane peut facilement être inséré dans un document à l’aide de la commande Insérer un filigrane. Aspose.Words fournit la classe watermark pour ajouter ou supprimer un filigrane dans les documents. Aspose.Words fournit l’énumération WatermarkType définissant trois types possibles de filigranes (Texte, Image et Aucun) avec lesquels travailler.

Ajouter Un Filigrane De Texte

L’exemple de code suivant montre comment insérer un filigrane de texte dans un document en définissant TextWatermarkOptions à l’aide de la méthode SetText.

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);

Ajouter Un Filigrane D’Image

L’exemple de code suivant montre comment insérer un filigrane d’image dans un document en définissant ImageWatermarkOptions à l’aide de la méthode SetImage.

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);

Le filigrane peut également être inséré à l’aide de la classe de forme. Il est très facile d’insérer n’importe quelle forme ou image dans un en-tête ou un pied de page et ainsi créer un filigrane de n’importe quel type imaginable. L’exemple de code suivant insère un filigrane dans un document Word.

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;
}

Supprimer le filigrane d’un document

La classe Watermark fournit la méthode remove pour supprimer le filigrane d’un document.

L’exemple de code suivant montre comment supprimer un filigrane des 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);

Si les filigranes sont ajoutés à l’aide de l’objet de classe Shape, pour supprimer le filigrane d’un document, vous devez définir uniquement le nom de la forme de filigrane lors de l’insertion, puis supprimer la forme de filigrane par un nom attribué.

L’exemple de code suivant vous montre comment définir le nom de la forme de filigrane et la supprimer du 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;
}

Ajouter un filigrane dans la cellule du tableau

Parfois, vous devez insérer un filigrane/une image dans la cellule d’un tableau et l’afficher en dehors du tableau, vous pouvez utiliser la propriété IsLayoutInCell. Cette propriété obtient ou définit un indicateur indiquant si la forme est affichée à l’intérieur ou à l’extérieur d’un tableau. Notez que cette propriété ne fonctionne que lorsque vous optimisez le document pour Microsoft Word 2010 à l’aide de la méthode OptimizeFor.

L’exemple de code suivant montre comment utiliser cette propriété:

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);