Gestire i segnaposti della presentazione in Python
Panoramica
Un segnaposto è una forma che riserva una posizione per un particolare tipo di contenuto in un modello di presentazione. Esempi comuni sono titolo, corpo, immagine, grafico e segnaposti di contenuto generico. A differenza di una forma ordinaria, un segnaposto può ereditare la posizione, le dimensioni, la formattazione e altre impostazioni da una diapositiva layout o da una diapositiva master.
Aspose.Slides espone le informazioni sui segnaposti tramite il metodo Shape.getPlaceholder. Il metodo restituisce un oggetto Placeholder o None per una forma normale. Usa Placeholder.getType per determinare a cosa è destinato il segnaposto.
Il tipo di forma è ancora rilevante dopo aver conosciuto il tipo di segnaposto:
- Un segnaposto vuoto di testo, immagine, grafico o contenuto è comunemente rappresentato da un AutoShape.
- Un segnaposto immagine popolato può essere rappresentato da un PictureFrame.
- Un segnaposto grafico popolato può essere rappresentato da un Chart.
- Un segnaposto di contenuto può contenere diversi tipi di contenuto. Controlla sia Placeholder.getType sia il tipo di forma a runtime invece di presumere che ogni segnaposto sia un AutoShape.
Avviso
Placeholder.getType descrive il ruolo di un segnaposto; non garantisce il tipo di forma a runtime. Utilizza sempre un controllo del tipo prima di accedere a membri specifici di testo, immagine, grafico, tabella o media.Comprendere l’eredità dei segnaposti
I segnaposti formano una gerarchia:
- Una diapositiva master definisce stili riutilizzabili e, in alcuni casi, segnaposti a livello master.
- Una diapositiva layout definisce la disposizione usata da una o più diapositive normali e può ereditare dal master.
- Una diapositiva normale contiene i segnaposti per quella diapositiva e può ereditare dal suo layout.
Chiama Shape.getBasePlaceholder per spostarti di un livello verso l’alto nella gerarchia. Un segnaposto diapositiva di solito restituisce il suo segnaposto layout; un segnaposto layout può restituire il suo segnaposto master. Il metodo restituisce None quando la forma non ha un segnaposto base.
L’esempio seguente elenca i segnaposti nella prima diapositiva e riporta i loro segnaposti base:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation("template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
placeholder = shape.getPlaceholder()
if placeholder is None:
continue
placeholder_type = placeholder.getType()
type_name = shape.getClass().getSimpleName()
print(f"Slide placeholder: {placeholder_type}; shape type: {type_name}")
layout_placeholder = shape.getBasePlaceholder()
if layout_placeholder is not None:
layout_placeholder_info = layout_placeholder.getPlaceholder()
layout_placeholder_type = None if layout_placeholder_info is None else layout_placeholder_info.getType()
print(f" Layout placeholder: {layout_placeholder_type}")
master_placeholder = layout_placeholder.getBasePlaceholder()
if master_placeholder is not None:
master_placeholder_info = master_placeholder.getPlaceholder()
master_placeholder_type = None if master_placeholder_info is None else master_placeholder_info.getType()
print(f" Master placeholder: {master_placeholder_type}")
finally:
presentation.dispose()
Modificare un segnaposto su una diapositiva normale crea o modifica una sovrascrittura locale per quella diapositiva. Modificare il relativo layout o master può influenzare tutte le diapositive che ancora ereditano quell’impostazione. Una forma ordinaria locale non ha segnaposto base e non inizia a ereditare solo perché occupa le stesse coordinate.
Modificare il testo in un segnaposto
I segnaposti titolo, titolo centrato, sottotitolo, corpo e testo normalmente supportano il testo. Verifica la presenza di un AutoShape prima di usare il suo metodo getTextFrame.
Questo esempio aggiorna il primo segnaposto titolo nella prima diapositiva e salva il risultato:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, AutoShape, PlaceholderType, SaveFormat
presentation = Presentation("template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
title_shape = None
for shape in slide.getShapes():
if not isinstance(shape, AutoShape):
continue
placeholder = shape.getPlaceholder()
if placeholder is None:
continue
placeholder_type = placeholder.getType()
if placeholder_type in (PlaceholderType.Title, PlaceholderType.CenteredTitle):
title_shape = shape
break
if title_shape is None:
print("The first slide does not contain a title placeholder.")
else:
title_shape.getTextFrame().setText("Quarterly Business Review")
presentation.save("title-placeholder-updated.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Questo schema evita di trattare segnaposti immagine, grafico, tabella o media come AutoShape. Identifica inoltre il segnaposto per scopo invece di fidarsi di un indice di forma fragile.
Impostare il testo di prompt su un layout
Il testo di prompt è l’istruzione mostrata in fase di progettazione in un segnaposto vuoto, ad esempio Fare clic per aggiungere il titolo. Imposta un testo di prompt personalizzato sul segnaposto layout invece di provare a raggiungerlo tramite la collezione di forme di una diapositiva normale. Accedi al layout tramite Slide.getLayoutSlide e itera sulla collezione restituita da BaseSlide.getShapes.
L’esempio seguente modifica i prompt titolo e sottotitolo sul layout usato dalla prima diapositiva:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, AutoShape, PlaceholderType, SaveFormat
presentation = Presentation("template.pptx")
try:
layout_slide = presentation.getSlides().get_Item(0).getLayoutSlide()
for shape in layout_slide.getShapes():
if not isinstance(shape, AutoShape):
continue
placeholder = shape.getPlaceholder()
if placeholder is None:
continue
placeholder_type = placeholder.getType()
if placeholder_type in (PlaceholderType.Title, PlaceholderType.CenteredTitle):
shape.getTextFrame().setText("Enter a concise slide title")
elif placeholder_type == PlaceholderType.Subtitle:
shape.getTextFrame().setText("Enter a subtitle or reporting period")
presentation.save("custom-placeholder-prompts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Il testo di prompt non è contenuto normale della diapositiva. È destinato ai segnaposti vuoti nelle applicazioni di editing come PowerPoint. Una volta che un utente o un programma fornisce contenuto reale, il prompt non è più visualizzato. Modificare un prompt non sostituisce nemmeno il testo esistente sulle diapositive che usano quel layout.
Aggiornare un segnaposto immagine
Ci sono due casi da gestire:
- Se il segnaposto immagine è già popolato e rappresentato da un PictureFrame, sostituisci l’immagine tramite PictureFillFormat.getPicture e Picture.setImage.
- Se è ancora un segnaposto vuoto, aggiungi un picture frame alle coordinate del segnaposto con ShapeCollection.addPictureFrame e rimuovi il segnaposto vuoto.
Il prossimo esempio supporta entrambi i casi e salva la presentazione:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, PictureFrame, PlaceholderType, ShapeType, SaveFormat
presentation = Presentation("picture-template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
picture_placeholder = None
for shape in slide.getShapes():
placeholder = shape.getPlaceholder()
if placeholder is not None and placeholder.getType() == PlaceholderType.Picture:
picture_placeholder = shape
break
if picture_placeholder is None:
print("The first slide does not contain a picture placeholder.")
else:
image_bytes = Path("replacement.png").read_bytes()
java_image_bytes = jpype.JArray(jpype.JByte)(image_bytes)
image = presentation.getImages().addImage(java_image_bytes)
if isinstance(picture_placeholder, PictureFrame):
picture_placeholder.getPictureFormat().getPicture().setImage(image)
else:
slide.getShapes().addPictureFrame(ShapeType.Rectangle, picture_placeholder.getX(), picture_placeholder.getY(), picture_placeholder.getWidth(), picture_placeholder.getHeight(), image)
slide.getShapes().remove(picture_placeholder)
presentation.save("picture-placeholder-updated.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
La sostituzione creata per un segnaposto vuoto è un picture frame locale, non un nuovo segnaposto, perché Shape.getPlaceholder non fornisce un setter. Mantiene la posizione riservata ma non eredita più il comportamento specifico del segnaposto. Se mantenere la relazione di segnaposto è essenziale, prepara e popola il segnaposto in PowerPoint prima, poi aggiorna il PictureFrame risultante con Aspose.Slides.
Per trasparenza dell’immagine, ritaglio e altri effetti specifici dell’immagine, consulta Gestire i picture frame. Queste operazioni appartengono al picture frame o al picture fill, non ai metadati del segnaposto.
Lavorare con segnaposti grafico e contenuto
Un segnaposto grafico popolato può essere rappresentato da un Chart. Questo esempio trova tale grafico sia per tipo di segnaposto sia per tipo a runtime, ne modifica il titolo e salva il file:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, Chart, PlaceholderType, SaveFormat
presentation = Presentation("chart-template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
placeholder_chart = None
for shape in slide.getShapes():
if not isinstance(shape, Chart):
continue
placeholder = shape.getPlaceholder()
if placeholder is not None and placeholder.getType() == PlaceholderType.Chart:
placeholder_chart = shape
break
if placeholder_chart is None:
print("The first slide does not contain a populated chart placeholder.")
else:
placeholder_chart.setTitle(True)
placeholder_chart.getChartTitle().addTextFrameForOverriding("Quarterly Revenue")
presentation.save("chart-placeholder-updated.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Un segnaposto di contenuto generale di solito ha PlaceholderType.Object. In PowerPoint funge da avviatore per diversi tipi di contenuto, inclusi grafici, tabelle, diagrammi, immagini e media. Dopo che è stato popolato, ispeziona il tipo di forma reale per apprendere cosa contiene. Layout specializzati possono anche esporre PlaceholderType.Chart, PlaceholderType.Table, PlaceholderType.Picture, PlaceholderType.Media o PlaceholderType.Diagram.
Aspose.Slides non converte un segnaposto AutoShape vuoto in un Chart semplicemente cambiando Placeholder.getType; il tipo non può essere modificato tramite l’API. Per riempire programmaticamente un’area grafico o contenuto vuota, aggiungi l’oggetto richiesto alle coordinate del segnaposto e poi rimuovi il segnaposto vuoto. L’esempio seguente lo fa per un grafico:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, PlaceholderType, ChartType, SaveFormat
presentation = Presentation("content-template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
target_placeholder = None
for shape in slide.getShapes():
placeholder = shape.getPlaceholder()
if placeholder is None:
continue
placeholder_type = placeholder.getType()
if placeholder_type in (PlaceholderType.Chart, PlaceholderType.Object):
target_placeholder = shape
break
if target_placeholder is None:
print("The first slide does not contain a chart or content placeholder.")
else:
chart = slide.getShapes().addChart(ChartType.ClusteredColumn, target_placeholder.getX(), target_placeholder.getY(), target_placeholder.getWidth(), target_placeholder.getHeight())
chart.setTitle(True)
chart.getChartTitle().addTextFrameForOverriding("Quarterly Revenue")
slide.getShapes().remove(target_placeholder)
presentation.save("content-placeholder-replaced-with-chart.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Il grafico aggiunto è un grafico locale ordinario. Occupa l’area del segnaposto ma non eredita dal segnaposto layout. Usa gli articoli dedicati alla gestione dei grafici quando devi sostituire categorie, serie o dati del workbook.
Esempio completo: aggiornare testo o contenuto immagine
L’esempio end‑to‑end seguente apre un modello, ricerca nella prima diapositiva un segnaposto titolo o immagine, controlla i tipi di segnaposto e di forma, aggiorna il contenuto appropriato e salva il risultato. L’esempio evita deliberatamente di presumere un indice di forma o di trattare ogni segnaposto come dello stesso tipo.
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, AutoShape, PictureFrame, PlaceholderType, ShapeType, SaveFormat
presentation = Presentation("template.pptx")
try:
slide = presentation.getSlides().get_Item(0)
updated = False
for shape in slide.getShapes():
placeholder = shape.getPlaceholder()
if placeholder is None:
continue
placeholder_type = placeholder.getType()
if placeholder_type in (PlaceholderType.Title, PlaceholderType.CenteredTitle) and isinstance(shape, AutoShape):
shape.getTextFrame().setText("Quarterly Business Review")
updated = True
break
if placeholder_type == PlaceholderType.Picture:
image_bytes = Path("replacement.png").read_bytes()
java_image_bytes = jpype.JArray(jpype.JByte)(image_bytes)
image = presentation.getImages().addImage(java_image_bytes)
if isinstance(shape, PictureFrame):
shape.getPictureFormat().getPicture().setImage(image)
else:
slide.getShapes().addPictureFrame(ShapeType.Rectangle, shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight(), image)
slide.getShapes().remove(shape)
updated = True
break
if updated:
presentation.save("placeholder-content-updated.pptx", SaveFormat.Pptx)
else:
print("No supported title or picture placeholder was found on the first slide.")
finally:
presentation.dispose()
FAQ
Che cos’è un segnaposto base?
Un segnaposto base è la forma corrispondente sul layout o sul master da cui un altro segnaposto eredita. Usa Shape.getBasePlaceholder per recuperarlo. Una forma locale ordinaria restituisce None perché non fa parte della gerarchia dei segnaposti.
Posso cambiare tutti i titoli delle diapositive modificando un segnaposto layout?
Puoi modificare la formattazione ereditata o il testo di prompt tramite un layout, ma il contenuto del titolo esistente è memorizzato sulle diapositive normali. Per sostituire il testo reale del titolo su tutta la presentazione, itera sulle diapositive e aggiorna ciascun segnaposto titolo.
Come gestisco i segnaposti data, numero diapositiva, intestazione e piè di pagina?
Usa i gestori di intestazione e piè di pagina nella diapositiva, nel layout, nel master, nelle note o nella raccolta di manuali appropriata. Vedi Gestire intestazione e piè di pagina della presentazione per esempi completi.