Trabalhando com marca D'água

Este tópico discute como trabalhar programaticamente com uma marca d’água usando Aspose.Words. Uma marca d’água é uma imagem de fundo que é exibida atrás do texto em um documento. Uma marca d’água pode conter um texto ou uma imagem representada pela classe Watermark.

Adicionar uma marca D’água a um documento

Em Microsoft Word, uma marca d’água pode ser facilmente inserida em um documento usando o comando Inserir marca d’água. Aspose.Words fornece a classe watermark para adicionar ou remover marca d’água em documentos. Aspose.Words fornece a enumeração WatermarkTypedefinindo três tipos possíveis de marcas d’água (texto, imagem e nenhum) para trabalhar.

Adicionar Marca D’Água De Texto

O exemplo de código a seguir demonstra como inserir uma marca d’água de texto em um documento definindo TextWatermarkOptions usando o método SetText:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "Document.doc");
TextWatermarkOptions options = new TextWatermarkOptions();
options.setFontFamily("Arial");
options.setFontSize(36);
options.setColor(Color.BLACK);
options.setLayout(WatermarkLayout.HORIZONTAL);
options.isSemitrasparent(false);
doc.getWatermark().setText("Test", options);
doc.save(dataDir + "AddTextWatermark_out.docx");

Adicionar Marca D’Água De Imagem

O exemplo de código a seguir demonstra como inserir uma marca d’água de imagem em um documento definindo ImageWatermarkOptions usando o método SetImage:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "Document.doc");
ImageWatermarkOptions options = new ImageWatermarkOptions();
options.setScale(5);
options.isWashout(false);
ImageInputStream stream = ImageIO.createImageInputStream(new File(dataDir + "Watermark.png"));
doc.getWatermark().setImage(ImageIO.read(stream), options);
doc.save(dataDir + "AddImageWatermark_out.docx");

A marca d’água também pode ser inserida usando a classe shape. É muito fácil inserir qualquer forma ou imagem em um cabeçalho ou rodapé e, assim, criar uma marca d’água de qualquer tipo imaginável.

O exemplo de código a seguir insere uma marca d’água em um documento do Word:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
@Test
public void addWatermark() throws Exception
{
Document doc = new Document(getMyDir() + "Document.docx");
insertWatermarkText(doc, "CONFIDENTIAL");
doc.save(getArtifactsDir() + "WorkWithWatermark.AddWatermark.docx");
}
/// <summary>
/// Inserts a watermark into a document.
/// </summary>
/// <param name="doc">The input document.</param>
/// <param name="watermarkText">Text of the watermark.</param>
private void insertWatermarkText(Document doc, String watermarkText) throws Exception
{
// Create a watermark shape, this will be a WordArt shape.
Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT); { watermark.setName("Watermark"); }
watermark.getTextPath().setText(watermarkText);
watermark.getTextPath().setFontFamily("Arial");
watermark.setWidth(500.0);
watermark.setHeight(100.0);
// Text will be directed from the bottom-left to the top-right corner.
watermark.setRotation(-40);
// Remove the following two lines if you need a solid black text.
watermark.setFillColor(Color.GRAY);
watermark.setStrokeColor(Color.GRAY);
// Place the watermark in the page center.
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.setWrapType(WrapType.NONE);
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
// Create a new paragraph and append the watermark to this paragraph.
Paragraph watermarkPara = new Paragraph(doc);
watermarkPara.appendChild(watermark);
// Insert the watermark into all headers of each document section.
for (Section sect : (Iterable<Section>) doc.getSections())
{
// There could be up to three different headers in each section.
// Since we want the watermark to appear on all pages, insert it into all headers.
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
}
}
private void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect,
/*HeaderFooterType*/int headerType)
{
HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
if (header == null)
{
// There is no header of the specified type in the current section, so we need to create it.
header = new HeaderFooter(sect.getDocument(), headerType);
sect.getHeadersFooters().add(header);
}
// Insert a clone of the watermark into the header.
header.appendChild(watermarkPara.deepClone(true));
}

Remover marca D’água de um documento

A classe Watermark fornece o método Remove Para remover a marca d’água de um documento.

Os exemplos de código a seguir mostram como remover uma marca d’água de documentos:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "AddTextWatermark_out.docx");
if (doc.getWatermark().getType() == WatermarkType.TEXT) {
doc.getWatermark().remove();
}
doc.save(dataDir + "RemoveWatermark_out.docx");

Para remover a marca d’água de um documento, você deve definir apenas o nome da forma da marca d’água durante a inserção e, em seguida, remover a forma da marca d’água por um nome atribuído.

O exemplo de código a seguir mostra como definir o nome da forma da marca d’água e removê-la do documento:

// Set name to be able to remove it afterwards
watermark.Name("WaterMark");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static final String dataDir = Utils.getDataDir(RemoveWatermark.class);
public static void main(String[] args) throws Exception {
Document doc = new Document(dataDir + "RemoveWatermark.docx");
removeWatermarkText(doc);
doc.save(dataDir + "RemoveWatermark_out.doc");
}
private static void removeWatermarkText(Document doc) throws Exception {
for (HeaderFooter hf : (Iterable<HeaderFooter>) doc.getChildNodes(NodeType.HEADER_FOOTER, true)) {
for (Shape shape : (Iterable<Shape>) hf.getChildNodes(NodeType.SHAPE, true)) {
if (shape.getName().contains("WaterMark"))
shape.remove();
}
}
}

Adicionar uma marca D’água a uma célula da tabela

Às vezes, você precisa inserir uma marca d’água/Imagem na célula de uma tabela e exibi-la fora da tabela, você pode usar a propriedade IsLayoutInCell. Esta propriedade obtém ou define um sinalizador indicando se a forma é exibida dentro ou fora de uma tabela. Observe que essa propriedade só funciona quando você otimiza o documento para Microsoft Word 2010 usando o método OptimizeFor.

O exemplo de código a seguir mostra como usar essa propriedade:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "LayoutInCell.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.isLayoutInCell(false); // Display the shape outside of table cell if it will be placed into a cell.
watermark.setWidth(300);
watermark.setHeight(70);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setRotation(-40);
watermark.getFill().setColor(Color.GRAY);
watermark.setStrokeColor(Color.GRAY);
watermark.getTextPath().setText("watermarkText");
watermark.getTextPath().setFontFamily("Arial");
watermark.setName("WaterMark_0");
watermark.setWrapType(WrapType.NONE);
Run run = (Run) doc.getChildNodes(NodeType.RUN, true).get(doc.getChildNodes(NodeType.RUN, true).getCount() - 1);
builder.moveTo(run);
builder.insertNode(watermark);
doc.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2010);
// Save the document to disk.
dataDir = dataDir + "Shape_IsLayoutInCell_out.docx";
doc.save(dataDir);