Alakzat hatékony tulajdonságainak lekérése a prezentációkból Pythonban Java-n keresztül

A helyi, örökölt és hatékony tulajdonságok megértése

A PowerPoint formázás több helyről származhat. Az objektumra közvetlenül tárolt érték az helyi érték. Ha ez az érték nincs beállítva, a PowerPoint a szülő formázási forrásokat vizsgálja, például a bekezdés alapértelmezett beállítását, egy szövegstílust, egy elrendezést vagy mesterdiát, egy témát vagy a prezentáció szintű alapértelmezéseket. Ezek az értékek örökölt értékek. Az az érték, amely a teljes hierarchia feloldása után megmarad, a hatékony érték – a objektum megjelenítéséhez használt érték.

Például egy szöveg részlet nem határozhatja meg saját betűmagasságát. A helyi getFontHeight értéke ilyenkor float("nan"), ami azt jelenti, hogy „itt nincs beállítva”. A részlet örökölhet magasságot a bekezdéséből, a prezentáció alapértelmezett szövegstílusából vagy egy másik alkalmazható forrásból. A getEffective hívása a részlet formátumán a végleges feloldott magasságot adja vissza.

Használja a kétféle formázási adatot különböző célokra:

  • Olvassa vagy módosítsa a helyi formátumobjektumot, például a PortionFormat esetén, amikor szabályozni kell, hogy hol van definiálva egy érték.
  • Olvasson egy hatékony adatobjektumot, például a PortionFormatEffectiveData-t, amikor a végső, megjelenített eredményre van szükség. A hatékony adatok csak olvashatók.

A helyi, örökölt és hatékony értékek összehasonlítása

Az alábbi teljes példa egy alakzatot hoz létre, és betűmagasságokat alkalmaz a prezentáció, a bekezdés és a részlet szintjén. Minden lépés kiírja az adott szinteken definiált értékeket és a ugyanarra a szöveg részletre vonatkozó hatékony értéket. Emellett bemutatja, miért kell a hatékony adatot újra olvasni a formázási változtatások után.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpade.startJVM()

from math import isnan
from asposeslides.api import Presentation, SaveFormat, ShapeType


def format_local_value(value):
    return "<not set>" if isnan(value) else str(value)


def print_font_heights(caption, presentation, paragraph, portion):
    presentation_value = presentation.getDefaultTextStyle().getLevel(0).getDefaultPortionFormat().getFontHeight()
    paragraph_value = paragraph.getParagraphFormat().getDefaultPortionFormat().getFontHeight()
    local_value = portion.getPortionFormat().getFontHeight()

    # Olvassa be a hatékony adatot a korábbi módosítások után.
    effective_value = portion.getPortionFormat().getEffective().getFontHeight()

    print(caption)
    print(f"  Presentation default: {format_local_value(presentation_value)}")
    print(f"  Paragraph default:    {format_local_value(paragraph_value)}")
    print(f"  Portion local:        {format_local_value(local_value)}")
    print(f"  Portion effective:    {effective_value}")


presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 500, 80, False)
    text_frame = shape.addTextFrame("Effective formatting")
    paragraph = text_frame.getParagraphs().get_Item(0)
    portion = paragraph.getPortions().get_Item(0)

    # Határozza meg az örökölt értékeket két különböző szinten.
    presentation.getDefaultTextStyle().getLevel(0).getDefaultPortionFormat().setFontHeight(20)
    paragraph.getParagraphFormat().getDefaultPortionFormat().setFontHeight(28)
    print_font_heights("The portion inherits from the paragraph", presentation, paragraph, portion)

    # A részlet helyi értéke felülírja mindkét örökölt értéket.
    portion.getPortionFormat().setFontHeight(36)
    print_font_heights("A local value overrides inherited values", presentation, paragraph, portion)

    # Az örökölt érték módosítása nem felülírja a meglévő helyi értéket.
    paragraph.getParagraphFormat().getDefaultPortionFormat().setFontHeight(30)
    print_font_heights("The local value still has priority", presentation, paragraph, portion)

    # Törölje a helyi értéket. A részlet most újra a bekezdésből örököl.
    portion.getPortionFormat().setFontHeight(float("nan"))
    print_font_heights("The local value is cleared", presentation, paragraph, portion)

    # Törölje a bekezdés értékét. A prezentáció alapértelmezése most adja meg az eredményt.
    paragraph.getParagraphFormat().getDefaultPortionFormat().setFontHeight(float("nan"))
    print_font_heights("The paragraph value is cleared", presentation, paragraph, portion)

    presentation.save("effective-properties.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Az ebben a példában a prioritás a részlet helyi formázása, majd a bekezdés formázása, végül a prezentáció alapértelmezése. Más objektumok más öröklődési lánccal rendelkezhetnek, de az elv ugyanaz: egy specifikusabb, explicit érték nyer, és a getEffective a végleges eredményt adja vissza.

A hatékony szövegtulajdonságok lekérése

A szöveg formázása több objektum között oszlik meg:

  • TextFrameFormat.getEffective feloldja a szövegkeret tulajdonságait, például a margókat, a rögzítést, az automatikus méretezést és a függőleges szövegirányt.
  • TextStyle.getEffective feloldja a bekezdés formázását minden szövegstílus szinten.
  • ParagraphFormat.getEffective feloldja a bekezdés tulajdonságait, például a igazítást, a behúzást és a felsorolásjeleket.
  • PortionFormat.getEffective feloldja a karakter tulajdonságait, például a betűmagasságot, a betűtípust, a színt, a félkövér és dőlt stílust.

A következő példához a text-formatting.pptx fájlnak legalább egy diát és egy AutoShape elemet kell tartalmaznia nem üres szövegkerettel. Az AutoShape megjelenhet a shape collection bármelyik pozíciójában; a kód keres egy megfelelő objektumot, és használat előtt ellenőrzi azt.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, Presentation


def has_non_empty_text(shape):
    text_frame = shape.getTextFrame()
    if text_frame is None or text_frame.getParagraphs().getCount() == 0:
        return False
    return text_frame.getParagraphs().get_Item(0).getPortions().getCount() > 0


def find_auto_shape_with_text(slide):
    for candidate in slide.getShapes():
        if isinstance(candidate, AutoShape) and has_non_empty_text(candidate):
            return candidate
    return None


presentation = Presentation("text-formatting.pptx")
try:
    if presentation.getSlides().size() == 0:
        print("The presentation contains no slides.")
    else:
        shape = find_auto_shape_with_text(presentation.getSlides().get_Item(0))
        if shape is None:
            print("The first slide must contain an AutoShape with non-empty text.")
        else:
            text_frame = shape.getTextFrame()
            paragraph = text_frame.getParagraphs().get_Item(0)
            portion = paragraph.getPortions().get_Item(0)

            text_frame_effective = text_frame.getTextFrameFormat().getEffective()
            paragraph_effective = paragraph.getParagraphFormat().getEffective()
            portion_effective = portion.getPortionFormat().getEffective()

            print("Text frame margins:")
            print(f"  Left: {text_frame_effective.getMarginLeft()}")
            print(f"  Top: {text_frame_effective.getMarginTop()}")
            print(f"  Right: {text_frame_effective.getMarginRight()}")
            print(f"  Bottom: {text_frame_effective.getMarginBottom()}")
            print(f"Paragraph alignment: {paragraph_effective.getAlignment()}")
            print(f"Font height: {portion_effective.getFontHeight()}")
            print(f"Bold: {portion_effective.getFontBold()}")

            effective_text_style = text_frame.getTextFrameFormat().getTextStyle().getEffective()
            for level in range(9):
                level_effective = effective_text_style.getLevel(level)
                print(f"Level {level} indent: {level_effective.getIndent()}")
finally:
    presentation.dispose()

A hatékony 3D tulajdonságok lekérése

ThreeDFormat.getEffective egy ThreeDFormatEffectiveData objektumot ad vissza, amely az összes feloldott 3D beállítást csoportosítja. A getCamera, getLightRig, getBevelTop és getBevelBottom metódusok a megfelelő hatékony adatot teszik láthatóvá. Ezeknek a kapcsolódó beállításoknak az együttes olvasása megkönnyíti a forma végső 3D megjelenésének megértését.

Ehhez a példához a shape-3d.pptx fájlnak legalább egy alakzatot kell tartalmaznia az első dián. Alkalmazzon 3D kamerát, megvilágítást vagy rézsút beállításokat az alakzatra, ha szeretné, hogy a kimenet az alapértelmezett értékeken kívül más értékeket is tartalmazzon.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("shape-3d.pptx")
try:
    if presentation.getSlides().size() == 0 or presentation.getSlides().get_Item(0).getShapes().size() == 0:
        print("The first slide must contain a shape.")
    else:
        shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
        three_d_effective = shape.getThreeDFormat().getEffective()

        print("Camera:")
        print(f"  Type: {three_d_effective.getCamera().getCameraType()}")
        print(f"  Field of view: {three_d_effective.getCamera().getFieldOfViewAngle()}")
        print(f"  Zoom: {three_d_effective.getCamera().getZoom()}")

        print("Light rig:")
        print(f"  Type: {three_d_effective.getLightRig().getLightType()}")
        print(f"  Direction: {three_d_effective.getLightRig().getDirection()}")

        print("Top bevel:")
        print(f"  Type: {three_d_effective.getBevelTop().getBevelType()}")
        print(f"  Width: {three_d_effective.getBevelTop().getWidth()}")
        print(f"  Height: {three_d_effective.getBevelTop().getHeight()}")
finally:
    presentation.dispose()

A hatékony táblázat formázás lekérése

A táblázat formázása származhat a táblastílusból, valamint a teljes táblára, egy oszlopra, egy sorra vagy egyetlen cellára alkalmazott formátumokból. Az explicit módon definiált kitöltések közötti ütközések esetén a prioritás: cella, sor, oszlop, majd a teljes tábla. Egy cella hatékony formátuma a végső formátum, amelyet a cella megjelenítéséhez használnak.

Ehhez a példához a table-formatting.pptx fájlnak legalább egy táblázatot kell tartalmaznia az első dián. A táblázatnak legalább egy sorral és egy oszloppal kell rendelkeznie. A kód egy Table elemet keres, ahelyett, hogy feltételezné, hogy a getShapes().get_Item(0) egy táblázat.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Table


def find_table(slide):
    for shape in slide.getShapes():
        if isinstance(shape, Table):
            return shape
    return None


presentation = Presentation("table-formatting.pptx")
try:
    if presentation.getSlides().size() == 0:
        print("The presentation contains no slides.")
    else:
        table = find_table(presentation.getSlides().get_Item(0))
        if table is None:
            print("The first slide must contain a table.")
        elif table.getRows().size() == 0 or table.getColumns().size() == 0:
            print("The table must contain at least one cell.")
        else:
            table_effective = table.getTableFormat().getEffective()
            row_effective = table.getRows().get_Item(0).getRowFormat().getEffective()
            column_effective = table.getColumns().get_Item(0).getColumnFormat().getEffective()
            cell_effective = table.get_Item(0, 0).getCellFormat().getEffective()

            print(f"Table fill: {table_effective.getFillFormat().getFillType()}")
            print(f"Row fill: {row_effective.getFillFormat().getFillType()}")
            print(f"Column fill: {column_effective.getFillFormat().getFillType()}")
            print(f"Final cell fill: {cell_effective.getFillFormat().getFillType()}")
finally:
    presentation.dispose()

Ha a színre van szüksége a kitöltés típusa helyett, először ellenőrizze a hatékony getFillType értéket, majd olvassa be a típusnak megfelelő metódust – például a getSolidFillColor-t egy szilárd kitöltés esetén.

Hatékony adatok újraolvasása változtatások után

A hatékony adatok a feloldás időpontjában leírják a formázási hierarchiát. Hívja meg újra a getEffective metódust, miután bármely, a hierarchiában részt vehető elemet módosított, többek között:

  • az objektum helyi formázása;
  • bekezdés vagy szövegkeret alapértelmezései;
  • táblastílus, tábla, oszlop, sor vagy cella formátuma;
  • elrendezés vagy mesterdia formázása;
  • témaadatok vagy a prezentáció szintű alapértelmezések;
  • a diára rendelt elrendezés vagy mester.

Ne tartson egy hatékony adatobjektumot állandó pillanatképként. Az Aspose.Slides bizonyos hatékony adatokat belsőleg cache-elhet, és egy későbbi getEffective hívás frissítheti az adatot. Ha össze kell hasonlítania az értékeket változtatás előtt és után, másolja a szükséges skalár értékeket – például betűmagasság, szín, igazítás vagy rézsút szélesség – saját változóiba, mielőtt a módosítást elvégzi.

Egy érték módosításához frissítse a megfelelő helyi formátumobjektumot, majd hívja meg a getEffective metódust az eredmény ellenőrzéséhez. A hatékony adatobjektumok maguk is csak olvashatók.

FAQ

Hogyan tudom megállapítani, melyik szint biztosította a hatékony értéket?

A hatékony adatok csak a végső értéket tartalmazzák, nem a forrást. Vizsgálja meg a releváns helyi objektumokat a legspecifikusabb szintről kifelé. Szöveg esetén ez magában foglalhatja a részt, bekezdést, szövegkeretet, elrendezést, mestert, témát és a prezentáció alapértelmezéseit. A float("nan") vagy None értékek azt jelzik, hogy a keresés tovább folytatódik egy magasabb szinten.

Mi történik, ha egy szinten sem definiálódik egy tulajdonság?

Az Aspose.Slides a megfelelő PowerPoint vagy könyvtári alapértelmezést alkalmazza. Ez a feloldott érték megjelenik a hatékony adatokban, még akkor is, ha egy helyi objektum nem definiálta explicit módon.

Miért egyezik néha a hatékony érték a helyi értékkel?

A helyi érték nyerte meg az öröklődési számítást. Ez akkor fordul elő, ha a tulajdonság explicit módon be van állítva az objektumon, és nincs specifikusabb szabály, amely felülírná.

Mikor kell helyi adatot használni a hatékony adat helyett?

Használjon helyi adatot egy adott formázási szint megtekintéséhez vagy szerkesztéséhez. Használjon hatékony adatot, ha a végső megjelenésre van szüksége az öröklődés, a téma szabályai és az alkalmazott stílusok feloldása után. A teljes összehasonlítási példa mindkettőt bemutatja egyetlen munkafolyamatban.