Praca ze znakiem wodnym

W tym temacie omówiono programową pracę ze znakiem wodnym przy użyciu Aspose.Words. Znak wodny to obraz tła wyświetlany za tekstem w dokumencie. Znak wodny może zawierać tekst lub obraz reprezentowany przez klasę Watermark.

Dodawanie znaku wodnego do dokumentu

W Microsoft Word Znak wodny można łatwo wstawić do dokumentu za pomocą polecenia Wstaw Znak wodny. Aspose.Words zapewnia klasę watermark do dodawania lub usuwania znaku wodnego w dokumentach. Aspose.Words zapewnia wyliczenie WatermarkType definiujące trzy możliwe typy znaków wodnych (tekst, obraz i brak) do pracy.

Dodaj Tekstowy Znak Wodny

Poniższy przykład kodu pokazuje, jak wstawić tekstowy znak wodny do dokumentu, definiując TextWatermarkOptions przy użyciu metody 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);

Dodaj Znak Wodny Obrazu

Poniższy przykład kodu pokazuje, jak wstawić znak wodny obrazu do dokumentu, definiując ImageWatermarkOptions przy użyciu metody 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);

Znak wodny można również wstawić za pomocą klasy kształtu. Bardzo łatwo jest wstawić dowolny kształt lub obraz do nagłówka lub stopki, a tym samym utworzyć znak wodny dowolnego możliwego typu. Poniższy przykład kodu wstawia znak wodny do dokumentu 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;
}

Usuń znak wodny z dokumentu

Klasa Watermark zapewnia metodę usuwania, aby usunąć znak wodny z dokumentu.

Poniższy przykład kodu pokazuje, jak usunąć znak wodny z dokumentów:

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

Jeśli znaki wodne są dodawane za pomocą obiektu klasy Shape, aby usunąć znak wodny z dokumentu, musisz ustawić tylko nazwę kształtu znaku wodnego podczas wstawiania, a następnie usunąć kształt znaku wodnego za pomocą przypisanej nazwy.

Poniższy przykład kodu pokazuje, jak ustawić nazwę kształtu znaku wodnego i usunąć go z dokumentu:

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

Dodaj znak wodny w komórce tabeli

Czasami musisz wstawić znak wodny / obraz do komórki tabeli i wyświetlić go poza tabelą, możesz użyć właściwości IsLayoutInCell. Ta Właściwość pobiera lub ustawia flagę wskazującą, czy kształt jest wyświetlany wewnątrz tabeli, czy poza nią. Zauważ, że ta właściwość działa tylko wtedy, gdy zoptymalizujesz dokument dla Microsoft Word 2010 przy użyciu metody OptimizeFor.

Poniższy przykład kodu pokazuje, jak korzystać z tej właściwości:

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