在 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 等。
我可以自定义文字水印的字体和样式吗?
可以,您可以选择任意字体、字号和样式,以匹配演示文稿的设计并保持品牌一致性。
如何更改水印的位置或方向?
您可以通过编程方式修改形状的坐标、尺寸和旋转属性来调整水印的位置和方向。