使用形状锁在 C++ 中限制演示文稿编辑

背景

Aspose.Slides for C++ 的常见用途是作为自动化工作流的一部分创建、更新和保存 PowerPoint (PPTX) 演示文稿。当用户收到这些演示文稿时,限制对形状的更改可以帮助保留预期的布局和内容。

本文说明了形状在幻灯片上的组织方式以及如何在 PPTX 演示文稿中应用和移除形状锁。这些锁允许您对单个形状的特定编辑操作进行限制。

幻灯片的组成

演示文稿幻灯片由自动形状、表格、OLE 对象、组合形状、图片框、视频框、连接器以及用于构建演示文稿的其他元素等组件组成。在 Aspose.Slides for C++ 中,幻灯片上的每个元素都由实现IShape接口或继承自实现该接口的类的对象表示。

不同的形状类型提供不同的锁定选项。IBaseShapeLock 接口是形状锁的基础接口。Aspose.Slides for C++ 提供以下锁定接口:

要在整个Presentation中应用锁定,请遍历其幻灯片并在每个受支持的形状上设置相应的锁定。

应用和移除保护

形状锁限制诸如选择、移动和调整形状大小等操作。它们不会使整个演示文稿不可编辑。

对 PPTX 形状应用保护

Aspose.Slides for C++ 提供IShape接口以在幻灯片上处理形状。

示例对自动形状调用 true 传递给set_SelectLocked、set_PositionLocked和set_SizeLocked,并对组合形状、连接器和图片框使用等效的锁定。连接器使用set_PositionMove来限制移动;组合形状还使用set_GroupingLocked来限制组合。

示例加载现有的 PPTX 演示文稿,检查每个幻灯片的形状集合,并保存一个已应用这些限制的副本。四种处理类型之外的形状保持不变。循环不会遍历组内的子形状。

#include <DOM/IAutoShape.h>
#include <DOM/IAutoShapeLock.h>
#include <DOM/IConnector.h>
#include <DOM/IConnectorLock.h>
#include <DOM/IGroupShape.h>
#include <DOM/IGroupShapeLock.h>
#include <DOM/IPictureFrame.h>
#include <DOM/IPictureFrameLock.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"Sample.pptx");

for (auto&& slide : System::IterateOver(presentation->get_Slides()))
{
    for (auto&& shape : System::IterateOver(slide->get_Shapes()))
    {
        if (ObjectExt::Is<IAutoShape>(shape))
        {
            auto autoShape = ExplicitCast<IAutoShape>(shape);
            auto autoShapeLock = ExplicitCast<IAutoShapeLock>(autoShape->get_ShapeLock());

            autoShapeLock->set_PositionLocked(true);
            autoShapeLock->set_SelectLocked(true);
            autoShapeLock->set_SizeLocked(true);
        }
        else if (ObjectExt::Is<IGroupShape>(shape))
        {
            auto groupShape = ExplicitCast<IGroupShape>(shape);
            auto groupShapeLock = ExplicitCast<IGroupShapeLock>(groupShape->get_ShapeLock());

            groupShapeLock->set_GroupingLocked(true);
            groupShapeLock->set_PositionLocked(true);
            groupShapeLock->set_SelectLocked(true);
            groupShapeLock->set_SizeLocked(true);
        }
        else if (ObjectExt::Is<IConnector>(shape))
        {
            auto connectorShape = ExplicitCast<IConnector>(shape);
            auto connectorShapeLock = ExplicitCast<IConnectorLock>(connectorShape->get_ShapeLock());

            connectorShapeLock->set_PositionMove(true);
            connectorShapeLock->set_SelectLocked(true);
            connectorShapeLock->set_SizeLocked(true);
        }
        else if (ObjectExt::Is<IPictureFrame>(shape))
        {
            auto pictureFrame = ExplicitCast<IPictureFrame>(shape);
            auto pictureFrameLock = ExplicitCast<IPictureFrameLock>(pictureFrame->get_ShapeLock());

            pictureFrameLock->set_PositionLocked(true);
            pictureFrameLock->set_SelectLocked(true);
            pictureFrameLock->set_SizeLocked(true);
        }
    }
}

