Lavorare con Watermark
In questo argomento viene illustrato come lavorare a livello di programmazione con la filigrana utilizzando Aspose.Words. Una filigrana è un’immagine di sfondo che viene visualizzata dietro il testo di un documento. Una filigrana può contenere un testo o un’immagine rappresentata dalla classe Watermark.
Aggiungere una filigrana a un documento
In Microsoft Word, una filigrana può essere facilmente inserita in un documento utilizzando il comando Inserisci filigrana. Aspose.Words fornisce la classe watermark per aggiungere o rimuovere la filigrana nei documenti. Aspose.Words fornisce l’enumerazione WatermarkType che definisce tre possibili tipi di filigrane (Testo, Immagine e Nessuna) con cui lavorare.
Aggiungi filigrana di testo
Nell’esempio di codice seguente viene illustrato come inserire una filigrana di testo in un documento definendo TextWatermarkOptions utilizzando il metodo 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); |
Aggiungi Filigrana immagine
Nell’esempio di codice seguente viene illustrato come inserire una filigrana di immagine in un documento definendo ImageWatermarkOptions utilizzando il metodo 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); |
La filigrana può anche essere inserita usando la classe shape. È molto facile inserire qualsiasi forma o immagine in un’intestazione o piè di pagina e quindi creare una filigrana di qualsiasi tipo immaginabile. L’esempio di codice seguente inserisce una filigrana in un documento di 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; | |
} |
Rimuovere la filigrana da un documento
La classe Watermark fornisce il metodo remove per rimuovere la filigrana da un documento.
Il seguente esempio di codice mostra come rimuovere una filigrana dai documenti:
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); |
Se le filigrane vengono aggiunte utilizzando l’oggetto classe Shape, per rimuovere la filigrana da un documento è necessario impostare solo il nome della forma della filigrana durante l’inserimento e quindi rimuovere la forma della filigrana con un nome assegnato.
L’esempio di codice seguente mostra come impostare il nome della forma della filigrana e rimuoverla dal documento:
// 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; | |
} |
Aggiungere una filigrana nella cella della tabella
A volte è necessario inserire una filigrana/immagine nella cella di una tabella e visualizzarla all’esterno della tabella, è possibile utilizzare la proprietà IsLayoutInCell. Questa proprietà ottiene o imposta un flag che indica se la forma viene visualizzata all’interno di una tabella o all’esterno di essa. Si noti che questa proprietà funziona solo quando si ottimizza il documento per Microsoft Word 2010 utilizzando il metodo OptimizeFor.
Il seguente esempio di codice mostra come utilizzare questa proprietà:
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); |