Prezentáció helykitöltők kezelése Pythonban

Áttekintés

A helykitöltő egy alakzat, amely egy adott típusú tartalom számára foglal helyet egy prezentációs sablonban. Gyakori példák a cím, a szövegtörzs, a kép, a diagram és az általános célú tartalomhelykitöltők. A szokásos alakzattól eltérően a helykitöltő örökölheti pozícióját, méretét, formázását és egyéb beállításait egy elrendezés‑dia vagy alap‑dia alapján.

Aspose.Slides a helykitöltő információkat a Shape.getPlaceholder metóduson keresztül teszi elérhetővé. A metódus egy Placeholder objektumot ad vissza, vagy None‑t egy normál alakzat esetén. Használja a Placeholder.getType metódust az adott helykitöltő szándékolt tartalmának meghatározásához.

Az alakzat típusa továbbra is fontos, miután ismeri a helykitöltő típusát:

  • Egy üres szöveg-, kép-, diagram- vagy tartalomhelykitöltő általában egy AutoShape formában jelenik meg.
  • Egy kitöltött képhelykitöltő egy PictureFrame segítségével jeleníthető meg.
  • Egy kitöltött diagramhelykitöltő egy Chart segítségével képviselhető.
  • Egy tartalomhelykitöltő többféle tartalmat is tartalmazhat. Ellenőrizze mind a Placeholder.getType, mind a futásidőbeni alakzat típust, ahelyett, hogy azt feltételezné, hogy minden helykitöltő egy AutoShape.

A helykitöltő öröklődés megértése

A helykitöltők hierarchiát alkotnak:

  1. Az alap‑dia (master slide) újrahasználható stílusokat definiál, és bizonyos esetekben alap‑szintű helykitöltőket is.
  2. Az elrendezés‑dia (layout slide) meghatározza az egy vagy több normál dia által használt elrendezést, és örökölhet az alaptól.
  3. Egy normál dia tartalmazza a saját helykitöltőit, és örökölhet az elrendezésétől.

A hierarchiában egy szinttel feljebb léphet a Shape.getBasePlaceholder meghívásával. Egy diahelykitöltő normál esetben visszaadja az elrendezés‑helykitöltőjét; egy elrendezés‑helykitöltő visszaadhatja az alap‑helykitöltőjét. A metódus None‑t ad vissza, ha az alakzatnak nincs alap‑helykitöltője.

A következő példa felsorolja az első dia helykitöltőit, és jelentést készít azok alap‑helykitöltőiről:

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()

Egy helykitöltő szerkesztése egy normál dián helyi felülírást hoz létre vagy módosít azon a dián. A kapcsolódó elrendezés vagy alap szerkesztése minden olyan diára hatással lehet, amely még mindig örökli ezt a beállítást. Egy helyi, szokásos alakzatnak nincs alap‑helykitöltője, és nem kezd örökölni csak azért, mert ugyanazt a koordinátát foglalja.

Szöveg módosítása egy helykitöltőben

A cím, középre igazított cím, alcím, szövegtörzs és szöveghelykitöltők általában támogatják a szöveget. Ellenőrizze, hogy AutoShape‑e, mielőtt a getTextFrame metódusát használná.

Ez a példa frissíti az első dia első címhelykitöltőjét, majd elmenti az eredményt:

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()

Ez a minta elkerüli, hogy a kép, diagram, táblázat vagy média helykitöltőket AutoShape‑ként kezelje. Emellett a helykitöltőt a célja alapján azonosítja, ahelyett, hogy egy törékeny alakzat‑indexre támaszkodna.

Prompt szöveg beállítása egy elrendezésen

A prompt szöveg a tervezési időben megjelenő utasítás egy üres helykitöltőben, például Kattintson a cím hozzáadásához. Állítson be egyedi prompt szöveget az elrendezéshelykitöltőn, ahelyett, hogy a normál dia alakzategyűjteményén keresztül próbálna elérni. Az elrendezéshez a Slide.getLayoutSlide metódussal férhet hozzá, és iteráljon a BaseSlide.getShapes által visszaadott gyűjteményen.

A következő példa módosítja a cím és alcím prompt szövegét az első dia által használt elrendezésen:

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()

