在 Python 中向演示文稿添加水印

介绍

水印 在演示文稿中是用于幻灯片或整个演示文稿的文字或图像印记。通常,水印用于指示演示文稿是草稿(例如,“Draft”水印)、包含机密信息(例如,“Confidential”水印)、指定所属公司(例如,“Company Name”水印)、标识演示文稿作者等。水印通过表明演示文稿不应被复制来帮助防止版权侵权。水印在 PowerPoint 和 OpenOffice 演示文稿格式中均可使用。在 Aspose.Slides 中,您可以向 PowerPoint PPT、PPTX 和 OpenOffice ODP 文件格式添加水印。

Aspose.Slides,您可以通过多种方式在 PowerPoint 或 OpenOffice 文档中创建水印并修改其设计和行为。共通点是,要添加文字水印,应使用 TextFrame 类;要添加图片水印,则使用 PictureFrame 类或用图片填充水印形状。PictureFrame 继承自 Shape 类,您可以使用形状对象的所有灵活设置。由于 TextFrame 不是形状且其设置受限,它被包装在一个 Shape 对象中。

水印有两种应用方式:应用于单个幻灯片或应用于所有演示文稿幻灯片。Slide Master 用于将水印应用于所有幻灯片——水印被添加到 Slide Master,上面完整设计后,自动应用到所有幻灯片,而不会影响对单个幻灯片上水印的修改权限。

水印通常被视为其他用户不可编辑的对象。为防止水印(或更准确地说其父形状)被编辑,Aspose.Slides 提供了形状锁定功能。特定形状可以在普通幻灯片或在 Slide Master 上锁定。当在 Slide Master 上锁定水印形状时,它将在所有演示文稿幻灯片上保持锁定。

您可以为水印设置名称,以便将来需要删除时能够通过名称在幻灯片的形状集合中找到它。

您可以以任意方式设计水印;不过水印通常具备一些共同特性,例如居中对齐、旋转、前置等。下面的示例将演示如何使用这些特性。

文字水印

在幻灯片上添加文字水印

要在 PPT、PPTX 或 ODP 中添加文字水印,首先向幻灯片添加一个形状,然后在该形状上添加文本框。文本框由 TextFrame 类表示。该类型未继承自 Shape,后者拥有丰富的属性用于灵活定位水印。因此,TextFrame 对象被包装在一个 AutoShape 对象中。要向形状添加水印文字,请使用如下所示的 addTextFrame 方法。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

watermark_text = "CONFIDENTIAL"
presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_frame = watermark_shape.addTextFrame(watermark_text)
finally:
    presentation.dispose()

在演示文稿中添加文字水印

如果想一次性为整个演示文稿(即所有幻灯片)添加文字水印,请将其添加到 MasterSlide 中。其余逻辑与向单个幻灯片添加水印相同——创建一个 AutoShape 对象,然后使用 addTextFrame 方法将水印添加进去。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

watermark_text = "CONFIDENTIAL"
presentation = Presentation()
try:
    master_slide = presentation.getMasters().get_Item(0)
    watermark_shape = master_slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_frame = watermark_shape.addTextFrame(watermark_text)
finally:
    presentation.dispose()

设置水印形状透明度

默认情况下,矩形形状带有填充和线条颜色。下面的代码行将形状设为透明。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, FillType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_shape.getFillFormat().setFillType(FillType.NoFill)
    watermark_shape.getLineFormat().getFillFormat().setFillType(FillType.NoFill)
finally:
    presentation.dispose()

设置文字水印的字体

您可以按下面的示例更改文字水印的字体。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, FontData

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_frame = watermark_shape.addTextFrame("CONFIDENTIAL")
    text_format = watermark_frame.getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat()
    font = FontData("Arial")
    text_format.setLatinFont(font)
    text_format.setFontHeight(50)
finally:
    presentation.dispose()

设置水印文字颜色

要设置水印文字的颜色,请使用以下代码:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, FillType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_frame = watermark_shape.addTextFrame("CONFIDENTIAL")
    alpha, red, green, blue = 150, 200, 200, 200
    fill_format = watermark_frame.getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat().getFillFormat()
    fill_format.setFillType(FillType.Solid)
    color = Color(red, green, blue, alpha)
    fill_format.getSolidFillColor().setColor(color)
finally:
    presentation.dispose()

居中文本水印

可以将水印居中显示在幻灯片上,代码如下:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

