Gérer les espaces réservés de la présentation en C++
Vue d’ensemble
Un espace réservé est une forme qui réserve une position pour un type particulier de contenu dans un modèle de présentation. Les exemples courants sont les espaces réservés de titre, de corps, d’image, de graphique et de contenu à usage général. Contrairement à une forme ordinaire, un espace réservé peut hériter de sa position, de sa taille, de son formatage et d’autres paramètres d’une diapositive de mise en page ou d’une diapositive maître.
Aspose.Slides expose les informations d’espace réservé via la méthode IShape::get_Placeholder. La méthode renvoie un objet IPlaceholder ou nullptr pour une forme normale. Utilisez IPlaceholder::get_Type pour déterminer ce que l’espace réservé est censé contenir.
La interface de forme reste pertinente après avoir connu le type d’espace réservé :
- Un espace réservé de texte, d’image, de graphique ou de contenu vide est généralement représenté par un IAutoShape.
- Un espace réservé d’image rempli peut être représenté par un IPictureFrame.
- Un espace réservé de graphique rempli peut être représenté par un IChart.
- Un espace réservé de contenu peut contenir plusieurs types de contenu. Vérifiez à la fois IPlaceholder::get_Type et l’interface de forme d’exécution au lieu de supposer que chaque espace réservé est un IAutoShape.
Warning
IPlaceholder::get_Type décrit le rôle d’un espace réservé ; il ne garantit pas le type d’exécution de la forme. Effectuez toujours une vérification de type avant d’accéder aux membres texte, image, graphique, tableau ou média spécifiques.Comprendre l’héritage des espaces réservés
Les espaces réservés forment une hiérarchie :
- Une diapositive maître définit des styles réutilisables et, dans certains cas, des espaces réservés au niveau du maître.
- Une diapositive de mise en page définit la disposition utilisée par une ou plusieurs diapositives normales et peut hériter du maître.
- Une diapositive normale contient les espaces réservés de cette diapositive et peut hériter de sa mise en page.
Appelez IShape::GetBasePlaceholder pour remonter d’un niveau dans cette hiérarchie. Un espace réservé de diapositive renvoie normalement son espace réservé de mise en page ; un espace réservé de mise en page peut renvoyer son espace réservé maître. La méthode renvoie nullptr lorsque la forme n’a pas d’espace réservé de base.
L’exemple suivant répertorie les espaces réservés de la première diapositive et indique leurs espaces réservés de base :
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/console.h>
#include <system/type_info.h>
using namespace Aspose::Slides;
using namespace System;
auto presentation = MakeObject<Presentation>(u"template.pptx");
auto slide = presentation->get_Slide(0);
for (auto&& shape : slide->get_Shapes())
{
auto placeholder = shape->get_Placeholder();
if (placeholder == nullptr)
{
continue;
}
auto placeholderType = placeholder->get_Type();
auto typeName = shape->GetType().get_Name();
Console::WriteLine(u"Slide placeholder: {0}; shape interface: {1}", placeholderType, typeName);
auto layoutPlaceholder = shape->GetBasePlaceholder();
if (layoutPlaceholder != nullptr)
{
auto layoutPlaceholderInfo = layoutPlaceholder->get_Placeholder();
if (layoutPlaceholderInfo != nullptr)
{
auto layoutPlaceholderType = layoutPlaceholderInfo->get_Type();
Console::WriteLine(u" Layout placeholder: {0}", layoutPlaceholderType);
}
auto masterPlaceholder = layoutPlaceholder->GetBasePlaceholder();
if (masterPlaceholder != nullptr)
{
auto masterPlaceholderInfo = masterPlaceholder->get_Placeholder();
if (masterPlaceholderInfo != nullptr)
{
auto masterPlaceholderType = masterPlaceholderInfo->get_Type();
Console::WriteLine(u" Master placeholder: {0}", masterPlaceholderType);
}
}
}
}
La modification d’un espace réservé sur une diapositive normale crée ou modifie une substitution locale pour cette diapositive. La modification de la mise en page ou du maître associé peut affecter toutes les diapositives qui héritent encore de ce paramètre. Une forme ordinaire locale n’a pas d’espace réservé de base et ne commence pas à hériter simplement parce qu’elle occupe les mêmes coordonnées.
Supprimer le statut d’espace réservé
Lors de l’adaptation d’un modèle, utilisez IShape::RemovePlaceholder pour conserver un objet existant en tant que forme ordinaire. Sa méthode IShape::get_Placeholder renvoie nullptr, mais la forme reste dans la collection de la diapositive. En revanche, IShapeCollection::Remove supprime la forme de cette collection.
L’exemple suivant nécessite template.pptx contenant au moins une diapositive et un espace réservé de texte non vide sur la première diapositive. Utilisez un espace réservé avec un formatage hérité de sa mise en page ou de son maître pour observer l’effet de la suppression de cette relation. L’exemple vérifie que la même forme reste, appelle à nouveau la méthode sur la forme désormais ordinaire, et enregistre le résultat.
Warning
La suppression du statut d’espace réservé ne préserve pas automatiquement les paramètres d’apparence hérités. L’exemple ci‑dessous laisse délibérément ces paramètres inchangés, de sorte que la sortie peut différer. Une forme dont la position et la taille sont entièrement héritées peut avoir des coordonnées et des dimensions nulles après l’appel et devenir invisible même si elle reste dans la collection.#include <DOM/IAutoShape.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"template.pptx");
auto slide = presentation->get_Slide(0);
auto found = false;
for (auto index = 0; index < slide->get_Shapes()->get_Count(); index++)
{
auto currentShape = slide->get_Shape(index);
if (!ObjectExt::Is<IAutoShape>(currentShape))
{
continue;
}
auto shape = ExplicitCast<IAutoShape>(currentShape);
auto textFrame = shape->get_TextFrame();
if (shape->get_Placeholder() == nullptr ||
textFrame == nullptr ||
String::IsNullOrEmpty(textFrame->get_Text()))
{
continue;
}
auto shapeCount = slide->get_Shapes()->get_Count();
shape->RemovePlaceholder();
Console::WriteLine(u"Placeholder removed: {0}", shape->get_Placeholder() == nullptr);
Console::WriteLine(u"Same shape retained: {0}", slide->get_Shape(index) == currentShape);
Console::WriteLine(u"Shape count unchanged: {0}", slide->get_Shapes()->get_Count() == shapeCount);
// Appeler la méthode sur une forme ordinaire n'a aucun effet.
shape->RemovePlaceholder();
found = true;
break;
}
if (found)
{
presentation->Save(u"placeholder-status-removed.pptx", SaveFormat::Pptx);
}
else
{
Console::WriteLine(u"No nonempty text placeholder was found on the first slide.");
}
Pour un espace réservé correspondant, les trois vérifications affichent True. Le texte reste, mais la position, la taille, la rotation, la police, l’alignement du paragraphe, les marges du cadre de texte, l’ancrage vertical, le remplissage et les paramètres de ligne hérités peuvent changer lorsque la relation d’espace réservé est supprimée. Par exemple, le formatage de titre hérité peut revenir à un formatage de texte ordinaire. Consultez Mise en page pour plus d’informations sur les mises en page.
Pour conserver l’apparence prévue, capturez la position, la taille et la rotation résolues avant l’appel, et copiez les valeurs de formatage effectif requises dans des variables séparées. Récupérez ces valeurs via IPortionFormat::GetEffective, IParagraphFormat::GetEffective, ITextFrameFormat::GetEffective, IFillFormat::GetEffective, et ILineFormat::GetEffective. Ne vous fiez pas uniquement aux objets de formatage effectif, car leurs valeurs de formatage du texte peuvent changer après la suppression de la relation. Appliquez explicitement les valeurs capturées à la forme ordinaire par la suite, y compris la famille de police, la taille, le style, la couleur, les paramètres de paragraphe, les paramètres du cadre de texte, le remplissage et le trait utilisés par votre modèle.
La géométrie de forme héritée peut également devoir être affectée explicitement via IGeometryShape::set_ShapeType. Pour un espace réservé de texte rectangulaire, cela signifie attribuer ShapeType::Rectangle; restaurer uniquement le remplissage et le trait peut ne pas restaurer le rectangle visible. Les modèles avec des effets supplémentaires ou un formatage plus complexe nécessitent également la prise en compte de ces paramètres.
Modifier le texte dans un espace réservé
Les espaces réservés de titre, titre centré, sous‑titre, corps et texte prennent normalement en charge le texte. Vérifiez la présence d’un IAutoShape avant d’utiliser sa méthode get_TextFrame.
Cet exemple met à jour le premier espace réservé de titre sur la première diapositive et enregistre le résultat :
#include <DOM/IAutoShape.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"template.pptx");
auto slide = presentation->get_Slide(0);
SharedPtr<IAutoShape> titleShape;
for (auto&& shape : slide->get_Shapes())
{
if (!ObjectExt::Is<IAutoShape>(shape))
{
continue;
}
auto autoShape = ExplicitCast<IAutoShape>(shape);
auto placeholder = autoShape->get_Placeholder();
if (placeholder == nullptr)
{
continue;
}
auto placeholderType = placeholder->get_Type();
if (placeholderType == PlaceholderType::Title || placeholderType == PlaceholderType::CenteredTitle)
{
titleShape = autoShape;
break;
}
}
if (titleShape == nullptr)
{
throw InvalidOperationException(u"The first slide does not contain a title placeholder.");
}
titleShape->get_TextFrame()->set_Text(u"Quarterly Business Review");
presentation->Save(u"title-placeholder-updated.pptx", SaveFormat::Pptx);
Ce modèle évite de convertir les espaces réservés d’image, de graphique, de tableau ou de média en IAutoShape. Il identifie également l’espace réservé par son objectif plutôt que de se fier à un index de forme fragile.
Définir le texte d’invite sur une mise en page
Le texte d’invite est l’instruction affichée en mode conception dans un espace réservé vide, telle que Cliquez pour ajouter un titre. Définissez un texte d’invite personnalisé sur l’espace réservé de la mise en page plutôt que d’essayer d’y accéder via la collection de formes d’une diapositive normale. Accédez à la mise en page via ISlide::get_LayoutSlide et parcourez IBaseSlide::get_Shapes.
L’exemple suivant modifie les invites de titre et de sous‑titre sur la mise en page utilisée par la première diapositive :
#include <DOM/IAutoShape.h>
#include <DOM/ILayoutSlide.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"template.pptx");
auto layoutSlide = presentation->get_Slide(0)->get_LayoutSlide();
for (auto&& shape : layoutSlide->get_Shapes())
{
if (!ObjectExt::Is<IAutoShape>(shape))
{
continue;
}
auto autoShape = ExplicitCast<IAutoShape>(shape);
auto placeholder = autoShape->get_Placeholder();
if (placeholder == nullptr)
{
continue;
}
switch (placeholder->get_Type())
{
case PlaceholderType::Title:
case PlaceholderType::CenteredTitle:
autoShape->get_TextFrame()->set_Text(u"Enter a concise slide title");
break;
case PlaceholderType::Subtitle:
autoShape->get_TextFrame()->set_Text(u"Enter a subtitle or reporting period");
break;
default:
break;
}
}
presentation->Save(u"custom-placeholder-prompts.pptx", SaveFormat::Pptx);
Le texte d’invite n’est pas un contenu de diapositive normal. Il est destiné aux espaces réservés vides dans les applications d’édition comme PowerPoint. Une fois qu’un utilisateur ou un programme fournit du contenu réel, l’invite n’est plus affichée. Modifier une invite ne remplace pas non plus le texte existant sur les diapositives qui utilisent la mise en page.
Mettre à jour un espace réservé d’image
Il existe deux cas à gérer :
- Si l’espace réservé d’image est déjà rempli et représenté par un IPictureFrame, remplacez l’image via IPictureFillFormat::get_Picture et ISlidesPicture::set_Image.
- S’il s’agit toujours d’un espace réservé vide, ajoutez un cadre d’image aux coordonnées de l’espace réservé avec IShapeCollection::AddPictureFrame et supprimez l’espace réservé vide.
L’exemple suivant prend en charge les deux cas et enregistre la présentation :
#include <DOM/IImageCollection.h>
#include <DOM/IPictureFillFormat.h>
#include <DOM/IPictureFrame.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlidesPicture.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/io/file.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"picture-template.pptx");
auto slide = presentation->get_Slide(0);
SharedPtr<IShape> picturePlaceholder;
for (auto&& shape : slide->get_Shapes())
{
auto placeholder = shape->get_Placeholder();
if (placeholder != nullptr && placeholder->get_Type() == PlaceholderType::Picture)
{
picturePlaceholder = shape;
break;
}
}
if (picturePlaceholder == nullptr)
{
throw InvalidOperationException(u"The first slide does not contain a picture placeholder.");
}
auto imageBytes = File::ReadAllBytes(u"replacement.png");
auto image = presentation->get_Images()->AddImage(imageBytes);
if (ObjectExt::Is<IPictureFrame>(picturePlaceholder))
{
auto pictureFrame = ExplicitCast<IPictureFrame>(picturePlaceholder);
pictureFrame->get_PictureFormat()->get_Picture()->set_Image(image);
}
else
{
auto x = picturePlaceholder->get_X();
auto y = picturePlaceholder->get_Y();
auto width = picturePlaceholder->get_Width();
auto height = picturePlaceholder->get_Height();
auto shapes = slide->get_Shapes();
shapes->AddPictureFrame(ShapeType::Rectangle, x, y, width, height, image);
shapes->Remove(picturePlaceholder);
}
presentation->Save(u"picture-placeholder-updated.pptx", SaveFormat::Pptx);
Le remplacement créé pour un espace réservé vide est un cadre d’image local, et non un nouvel espace réservé, car IShape::get_Placeholder est en lecture seule. Il conserve la position réservée mais n’hérite plus du comportement spécifique à l’espace réservé. Si la conservation de la relation d’espace réservé est essentielle, préparez et remplissez l’espace réservé dans PowerPoint d’abord, puis mettez à jour le IPictureFrame résultant avec Aspose.Slides.
Pour la transparence d’image, le recadrage et d’autres effets spécifiques aux images, consultez Gérer les cadres d’image. Ces opérations appartiennent au cadre d’image ou au remplissage d’image, pas aux métadonnées d’espace réservé.
Travailler avec les espaces réservés de graphique et de contenu
Un espace réservé de graphique rempli peut être représenté par un IChart. Cet exemple trouve un tel graphique à la fois par le type d’espace réservé et par l’interface d’exécution, modifie son titre et enregistre le fichier :
#include <DOM/IChart.h>
#include <DOM/Chart/IChartTitle.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"chart-template.pptx");
auto slide = presentation->get_Slide(0);
SharedPtr<IChart> placeholderChart;
for (auto&& shape : slide->get_Shapes())
{
if (!ObjectExt::Is<IChart>(shape))
{
continue;
}
auto chart = ExplicitCast<IChart>(shape);
auto placeholder = chart->get_Placeholder();
if (placeholder != nullptr && placeholder->get_Type() == PlaceholderType::Chart)
{
placeholderChart = chart;
break;
}
}
if (placeholderChart == nullptr)
{
throw InvalidOperationException(u"The first slide does not contain a populated chart placeholder.");
}
placeholderChart->set_HasTitle(true);
placeholderChart->get_ChartTitle()->AddTextFrameForOverriding(u"Quarterly Revenue");
presentation->Save(u"chart-placeholder-updated.pptx", SaveFormat::Pptx);
Un espace réservé de contenu général possède généralement PlaceholderType::Object. Dans PowerPoint, il agit comme un lanceur pour plusieurs types de contenu, y compris les graphiques, les tableaux, les diagrammes, les images et les médias. Après l’avoir rempli, inspectez l’interface de forme réelle pour savoir ce qu’il contient. Les mises en page spécialisées peuvent également exposer PlaceholderType::Chart, PlaceholderType::Table, PlaceholderType::Picture, PlaceholderType::Media, ou PlaceholderType::Diagram.
Aspose.Slides ne convertit pas un espace réservé IAutoShape vide en IChart simplement en modifiant IPlaceholder::get_Type; le type est en lecture seule. Pour remplir un graphique ou une zone de contenu vide par programme, ajoutez l’objet requis aux coordonnées de l’espace réservé puis supprimez l’espace réservé vide. L’exemple suivant le fait pour un graphique :
#include <DOM/Chart/ChartType.h>
#include <DOM/IChart.h>
#include <DOM/Chart/IChartTitle.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"content-template.pptx");
auto slide = presentation->get_Slide(0);
SharedPtr<IShape> targetPlaceholder;
for (auto&& shape : slide->get_Shapes())
{
auto placeholder = shape->get_Placeholder();
if (placeholder == nullptr)
{
continue;
}
auto placeholderType = placeholder->get_Type();
if (placeholderType == PlaceholderType::Chart || placeholderType == PlaceholderType::Object)
{
targetPlaceholder = shape;
break;
}
}
if (targetPlaceholder == nullptr)
{
throw InvalidOperationException(u"The first slide does not contain a chart or content placeholder.");
}
auto x = targetPlaceholder->get_X();
auto y = targetPlaceholder->get_Y();
auto width = targetPlaceholder->get_Width();
auto height = targetPlaceholder->get_Height();
auto shapes = slide->get_Shapes();
auto chart = shapes->AddChart(ChartType::ClusteredColumn, x, y, width, height);
chart->set_HasTitle(true);
chart->get_ChartTitle()->AddTextFrameForOverriding(u"Quarterly Revenue");
shapes->Remove(targetPlaceholder);
presentation->Save(u"content-placeholder-replaced-with-chart.pptx", SaveFormat::Pptx);
Le graphique ajouté est un graphique local ordinaire. Il occupe la zone de l’espace réservé mais n’hérite pas de l’espace réservé de mise en page. Utilisez les articles de gestion des graphiques lorsque vous devez remplacer ses catégories, séries ou données de classeur.
Exemple complet : mettre à jour le texte ou le contenu image
L’exemple complet suivant ouvre un modèle, recherche sur la première diapositive un espace réservé de titre ou d’image, vérifie les types d’espace réservé et de forme, met à jour le contenu approprié et enregistre le résultat. L’exemple évite délibérément de supposer un index de forme ou de convertir chaque espace réservé vers la même interface.
#include <DOM/IAutoShape.h>
#include <DOM/IImageCollection.h>
#include <DOM/IPictureFillFormat.h>
#include <DOM/IPictureFrame.h>
#include <DOM/IPlaceholder.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlidesPicture.h>
#include <DOM/ITextFrame.h>
#include <DOM/PlaceholderType.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/io/file.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"template.pptx");
auto slide = presentation->get_Slide(0);
auto updated = false;
for (auto&& shape : slide->get_Shapes())
{
auto placeholder = shape->get_Placeholder();
if (placeholder == nullptr)
{
continue;
}
auto placeholderType = placeholder->get_Type();
if ((placeholderType == PlaceholderType::Title || placeholderType == PlaceholderType::CenteredTitle) && ObjectExt::Is<IAutoShape>(shape))
{
auto titleShape = ExplicitCast<IAutoShape>(shape);
titleShape->get_TextFrame()->set_Text(u"Quarterly Business Review");
updated = true;
break;
}
if (placeholderType == PlaceholderType::Picture)
{
auto imageBytes = File::ReadAllBytes(u"replacement.png");
auto image = presentation->get_Images()->AddImage(imageBytes);
if (ObjectExt::Is<IPictureFrame>(shape))
{
auto pictureFrame = ExplicitCast<IPictureFrame>(shape);
pictureFrame->get_PictureFormat()->get_Picture()->set_Image(image);
}
else
{
auto x = shape->get_X();
auto y = shape->get_Y();
auto width = shape->get_Width();
auto height = shape->get_Height();
auto shapes = slide->get_Shapes();
shapes->AddPictureFrame(ShapeType::Rectangle, x, y, width, height, image);
shapes->Remove(shape);
}
updated = true;
break;
}
}
if (!updated)
{
throw InvalidOperationException(u"No supported title or picture placeholder was found on the first slide.");
}
presentation->Save(u"placeholder-content-updated.pptx", SaveFormat::Pptx);
FAQ
Qu’est‑ce qu’un espace réservé de base ?
Un espace réservé de base est la forme correspondante sur la mise en page ou le maître dont un autre espace réservé hérite. Utilisez IShape::GetBasePlaceholder pour le récupérer. Une forme locale ordinaire renvoie nullptr car elle ne fait pas partie de la hiérarchie des espaces réservés.
Puis‑je modifier tous les titres de diapositives en modifiant un espace réservé de mise en page ?
Vous pouvez modifier le formatage hérité ou le texte d’invite via une mise en page, mais le contenu des titres existants est stocké sur les diapositives normales. Pour remplacer le texte réel des titres dans une présentation, parcourez les diapositives et mettez à jour chaque espace réservé de titre.
Comment gérer les espaces réservés de date, numéro de diapositive, en‑tête et pied de page ?
Utilisez les gestionnaires d’en‑tête et de pied de page au niveau de la diapositive, de la mise en page, du maître, des notes ou du document de distribution appropriés. Consultez Gérer les en‑têtes et pieds de page de la présentation pour des exemples complets.