Управление комментариями презентации в C++

В PowerPoint комментарий отображается как заметка или аннотация на слайде. При щелчке по комментарии его содержимое или сообщения раскрываются.

Зачем добавлять комментарии к презентациям?

Возможно, вы захотите использовать комментарии для предоставления обратной связи или общения с коллегами при просмотре презентаций.

Чтобы вы могли использовать комментарии в презентациях PowerPoint, Aspose.Slides for C++ предоставляет

  • Класс Presentation, который содержит коллекции авторов (из метода get_CommentAuthors()). Авторы добавляют комментарии к слайдам.
  • Интерфейс ICommentCollection, который содержит коллекцию комментариев для отдельных авторов.
  • Класс IComment, который содержит информацию об авторах и их комментариях: кто добавил комментарий, время его добавления, позиция комментария и т.д.
  • Класс CommentAuthor, который содержит информацию об отдельных авторах: имя автора, его инициалы, комментарии, связанные с именем автора, и т.д.

Добавить комментарий к слайду

Этот код C++ показывает, как добавить комментарий к слайду в презентации PowerPoint:

// Создает экземпляр класса Presentation
auto presentation = System::MakeObject<Presentation>();
// Добавляет пустой слайд
presentation->get_Slides()->AddEmptySlide(presentation->get_LayoutSlides()->idx_get(0));

// Добавляет автора
auto author = presentation->get_CommentAuthors()->AddAuthor(u"Jawad", u"MF");

// Устанавливает позицию комментариев
PointF point;
point.set_X(0.2f);
point.set_Y(0.2f);

// Получает ISlide 1
auto slide1 = presentation->get_Slides()->idx_get(0);
// Получает ISlide 2
auto slide2 = presentation->get_Slides()->idx_get(1);

// Добавляет комментарий к слайду для автора на слайде 1
author->get_Comments()->AddComment(u"Hello Jawad, this is slide comment", slide1, point, DateTime::get_Now());

// Добавляет комментарий к слайду для автора на слайде 2
author->get_Comments()->AddComment(u"Hello Jawad, this is second slide comment", slide2, point, DateTime::get_Now());

// Если в качестве аргумента передан null, комментарии от всех авторов выводятся на выбранный слайд
auto comments = slide1->GetSlideComments(author);

// Accesses the comment at index 0 for slide 1
String str = comments[0]->get_Text();

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

if (comments->GetLength(0) > 0)
{
    // Выбирает коллекцию комментариев автора по индексу 0
    auto commentCollection = comments[0]->get_Author()->get_Comments();
    String Comment = commentCollection->idx_get(0)->get_Text();
}

Доступ к комментариям слайда

Этот код C++ показывает, как получить доступ к существующему комментарию на слайде в презентации PowerPoint:

// Создает экземпляр класса Presentation
auto presentation = System::MakeObject<Presentation>(u"Comments1.pptx");

for (auto&& commentAuthor : presentation->get_CommentAuthors())
{
    auto author = System::ExplicitCast<CommentAuthor>(commentAuthor);
    for (auto&& comment1 : System::IterateOver(author->get_Comments()))
    {
        SmartPtr<Comment> comment = System::ExplicitCast<Comment>(comment1);
        Console::WriteLine(String(u"ISlide :")
                        + comment->get_Slide()->get_SlideNumber()
                        + u" has comment: " + comment->get_Text()
                        + u" with Author: " + comment->get_Author()->get_Name()
                        + u" posted on time :" + comment->get_CreatedTime() + u"\n");
    }
}

Ответы на комментарии

Родительский комментарий — это верхний или оригинальный комментарий в иерархии комментариев или ответов. С помощью свойства ParentComment (из интерфейса IComment) можно установить или получить родительский комментарий.

Этот код C++ показывает, как добавить комментарии и получить ответы на них:

auto pres = System::MakeObject<Presentation>();

// Получает ISlide 1
auto slide1 = pres->get_Slides()->idx_get(0);

// Добавляет комментарий
auto author1 = pres->get_CommentAuthors()->AddAuthor(u"Author_1", u"A.A.");
auto comment1 = author1->get_Comments()->AddComment(u"comment1", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());

// Добавляет ответ к comment1
auto author2 = pres->get_CommentAuthors()->AddAuthor(u"Autror_2", u"B.B.");
auto reply1 = author2->get_Comments()->AddComment(u"reply 1 for comment 1", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());
reply1->set_ParentComment(comment1);

// Добавляет еще один ответ к comment1
auto reply2 = author2->get_Comments()->AddComment(u"reply 2 for comment 1", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());
reply2->set_ParentComment(comment1);