watermark_text = "CONFIDENTIAL"
presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    slide_size = presentation.getSlideSize().getSize()
    watermark_width = 400
    watermark_height = 40
    watermark_x = (slide_size.getWidth() - watermark_width) / 2
    watermark_y = (slide_size.getHeight() - watermark_height) / 2
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, watermark_x, watermark_y, watermark_width, watermark_height)
    watermark_frame = watermark_shape.addTextFrame(watermark_text)
finally:
    presentation.dispose()

下面的图片展示了最终效果。

文字水印

图片水印

在演示文稿中添加图片水印

要向演示文稿的幻灯片添加图片水印,可以按下面的步骤进行:

import jpype
import asposeslides
from pathlib import Path

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, FillType, PictureFillMode

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    image_data = Path("watermark.png").read_bytes()
    image = presentation.getImages().addImage(jpype.JArray(jpype.JByte)(image_data))
    watermark_shape.getFillFormat().setFillType(FillType.Picture)
    watermark_shape.getFillFormat().getPictureFillFormat().getPicture().setImage(image)
    watermark_shape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch)
finally:
    presentation.dispose()

锁定水印防止编辑

如果需要防止水印被编辑,可对形状调用 AutoShape.getAutoShapeLock 方法。使用该属性可以保护形状不被选中、调整大小、重新定位、与其他元素组合、锁定其文字编辑等:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    # 将水印形状锁定,防止被修改。
    watermark_shape.getAutoShapeLock().setSelectLocked(True)
    watermark_shape.getAutoShapeLock().setSizeLocked(True)
    watermark_shape.getAutoShapeLock().setTextLocked(True)
    watermark_shape.getAutoShapeLock().setPositionLocked(True)
    watermark_shape.getAutoShapeLock().setGroupingLocked(True)
finally:
    presentation.dispose()

将水印置于前面

在 Aspose.Slides 中,可通过 ShapeCollection.reorder 方法设置形状的 Z 顺序。调用该方法时,需要从幻灯片的形状集合中传入形状引用和目标顺序号,从而实现将形状置于前面或发送到后面。此功能在需要将水印放置在演示文稿最前面的场景下尤为有用:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    shape_count = slide.getShapes().size()
    slide.getShapes().reorder(shape_count - 1, watermark_shape)
finally:
    presentation.dispose()

设置水印旋转

以下代码示例演示了如何调整水印的旋转角度,使其斜斜地跨越幻灯片:

import jpype
import asposeslides
import math

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    slide_size = presentation.getSlideSize().getSize()
    diagonal_angle = math.atan((slide_size.getHeight() / slide_size.getWidth())) * 180 / math.pi
    watermark_shape.setRotation(diagonal_angle)
finally:
    presentation.dispose()

为水印设置名称

Aspose.Slides 允许为形状设置名称。通过形状名称,您可以在以后访问它以进行修改或删除。要为水印形状设置名称,请将其传递给 Shape.setName 方法:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    watermark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 400, 40)
    watermark_shape.setName("watermark")
finally:
    presentation.dispose()

移除水印

要移除水印形状,首先使用 Shape.getName 方法在幻灯片形状集合中找到它,然后将该形状传入 ShapeCollection.remove 方法:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    slide_shapes = slide.getShapes().toArray()
    for shape in slide_shapes:
        if shape.getName() == "watermark":
            slide.getShapes().remove(shape)
finally:
    presentation.dispose()

常见问题

什么是水印,为什么要使用它?

水印是覆盖在幻灯片上的文字或图像,用于保护知识产权、提升品牌识别度或防止演示文稿被未经授权使用。

我可以为演示文稿的所有幻灯片添加水印吗?

可以,Aspose.Slides 允许通过编程方式为演示文稿的每一张幻灯片添加水印。您可以遍历所有幻灯片并逐个应用水印设置。

如何调整水印的透明度?

您可以通过修改形状的填充设置(getFillFormat)来调整水印的透明度,从而使水印保持低调且不干扰幻灯片内容。

支持哪些图片格式作为水印?

Aspose.Slides 支持多种图片格式,包括 PNG、JPEG、GIF、BMP、SVG 等。

我可以自定义文字水印的字体和样式吗?

可以,您可以选择任意字体、字号和样式,以匹配演示文稿的设计并保持品牌一致性。

如何更改水印的位置或方向?

您可以通过编程方式修改形状的坐标、尺寸和旋转属性来调整水印的位置和方向。