Verwalten von Präsentationsplatzhaltern in JavaScript
Übersicht
Ein Platzhalter ist eine Form, die eine Position für eine bestimmte Art von Inhalt in einer Präsentationsvorlage reserviert. Häufige Beispiele sind Titel, Text, Bild, Diagramm und allgemein verwendbare Inhaltsplatzhalter. Im Gegensatz zu einer normalen Form kann ein Platzhalter seine Position, Größe, Formatierung und andere Einstellungen von einer Layout‑Folie oder einer Master‑Folie erben.
Aspose.Slides stellt Platzhalterinformationen über die Methode Shape.getPlaceholder bereit. Die Methode gibt ein Placeholder‑Objekt oder null für eine normale Form zurück. Verwenden Sie Placeholder.getType, um zu bestimmen, welchen Inhalt der Platzhalter enthalten soll.
Die Formklasse bleibt wichtig, nachdem Sie den Platzhaltertyp kennen:
- Ein leerer Text‑, Bild‑, Diagramm‑ oder Inhalts‑Platzhalter wird häufig durch ein AutoShape dargestellt.
- Ein ausgefüllter Bild‑Platzhalter kann durch ein PictureFrame dargestellt werden.
- Ein ausgefüllter Diagramm‑Platzhalter kann durch ein Chart dargestellt werden.
- Ein Inhalts‑Platzhalter kann verschiedene Arten von Inhalt enthalten. Prüfen Sie sowohl Placeholder.getType, als auch die Laufzeit‑Formklasse, anstatt anzunehmen, dass jeder Platzhalter ein AutoShape ist.
Warning
Placeholder.getType beschreibt die Rolle eines Platzhalters; sie garantiert nicht den Laufzeittyp der Form. Verwenden Sie stets eine Typprüfung, bevor Sie auf Text-, Bild-, Diagramm-, Tabellen- oder medien‑spezifische Member zugreifen.Verstehen der Platzhaltervererbung
Platzhalter bilden eine Hierarchie:
- Eine Master‑Folie definiert wiederverwendbare Stile und, in einigen Fällen, Master‑Platzhalter.
- Eine Layout‑Folie definiert die Anordnung, die von einer oder mehreren normalen Folien verwendet wird, und kann vom Master erben.
- Eine normale Folie enthält die Platzhalter für diese Folie und kann von ihrem Layout erben.
Rufen Sie Shape.getBasePlaceholder auf, um eine Ebene in dieser Hierarchie nach oben zu gehen. Ein Folien‑Platzhalter gibt normalerweise seinen Layout‑Platzhalter zurück; ein Layout‑Platzhalter kann seinen Master‑Platzhalter zurückgeben. Die Methode liefert null, wenn die Form keinen Basis‑Platzhalter hat.
Das folgende Beispiel listet die Platzhalter auf der ersten Folie auf und gibt ihre Basis‑Platzhalter aus:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
function getShapeClassName(shape) {
if (java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
return "AutoShape";
}
if (java.instanceOf(shape, "com.aspose.slides.IPictureFrame")) {
return "PictureFrame";
}
if (java.instanceOf(shape, "com.aspose.slides.IChart")) {
return "Chart";
}
return "Shape";
}
const presentation = new aspose.slides.Presentation("template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
const placeholder = shape.getPlaceholder();
if (placeholder == null) {
continue;
}
const placeholderType = placeholder.getType();
const shapeClassName = getShapeClassName(shape);
const slidePlaceholderMessage = "Slide placeholder: " + placeholderType + "; shape class: " + shapeClassName;
console.log(slidePlaceholderMessage);
const layoutPlaceholder = shape.getBasePlaceholder();
if (layoutPlaceholder != null) {
const layoutPlaceholderInfo = layoutPlaceholder.getPlaceholder();
const layoutPlaceholderType = layoutPlaceholderInfo == null ? null : layoutPlaceholderInfo.getType();
const layoutPlaceholderMessage = " Layout placeholder: " + layoutPlaceholderType;
console.log(layoutPlaceholderMessage);
const masterPlaceholder = layoutPlaceholder.getBasePlaceholder();
if (masterPlaceholder != null) {
const masterPlaceholderInfo = masterPlaceholder.getPlaceholder();
const masterPlaceholderType = masterPlaceholderInfo == null ? null : masterPlaceholderInfo.getType();
const masterPlaceholderMessage = " Master placeholder: " + masterPlaceholderType;
console.log(masterPlaceholderMessage);
}
}
}
} finally {
presentation.dispose();
}
Das Bearbeiten eines Platzhalters auf einer normalen Folie erstellt oder ändert eine lokale Überschreibung für diese Folie. Das Bearbeiten des zugehörigen Layouts oder Masters kann alle Folien beeinflussen, die diese Einstellung noch erben. Eine lokale normale Form hat keinen Basis‑Platzhalter und beginnt nicht zu erben, nur weil sie dieselben Koordinaten einnimmt.
Platzhalterstatus entfernen
Beim Anpassen einer Vorlage verwenden Sie Shape.removePlaceholder, um ein vorhandenes Objekt als normale Form zu behalten. Seine getPlaceholder-Methode gibt null zurück, aber die Form bleibt in der Folien‑Sammlung. Im Gegensatz dazu löscht ShapeCollection.remove die Form aus dieser Sammlung.
Das folgende Beispiel erfordert template.pptx mit mindestens einer Folie und einem nicht leeren Text‑Platzhalter auf der ersten Folie. Verwenden Sie einen Platzhalter mit vom Layout oder Master geerbter Formatierung, um die Auswirkung des Entfernens dieser Beziehung zu sehen. Das Beispiel prüft, dass dieselbe Form erhalten bleibt, ruft die Methode erneut auf der nun normalen Form auf und speichert das Ergebnis.
Warning
Das Entfernen des Platzhalterstatus bewahrt die geerbten Anzeigeeinstellungen nicht automatisch. Das nachstehende Beispiel lässt diese Einstellungen absichtlich unverändert, sodass die Ausgabe anders aussehen kann. Eine Form, deren Position und Größe vollständig geerbt sind, kann nach dem Aufruf Null‑Koordinaten und -Abmessungen haben und unsichtbar werden, obwohl sie in der Sammlung verbleibt.const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("template.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shapes = slide.getShapes();
let found = false;
for (let index = 0; index < shapes.size(); index++) {
const shape = shapes.get_Item(index);
if (!java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
continue;
}
const textFrame = shape.getTextFrame();
if (shape.getPlaceholder() == null || textFrame == null) {
continue;
}
const text = textFrame.getText();
if (text == null || text.length === 0) {
continue;
}
const shapeCount = shapes.size();
shape.removePlaceholder();
console.log("Placeholder removed: " + (shape.getPlaceholder() == null));
const retainedShape = shapes.get_Item(index);
console.log("Same shape retained: " + shape.equals(retainedShape));
console.log("Shape count unchanged: " + (shapes.size() === shapeCount));
// Aufruf der Methode auf einer normalen Form hat keine Wirkung.
shape.removePlaceholder();
found = true;
break;
}
if (found) {
presentation.save("placeholder-status-removed.pptx", aspose.slides.SaveFormat.Pptx);
} else {
console.log("No nonempty text placeholder was found on the first slide.");
}
} finally {
presentation.dispose();
}
Für einen passenden Platzhalter geben alle drei Prüfungen true aus. Der Text bleibt erhalten, aber geerbte Position, Größe, Drehung, Schriftart, Absatzausrichtung, Textrahmen‑Abstände, vertikale Verankerung, Füll‑ und Linieneinstellungen können sich ändern, wenn die Platzhalter‑Beziehung entfernt wird. Zum Beispiel kann die geerbte Titel‑Formatierung zurück zu einer normalen Text‑Formatierung fallen. Siehe Folienlayout für weitere Informationen zu Layouts.
Um das gewünschte Aussehen zu bewahren, erfassen Sie vor dem Aufruf die aufgelöste Position, Größe und Drehung und kopieren die erforderlichen effektiven Formatierungswerte in separate Variablen. Rufen Sie diese Werte über PortionFormat.getEffective, ParagraphFormat.getEffective, TextFrameFormat.getEffective, FillFormat.getEffective und LineFormat.getEffective ab. Verlassen Sie sich nicht ausschließlich auf die effektiven Formatobjekte, da deren Textformatierungswerte nach dem Entfernen der Beziehung ändern können. Wenden Sie die erfassten Werte anschließend explizit auf die normale Form an, einschließlich Schriftfamilie, Größe, Stil, Farbe, Absatz‑Einstellungen, Text‑Rahmen‑Einstellungen, Füll‑ und Linien‑Einstellungen, die in Ihrer Vorlage verwendet werden.
Geerbte Formgeometrie muss möglicherweise ebenfalls explizit über GeometryShape.setShapeType zugewiesen werden. Für einen rechteckigen Text‑Platzhalter bedeutet das, ShapeType.Rectangle zuzuweisen; das Wiederherstellen von nur Füll‑ und Linien‑Eigenschaften stellt das sichtbare Rechteck nicht wieder her. Vorlagen mit zusätzlichen Effekten oder komplexerer Formatierung erfordern ebenfalls die Behandlung dieser Einstellungen.
Text in einem Platzhalter ändern
Titel, zentrierter Titel, Untertitel, Text‑ und Inhalts‑Platzhalter unterstützen normalerweise Text. Prüfen Sie auf ein AutoShape, bevor Sie dessen getTextFrame‑Methode verwenden.
Dieses Beispiel aktualisiert den ersten Titel‑Platzhalter auf der ersten Folie und speichert das Ergebnis:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
let titleShape = null;
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
if (!java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
continue;
}
const placeholder = shape.getPlaceholder();
if (placeholder == null) {
continue;
}
const placeholderType = placeholder.getType();
if (placeholderType === aspose.slides.PlaceholderType.Title || placeholderType === aspose.slides.PlaceholderType.CenteredTitle) {
titleShape = shape;
break;
}
}
if (titleShape == null) {
throw new Error("The first slide does not contain a title placeholder.");
}
titleShape.getTextFrame().setText("Quarterly Business Review");
presentation.save("title-placeholder-updated.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Dieses Muster vermeidet, Bild‑, Diagramm‑, Tabellen‑ oder Medien‑Platzhalter als AutoShape‑Objekte zu behandeln. Es identifiziert den Platzhalter außerdem nach Zweck statt sich auf einen anfälligen Form‑Index zu verlassen.
Aufforderungstext für ein Layout festlegen
Der Hinweistext ist die Entwurfs‑Anweisung, die in einem leeren Platzhalter angezeigt wird, z. B. Klicken Sie, um einen Titel hinzuzufügen. Legen Sie benutzerdefinierten Hinweistext auf dem Layout‑Platzhalter fest, anstatt zu versuchen, ihn über die Form‑Sammlung einer normalen Folie zu erreichen. Greifen Sie über Slide.getLayoutSlide auf das Layout zu und iterieren Sie über die über BaseSlide.getShapes zurückgegebene Sammlung.
Das folgende Beispiel ändert den Titel‑ und Untertitel‑Hinweis auf dem Layout, das von der ersten Folie verwendet wird:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("template.pptx");
try {
const slides = presentation.getSlides();
const firstSlide = slides.get_Item(0);
const layoutSlide = firstSlide.getLayoutSlide();
const shapes = layoutSlide.getShapes();
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
if (!java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
continue;
}
const placeholder = shape.getPlaceholder();
if (placeholder == null) {
continue;
}
const placeholderType = placeholder.getType();
if (placeholderType === aspose.slides.PlaceholderType.Title || placeholderType === aspose.slides.PlaceholderType.CenteredTitle) {
shape.getTextFrame().setText("Enter a concise slide title");
} else if (placeholderType === aspose.slides.PlaceholderType.Subtitle) {
shape.getTextFrame().setText("Enter a subtitle or reporting period");
}
}
presentation.save("custom-placeholder-prompts.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Hinweistext ist kein normaler Folieninhalt. Er ist für leere Platzhalter in Bearbeitungs‑Anwendungen wie PowerPoint gedacht. Sobald ein Benutzer oder Programm echten Inhalt bereitstellt, wird der Hinweis nicht mehr angezeigt. Das Ändern eines Hinweises ersetzt zudem nicht den vorhandenen Text auf Folien, die das Layout verwenden.
Ein Bildplatzhalter aktualisieren
Es gibt zwei Fälle zu behandeln:
- Wenn der Bild‑Platzhalter bereits gefüllt ist und durch ein PictureFrame dargestellt wird, ersetzen Sie das Bild über PictureFrame.getPictureFormat, PictureFillFormat.getPicture und Picture.setImage.
- Wenn es noch ein leerer Platzhalter ist, fügen Sie an den Koordinaten des Platzhalters einen Bildrahmen mit ShapeCollection.addPictureFrame hinzu und entfernen Sie den leeren Platzhalter.
Das nächste Beispiel unterstützt beide Fälle und speichert die Präsentation:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("picture-template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
let picturePlaceholder = null;
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
const placeholder = shape.getPlaceholder();
if (placeholder != null && placeholder.getType() === aspose.slides.PlaceholderType.Picture) {
picturePlaceholder = shape;
break;
}
}
if (picturePlaceholder == null) {
throw new Error("The first slide does not contain a picture placeholder.");
}
const sourceImage = aspose.slides.Images.fromFile("replacement.png");
try {
const image = presentation.getImages().addImage(sourceImage);
if (java.instanceOf(picturePlaceholder, "com.aspose.slides.IPictureFrame")) {
picturePlaceholder.getPictureFormat().getPicture().setImage(image);
} else {
const x = picturePlaceholder.getX();
const y = picturePlaceholder.getY();
const width = picturePlaceholder.getWidth();
const height = picturePlaceholder.getHeight();
const frameX = java.newFloat(x);
const frameY = java.newFloat(y);
const frameWidth = java.newFloat(width);
const frameHeight = java.newFloat(height);
shapes.addPictureFrame(aspose.slides.ShapeType.Rectangle, frameX, frameY, frameWidth, frameHeight, image);
shapes.remove(picturePlaceholder);
}
} finally {
sourceImage.dispose();
}
presentation.save("picture-placeholder-updated.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Der Ersatz, der für einen leeren Platzhalter erstellt wird, ist ein lokaler Bildrahmen, kein neuer Platzhalter, da Shape.getPlaceholder keinen Setter bereitstellt. Er behält die reservierte Position bei, erbt jedoch kein platzhalter‑spezifisches Verhalten mehr. Wenn das Beibehalten der Platzhalter‑Beziehung wichtig ist, erstellen und füllen Sie den Platzhalter zuerst in PowerPoint und aktualisieren anschließend das resultierende PictureFrame mit Aspose.Slides.
Für Bildtransparenz, Zuschneiden und andere bildspezifische Effekte siehe Bildrahmen verwalten. Diese Vorgänge betreffen den Bildrahmen oder das Bild‑Füllformat, nicht die Platzhalter‑Metadaten.
Arbeiten mit Diagramm- und Inhaltsplatzhaltern
Ein gefüllter Diagramm‑Platzhalter kann durch ein Chart dargestellt werden. Dieses Beispiel findet ein solches Diagramm sowohl nach Platzhaltertyp als auch nach Laufzeitklasse, ändert dessen Titel und speichert die Datei:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("chart-template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
let placeholderChart = null;
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
if (!java.instanceOf(shape, "com.aspose.slides.IChart")) {
continue;
}
const placeholder = shape.getPlaceholder();
if (placeholder != null && placeholder.getType() === aspose.slides.PlaceholderType.Chart) {
placeholderChart = shape;
break;
}
}
if (placeholderChart == null) {
throw new Error("The first slide does not contain a populated chart placeholder.");
}
placeholderChart.setTitle(true);
placeholderChart.getChartTitle().addTextFrameForOverriding("Quarterly Revenue");
presentation.save("chart-placeholder-updated.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Ein allgemeiner Inhalts‑Platzhalter hat normalerweise PlaceholderType.Object. In PowerPoint dient er als Startpunkt für mehrere Inhaltstypen, einschließlich Diagrammen, Tabellen, Diagrammen, Bildern und Medien. Nach dem Befüllen prüfen Sie die tatsächliche Formklasse, um zu erfahren, was sie enthält. Spezialisierte Layouts können auch PlaceholderType.Chart, PlaceholderType.Table, PlaceholderType.Picture, PlaceholderType.Media oder PlaceholderType.Diagram bereitstellen.
Aspose.Slides wandelt einen leeren AutoShape‑Platzhalter nicht einfach in ein Chart um, indem man Placeholder.getType ändert; der Typ kann nicht über das Objekt geändert werden. Um ein leeres Diagramm‑ oder Inhaltsfeld programmgesteuert zu füllen, fügen Sie das erforderliche Objekt an den Koordinaten des Platzhalters hinzu und entfernen anschließend den leeren Platzhalter. Das folgende Beispiel erledigt dies für ein Diagramm:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("content-template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
let targetPlaceholder = null;
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
const placeholder = shape.getPlaceholder();
if (placeholder == null) {
continue;
}
const placeholderType = placeholder.getType();
if (placeholderType === aspose.slides.PlaceholderType.Chart || placeholderType === aspose.slides.PlaceholderType.Object) {
targetPlaceholder = shape;
break;
}
}
if (targetPlaceholder == null) {
throw new Error("The first slide does not contain a chart or content placeholder.");
}
const x = targetPlaceholder.getX();
const y = targetPlaceholder.getY();
const width = targetPlaceholder.getWidth();
const height = targetPlaceholder.getHeight();
const chartX = java.newFloat(x);
const chartY = java.newFloat(y);
const chartWidth = java.newFloat(width);
const chartHeight = java.newFloat(height);
const chart = shapes.addChart(aspose.slides.ChartType.ClusteredColumn, chartX, chartY, chartWidth, chartHeight);
chart.setTitle(true);
chart.getChartTitle().addTextFrameForOverriding("Quarterly Revenue");
shapes.remove(targetPlaceholder);
presentation.save("content-placeholder-replaced-with-chart.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Das hinzugefügte Diagramm ist ein gewöhnliches lokales Diagramm. Es belegt den Bereich des Platzhalters, erbt jedoch nicht vom Layout‑Platzhalter. Verwenden Sie die speziellen Diagramm‑Verwaltungsartikel, wenn Sie dessen Kategorien, Reihen oder Arbeitsmappendaten ersetzen müssen.
Komplettes Beispiel: Text- oder Bildinhalt aktualisieren
Das folgende End‑zu‑Ende‑Beispiel öffnet eine Vorlage, durchsucht die erste Folie nach einem Titel‑ oder Bild‑Platzhalter, prüft die Platzhalter‑ und Formtypen, aktualisiert den entsprechenden Inhalt und speichert das Ergebnis. Das Beispiel vermeidet bewusst die Annahme eines Form‑Index oder die Behandlung jedes Platzhalters als dieselbe Klasse.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("template.pptx");
try {
const slides = presentation.getSlides();
const slide = slides.get_Item(0);
const shapes = slide.getShapes();
let updated = false;
for (let i = 0; i < shapes.size(); i++) {
const shape = shapes.get_Item(i);
const placeholder = shape.getPlaceholder();
if (placeholder == null) {
continue;
}
const placeholderType = placeholder.getType();
const isTitlePlaceholder = placeholderType === aspose.slides.PlaceholderType.Title || placeholderType === aspose.slides.PlaceholderType.CenteredTitle;
if (isTitlePlaceholder && java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
shape.getTextFrame().setText("Quarterly Business Review");
updated = true;
break;
}
if (placeholderType === aspose.slides.PlaceholderType.Picture) {
const sourceImage = aspose.slides.Images.fromFile("replacement.png");
try {
const image = presentation.getImages().addImage(sourceImage);
if (java.instanceOf(shape, "com.aspose.slides.IPictureFrame")) {
shape.getPictureFormat().getPicture().setImage(image);
} else {
const x = shape.getX();
const y = shape.getY();
const width = shape.getWidth();
const height = shape.getHeight();
const frameX = java.newFloat(x);
const frameY = java.newFloat(y);
const frameWidth = java.newFloat(width);
const frameHeight = java.newFloat(height);
shapes.addPictureFrame(aspose.slides.ShapeType.Rectangle, frameX, frameY, frameWidth, frameHeight, image);
shapes.remove(shape);
}
} finally {
sourceImage.dispose();
}
updated = true;
break;
}
}
if (!updated) {
throw new Error("No supported title or picture placeholder was found on the first slide.");
}
presentation.save("placeholder-content-updated.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
FAQ
Was ist ein Basis‑Platzhalter?
Ein Basis‑Platzhalter ist die entsprechende Form auf dem Layout oder Master, von dem ein anderer Platzhalter erbt. Verwenden Sie Shape.getBasePlaceholder, um ihn abzurufen. Eine normale lokale Form gibt null zurück, weil sie nicht Teil der Platzhalter‑Hierarchie ist.
Kann ich alle Folientitel ändern, indem ich einen Layout‑Platzhalter bearbeite?
Sie können über ein Layout vererbte Formatierungen oder Hinweistexte ändern, aber vorhandene Titelinhalte werden auf den normalen Folien gespeichert. Um den tatsächlichen Titeltext in einer gesamten Präsentation zu ersetzen, iterieren Sie über die Folien und aktualisieren jeden Titel‑Platzhalter.
Wie verwalte ich Datum-, Folien‑Nummer‑, Kopf‑ und Fußzeilen‑Platzhalter?
Verwenden Sie die Kopf‑ und Fußzeilen‑Manager im entsprechenden Folien‑, Layout‑, Master‑, Notizen‑ oder Handout‑Umfang. Siehe Verwalten von Präsentations‑Kopf‑ und Fußzeilen für komplette Beispiele.