presentation->Save(u"ProtectedSample.pptx", SaveFormat::Pptx);
presentation->Dispose();

移除保护

要移除形状锁,将其值设为 false。下面的示例加载一个带有形状锁的演示文稿,并通过IAutoShapeLock、IGroupShapeLock、IConnectorLock和IPictureFrameLock清除选择、移动和大小调整限制。它还清除IGroupShapeLock::set_GroupingLocked并保存演示文稿的副本。其他锁定设置保持不变。

#include <DOM/IAutoShape.h>
#include <DOM/IAutoShapeLock.h>
#include <DOM/IConnector.h>
#include <DOM/IConnectorLock.h>
#include <DOM/IGroupShape.h>
#include <DOM/IGroupShapeLock.h>
#include <DOM/IPictureFrame.h>
#include <DOM/IPictureFrameLock.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"ProtectedSample.pptx");

for (auto&& slide : System::IterateOver(presentation->get_Slides()))
{
    for (auto&& shape : System::IterateOver(slide->get_Shapes()))
    {
        if (ObjectExt::Is<IAutoShape>(shape))
        {
            auto autoShape = ExplicitCast<IAutoShape>(shape);
            auto autoShapeLock = ExplicitCast<IAutoShapeLock>(autoShape->get_ShapeLock());

            autoShapeLock->set_PositionLocked(false);
            autoShapeLock->set_SelectLocked(false);
            autoShapeLock->set_SizeLocked(false);
        }
        else if (ObjectExt::Is<IGroupShape>(shape))
        {
            auto groupShape = ExplicitCast<IGroupShape>(shape);
            auto groupShapeLock = ExplicitCast<IGroupShapeLock>(groupShape->get_ShapeLock());

            groupShapeLock->set_GroupingLocked(false);
            groupShapeLock->set_PositionLocked(false);
            groupShapeLock->set_SelectLocked(false);
            groupShapeLock->set_SizeLocked(false);
        }
        else if (ObjectExt::Is<IConnector>(shape))
        {
            auto connectorShape = ExplicitCast<IConnector>(shape);
            auto connectorShapeLock = ExplicitCast<IConnectorLock>(connectorShape->get_ShapeLock());

            connectorShapeLock->set_PositionMove(false);
            connectorShapeLock->set_SelectLocked(false);
            connectorShapeLock->set_SizeLocked(false);
        }
        else if (ObjectExt::Is<IPictureFrame>(shape))
        {
            auto pictureFrame = ExplicitCast<IPictureFrame>(shape);
            auto pictureFrameLock = ExplicitCast<IPictureFrameLock>(pictureFrame->get_ShapeLock());

            pictureFrameLock->set_PositionLocked(false);
            pictureFrameLock->set_SelectLocked(false);
            pictureFrameLock->set_SizeLocked(false);
        }
    }
}

presentation->Save(u"RemovedProtectionSample.pptx", SaveFormat::Pptx);
presentation->Dispose();

结论

Aspose.Slides for C++ 允许您对单个形状的特定编辑操作进行限制,或在整张幻灯片中应用相同的限制。请选择每种形状类型支持的锁,并在需要移除这些限制时将其值设为 false。

常见问题

我可以在同一演示文稿中同时使用形状锁和密码保护吗?

可以。形状锁限制特定的编辑操作,而密码保护 可以限制打开或修改演示文稿。您可以在同一文件中同时使用两者。

我可以仅限制特定幻灯片的编辑而不影响其他幻灯片吗?

可以。仅对选定幻灯片上的形状应用锁定。这不会更改其他幻灯片的锁定设置。

如何对组内的单个形状应用锁定?

遍历组的get_Shapes方法返回的集合,并对每个子形状应用相应的锁定。对任何嵌套的组重复此操作。上述示例仅处理幻灯片的形状集合,因此未对组内的单个成员设置锁定。