A prompt szöveg nem normál dia tartalom. Üres helykitöltőkhöz készült szerkesztőalkalmazásokban, például a PowerPointban. Amint a felhasználó vagy egy program valós tartalmat biztosít, a prompt többé nem jelenik meg. A prompt módosítása nem cseréli le a meglévő szöveget azokat a diákat használó elrendezéseken.

Képhelykitöltő frissítése

Két esetet kell kezelni:

A következő példa mindkét esetet támogatja, és elmenti a bemutatót:

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()

Az üres helykitöltőre létrehozott csere egy helyi képkeret, nem új helykitöltő, mivel a Shape.getPlaceholder nem biztosít beállítót. Megtartja a lefoglalt pozíciót, de már nem örököl a helykitöltőre jellemző viselkedést. Ha a helykitöltő kapcsolat megtartása létfontosságú, először készítse elő és töltse fel a helykitöltőt a PowerPointban, majd frissítse a keletkezett PictureFrame objektumot az Aspose.Slides-szel.

A kép átlátszóságához, vágásához és egyéb képre specifikus hatásokhoz lásd a Képkeretek kezelése oldalt. Ezek a műveletek a képkerethez vagy a képkitöltéshez tartoznak, nem a helykitöltő metaadatokhoz.

Diagram és tartalom helykitöltőkkel való munka

Egy kitöltött diagramhelykitöltő egy Chart segítségével jeleníthető meg. Ez a példa mind a helykitöltő típusa, mind a futásidőbeni típus alapján megtalálja az ilyen diagramot, módosítja a címét, és elmenti a fájlt:

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()

Egy általános tartalomhelykitöltő általában a PlaceholderType.Object típussal rendelkezik. A PowerPointban ez többféle tartalom típus indítójaként funkcionál, beleértve a diagramokat, táblázatokat, diagramokat, képeket és médiát. Miután kitöltötték, ellenőrizze a tényleges alakzat típust, hogy megtudja, mit tartalmaz. A specializált elrendezések szintén ki tudják mutatni a PlaceholderType.Chart, PlaceholderType.Table, PlaceholderType.Picture, PlaceholderType.Media vagy PlaceholderType.Diagram típusokat.

Az Aspose.Slides nem alakítja át egy üres AutoShape helykitöltőt Chart objektummá a Placeholder.getType módosításával; a típust az API-val nem lehet megváltoztatni. Egy üres diagram vagy tartalomterület programozott feltöltéséhez adja hozzá a szükséges objektumot a helykitöltő koordinátáihoz, majd távolítsa el az üres helykitöltőt. A következő példa ezt egy diagramra alkalmazza:

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()

A hozzáadott diagram egy egyszerű helyi diagram. Elfoglalja a helykitöltő területét, de nem örököl az elrendezés‑helykitöltőtől. Használja a dedikált diagramkezelési cikkeket amikor a kategóriák, sorozatok vagy munkafüzet adatainak cseréjére van szükség.

Teljes példa: Szöveg vagy kép tartalom frissítése

A következő végponttól‑végpontig tartó példa megnyit egy sablont, az első dián keres egy cím- vagy képhelykitöltőt, ellenőrzi a helykitöltő és az alakzat típusát, frissíti a megfelelő tartalmat, és elmenti a kimenetet. A példa szándékosan kerül el egy alakzat index feltételezését vagy azt, hogy minden helykitöltőt ugyanannak a típusnak tekint.

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()

GYIK

Mi az a alap‑helykitöltő?

Az alap‑helykitöltő az elrendezésen vagy alapon (master) lévő megfelelő alakzat, amelyből egy másik helykitöltő örököl. Használja a Shape.getBasePlaceholder metódust a lekérdezéséhez. Egy szokásos helyi alakzat None‑t ad vissza, mert nem része a helykitöltő hierarchiának.

Meg tudom változtatni az összes diárcímét egy elrendezéshelykitöltő szerkesztésével?

Az örökölt formázást vagy a prompt szöveget egy elrendezésen keresztül megváltoztathatja, de a meglévő cím tartalom a normál diákon van tárolva. A tényleges cím szövegének egy prezentációban való cseréjéhez iterálja a diákat, és frissítse minden címhelykitöltőt.

Hogyan kezeljem a dátum, dia‑szám, fejléc és lábléc helykitöltőket?

Használja a fej- és lábléc kezelőket a megfelelő dia, elrendezés, alap (master), jegyzet vagy szórólap tartományban. Lásd a Prezentáció fej- és láblécének kezelése oldalt a teljes példákért.