Работа с водяными знаками

В этом разделе обсуждается, как программно работать с водяным знаком с помощью Aspose.Words. Водяной знак - это фоновое изображение, которое отображается за текстом в документе. Водяной знак может содержать текст или изображение, представленные классом Watermark.

Добавление водяного знака к документу

В Microsoft Word водяной знак можно легко вставить в документ с помощью команды Вставить водяной знак. Aspose.Words предоставляет класс watermark для добавления или удаления водяных знаков в документах. Aspose.Words содержит перечисление WatermarkType, определяющее три возможных типа водяных знаков (текст, изображение и без водяных знаков) для работы.

Добавить текстовый водяной знак

В следующем примере кода показано, как вставить текстовый водяной знак в документ, определив TextWatermarkOptions с помощью метода 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");

Добавить водяной знак на изображение

В следующем примере кода показано, как вставить водяной знак изображения в документ, определив ImageWatermarkOptions с помощью метода 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");

Водяной знак также можно вставить с помощью класса shape. Очень легко вставить любую фигуру или изображение в верхний или нижний колонтитул и, таким образом, создать водяной знак любого мыслимого типа.

В следующем примере кода водяной знак вставляется в документ 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));
}

Удаление водяного знака из документа

Класс Watermark предоставляет метод Remove для удаления водяного знака с документа.

В следующих примерах кода показано, как удалить водяной знак с документов:

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

Чтобы удалить водяной знак из документа, вам необходимо задать только название формы водяного знака во время вставки, а затем удалить форму водяного знака с помощью назначенного имени.

В следующем примере кода показано, как задать название формы водяного знака и удалить его из документа:

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

Добавление водяного знака в ячейку таблицы

Иногда вам нужно вставить водяной знак/изображение в ячейку таблицы и отобразить его за пределами таблицы, вы можете использовать свойство IsLayoutInCell. Это свойство возвращает или устанавливает флаг, указывающий, отображается ли фигура внутри таблицы или за ее пределами. Обратите внимание, что это свойство работает только при оптимизации документа для Microsoft Word 2010 года с использованием метода OptimizeFor.

В следующем примере кода показано, как использовать это свойство:

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