// Добавляет ответ к существующему ответу
auto subReply = author1->get_Comments()->AddComment(u"subreply 3 for reply 2", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());
subReply->set_ParentComment(reply2);

auto comment2 = author2->get_Comments()->AddComment(u"comment 2", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());
auto comment3 = author2->get_Comments()->AddComment(u"comment 3", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());

auto reply3 = author1->get_Comments()->AddComment(u"reply 4 for comment 3", slide1, PointF(10.0f, 10.0f), DateTime::get_Now());
reply3->set_ParentComment(comment3);

// Отображает иерархию комментариев в консоли
auto comments = slide1->GetSlideComments(nullptr);
for (int32_t i = 0; i < comments->get_Length(); i++)
{
    auto comment = comments[i];
    while (comment->get_ParentComment() != nullptr)
    {
        Console::Write(u"\t");
        comment = comment->get_ParentComment();
    }

    Console::Write(u"{0} : {1}", comments[i]->get_Author()->get_Name(), comments[i]->get_Text());
    Console::WriteLine();
}

pres->Save(u"parent_comment.pptx", SaveFormat::Pptx);

// Удаляет comment1 и все ответы к нему
comment1->Remove();

pres->Save(u"remove_comment.pptx", SaveFormat::Pptx);

Добавить современный комментарий

В 2021 году Microsoft представила современные комментарии в PowerPoint. Функция современных комментариев существенно улучшает совместную работу в PowerPoint. С помощью современных комментариев пользователи PowerPoint могут отмечать комментарии как решённые, привязывать комментарии к объектам и тексту и гораздо проще взаимодействовать.

В Aspose Slides for C++ 21.11 мы реализовали поддержку современных комментариев, добавив класс ModernComment. В класс CommentCollection были добавлены методы AddModernComment и InsertModernComment.

Этот код C++ показывает, как добавить современный комментарий к слайду в презентации PowerPoint:

auto pres = System::MakeObject<Presentation>();
// Получает ISlide 1
auto slide1 = pres->get_Slides()->idx_get(0);

auto newAuthor = pres->get_CommentAuthors()->AddAuthor(u"Some Author", u"SA");
auto modernComment = newAuthor->get_Comments()->AddModernComment(u"This is a modern comment", slide1, nullptr, PointF(100.0f, 100.0f), DateTime::get_Now());

pres->Save(u"pres.pptx", SaveFormat::Pptx);

Удалить комментарий

Удалить все комментарии и авторов

Этот код C++ показывает, как удалить все комментарии и авторов в презентации:

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

auto presentation = System::MakeObject<Presentation>(u"example.pptx");

// Удаляет все комментарии из презентации
for (auto author : presentation->get_CommentAuthors())
{
    author->get_Comments()->Clear();
}
        
// Удаляет всех авторов
presentation->get_CommentAuthors()->Clear();
presentation->Save(u"example_out.pptx", SaveFormat::Pptx);

Удалить конкретные комментарии

Этот код C++ показывает, как удалить конкретные комментарии на слайде:

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

auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slides()->idx_get(0);
        
// добавить комментарии...
auto author = presentation->get_CommentAuthors()->AddAuthor(u"Author", u"A");
author->get_Comments()->AddComment(u"comment 1", slide, PointF(0.2f, 0.2f), System::DateTime::get_Now());
author->get_Comments()->AddComment(u"comment 2", slide, PointF(0.3f, 0.2f), System::DateTime::get_Now());
        
// удалить все комментарии, содержащие текст "comment 1"
for (auto commentAuthor : presentation->get_CommentAuthors())
{
    auto toRemove = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<IComment>>>();
    for (auto comment : slide->GetSlideComments(commentAuthor))
    {
        if (comment->get_Text() == u"comment 1")
        {
            toRemove->Add(comment);
        }
    }
    for (auto comment : toRemove)
    {
        commentAuthor->get_Comments()->Remove(comment);
    }
}
        
presentation->Save(u"pres.pptx", SaveFormat::Pptx);

Часто задаваемые вопросы

Поддерживает ли Aspose.Slides статус, например «решён», для современных комментариев?

Да. Современные комментарии предоставляют методы get_Status и set_Status; вы можете читать и задавать состояние комментария (например, пометить его как решённое), и это состояние сохраняется в файле и распознаётся PowerPoint.

Поддерживаются ли ветвленные обсуждения (цепочки ответов) и существует ли ограничение глубины вложения?

Да. Каждый комментарий может ссылаться на свой родительский комментарий, что позволяет создавать произвольные цепочки ответов. API не объявляет конкретного ограничения глубины вложения.

В какой системе координат определяется позиция маркера комментария на слайде?

Позиция хранится как точка с плавающей запятой в системе координат слайда. Это позволяет разместить маркер комментария точно там, где это необходимо.