Alakzatok hatékony tulajdonságainak lekérése a prezentációkból PHP-ben

Understand Local, Inherited, and Effective Properties

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

Például egy szövegrészlet nem definiálhat saját betűmagasságot. Ennek helyi getFontHeight értéke ekkor NAN, ami azt jelenti, hogy “itt nincs beállítva”. A részlet örökölhet magasságot a bekezdéséből, a bemutató alapértelmezett szövegstílusából vagy egy másik alkalmazható forrásból. A getEffective hívása a részlet formátumon a végső 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‑t, ha szabályozni szeretné, hogy hol van definiálva egy érték.
  • Olvassa a hatékony adatobjektumot, például a PortionFormat.getEffective által visszaadott adatot, ha a végső, megjelenített eredményre van szüksége. A hatékony adatok csak olvashatóak.

A példák futtatása előtt telepítse az Aspose.Slides for PHP via Java.

Compare Local, Inherited, and Effective Values

A következő teljes példa létrehoz egy alakzatot, és betűmagasságokat alkalmaz a bemutató, a bekezdés és a részlet szintjén. Minden lépés kiírja az adott szinteken definiált értékeket és az ugyanarra a szövegrészletre vonatkozó eredményes hatékony értéket. Emellett bemutatja, miért kell a hatékony adatot a formázás módosítása után újra beolvasni.

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

function formatLocalValue($value)
{
    return $value === null || is_nan($value) ? "<not set>" : (string)$value;
}

function printFontHeights($caption, $presentation, $paragraph, $portion)
{
    $presentationValue = java_values($presentation->getDefaultTextStyle()->getLevel(0)->getDefaultPortionFormat()->getFontHeight());
    $paragraphValue = java_values($paragraph->getParagraphFormat()->getDefaultPortionFormat()->getFontHeight());
    $localValue = java_values($portion->getPortionFormat()->getFontHeight());

    // Olvassa be a hatékony adatot az előző módosítások után.
    $effectiveValue = java_values($portion->getPortionFormat()->getEffective()->getFontHeight());

    echo $caption . PHP_EOL;
    echo "  Presentation default: " . formatLocalValue($presentationValue) . PHP_EOL;
    echo "  Paragraph default:    " . formatLocalValue($paragraphValue) . PHP_EOL;
    echo "  Portion local:        " . formatLocalValue($localValue) . PHP_EOL;
    echo "  Portion effective:    " . $effectiveValue . PHP_EOL;
}

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 500, 80, false);
    $textFrame = $shape->addTextFrame("Effective formatting");
    $paragraph = $textFrame->getParagraphs()->get_Item(0);
    $portion = $paragraph->getPortions()->get_Item(0);

    // Definiálja 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);

    printFontHeights("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);
    printFontHeights("A local value overrides inherited values", $presentation, $paragraph, $portion);

    // Az örökölt érték megváltoztatása nem írja felül a meglévő helyi értéket.
    $paragraph->getParagraphFormat()->getDefaultPortionFormat()->setFontHeight(30);
    printFontHeights("The local value still has priority", $presentation, $paragraph, $portion);

    // Törölje a helyi értéket. A részlet most ismét a bekezdéstől örököl.
    $portion->getPortionFormat()->setFontHeight(NAN);
    printFontHeights("The local value is cleared", $presentation, $paragraph, $portion);

    // Törölje a bekezdés értékét. A bemutató alapértelmezése most adja az eredményt.
    $paragraph->getParagraphFormat()->getDefaultPortionFormat()->setFontHeight(NAN);
    printFontHeights("The paragraph value is cleared", $presentation, $paragraph, $portion);

    $presentation->save("effective-properties.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

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 bemutató alapértelmezése. Más objektumoknak eltérő öröklődési láncaik lehetnek, de az elv ugyanaz: egy specifikusabb kifejezett érték nyer, és a getEffective a végső eredményt adja vissza.

Get Effective Text Properties

A szövegformázás több objektumra van osztva:

  • A TextFrameFormat.getEffective feloldja a szövegkeret tulajdonságait, mint például a margók, rögzítés, automatikus illesztés és a függőleges szövegirány.
  • A TextStyle.getEffective feloldja a bekezdésformázást minden szövegstílus szintjén.
  • A ParagraphFormat.getEffective feloldja a bekezdés tulajdonságait, például az igazítást, behúzást és a felsorolásjeleket.
  • A PortionFormat.getEffective feloldja a karaktertulajdonságokat, mint a betűmagasság, betűtípus, szín, félkövér és dőlt.

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

use aspose\slides\Presentation;

function formatEffectiveValue($javaValue)
{
    $value = java_values($javaValue);
    if ($value === null) {
        return "<not set>";
    }
    if (is_bool($value)) {
        return $value ? "true" : "false";
    }
    return (string)$value;
}

function hasNonEmptyText($shape)
{
    $textFrame = $shape->getTextFrame();
    if (java_is_null($textFrame)) {
        return false;
    }
    if (java_values($textFrame->getParagraphs()->getCount()) === 0) {
        return false;
    }
    return java_values($textFrame->getParagraphs()->get_Item(0)->getPortions()->getCount()) > 0;
}

function findAutoShapeWithText($slide)
{
    $autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
    $shapeCount = java_values($slide->getShapes()->size());
    for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
        $candidate = $slide->getShapes()->get_Item($shapeIndex);
        if (java_instanceof($candidate, $autoShapeClass) && hasNonEmptyText($candidate)) {
            return $candidate;
        }
    }
    return null;
}

$presentation = new Presentation("text-formatting.pptx");
try {
    if (java_values($presentation->getSlides()->size()) === 0) {
        throw new RuntimeException("The presentation contains no slides.");
    }

    $shape = findAutoShapeWithText($presentation->getSlides()->get_Item(0));
    if ($shape === null) {
        throw new RuntimeException("The first slide must contain an AutoShape with non-empty text.");
    }

    $textFrame = $shape->getTextFrame();
    $paragraph = $textFrame->getParagraphs()->get_Item(0);
    $portion = $paragraph->getPortions()->get_Item(0);

    $textFrameEffective = $textFrame->getTextFrameFormat()->getEffective();
    $paragraphEffective = $paragraph->getParagraphFormat()->getEffective();
    $portionEffective = $portion->getPortionFormat()->getEffective();

    echo "Text frame margins:" . PHP_EOL;
    echo "  Left: " . formatEffectiveValue($textFrameEffective->getMarginLeft()) . PHP_EOL;
    echo "  Top: " . formatEffectiveValue($textFrameEffective->getMarginTop()) . PHP_EOL;
    echo "  Right: " . formatEffectiveValue($textFrameEffective->getMarginRight()) . PHP_EOL;
    echo "  Bottom: " . formatEffectiveValue($textFrameEffective->getMarginBottom()) . PHP_EOL;
    echo "Paragraph alignment: " . formatEffectiveValue($paragraphEffective->getAlignment()) . PHP_EOL;
    echo "Font height: " . formatEffectiveValue($portionEffective->getFontHeight()) . PHP_EOL;
    echo "Bold: " . formatEffectiveValue($portionEffective->getFontBold()) . PHP_EOL;

    $effectiveTextStyle = $textFrame->getTextFrameFormat()->getTextStyle()->getEffective();
    for ($level = 0; $level < 9; $level++) {
        $levelEffective = $effectiveTextStyle->getLevel($level);
        echo "Level " . $level . " indent: " . formatEffectiveValue($levelEffective->getIndent()) . PHP_EOL;
    }
} finally {
    $presentation->dispose();
}

Get Effective 3D Properties

A ThreeDFormat.getEffective egy hatékony adatobjektumot ad vissza, amely egyesíti az összes feloldott 3D beállítást. Ennek getCamera, getLightRig, getBevelTop, és getBevelBottom metódusai a megfelelő hatékony adatot teszik elérhetővé. Ezen kapcsolódó beállítások közös olvasása megkönnyíti a forma végső 3D megjelenésének megértését.

Ezzel a példával a shape-3d.pptx fájlnak az első diáján legalább egy alakzatot kell tartalmaznia. Alkalmazzon 3D kamerát, fényeket vagy rézsút beállításokat az alakzatra, ha azt szeretné, hogy a kimenet az alapértelmezettől eltérő értékeket tartalmazzon.

use aspose\slides\Presentation;

function formatEffectiveValue($javaValue)
{
    $value = java_values($javaValue);
    return $value === null ? "<not set>" : (string)$value;
}

$presentation = new Presentation("shape-3d.pptx");
try {
    if (java_values($presentation->getSlides()->size()) === 0 || java_values($presentation->getSlides()->get_Item(0)->getShapes()->size()) === 0) {
        throw new RuntimeException("The first slide must contain a shape.");
    }

    $shape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    $threeDEffective = $shape->getThreeDFormat()->getEffective();

    echo "Camera:" . PHP_EOL;
    echo "  Type: " . formatEffectiveValue($threeDEffective->getCamera()->getCameraType()) . PHP_EOL;
    echo "  Field of view: " . formatEffectiveValue($threeDEffective->getCamera()->getFieldOfViewAngle()) . PHP_EOL;
    echo "  Zoom: " . formatEffectiveValue($threeDEffective->getCamera()->getZoom()) . PHP_EOL;

    echo "Light rig:" . PHP_EOL;
    echo "  Type: " . formatEffectiveValue($threeDEffective->getLightRig()->getLightType()) . PHP_EOL;
    echo "  Direction: " . formatEffectiveValue($threeDEffective->getLightRig()->getDirection()) . PHP_EOL;

    echo "Top bevel:" . PHP_EOL;
    echo "  Type: " . formatEffectiveValue($threeDEffective->getBevelTop()->getBevelType()) . PHP_EOL;
    echo "  Width: " . formatEffectiveValue($threeDEffective->getBevelTop()->getWidth()) . PHP_EOL;
    echo "  Height: " . formatEffectiveValue($threeDEffective->getBevelTop()->getHeight()) . PHP_EOL;
} finally {
    $presentation->dispose();
}

Get Effective Table Formatting

A táblázatformázás származhat a táblázat stílusából, illetve a teljes táblázatra, egy oszlopra, egy sorra vagy egy egyedi cellára alkalmazott formátumokból. Az explicit módon definiált kitöltések ütközése esetén a prioritás: cella, sor, oszlop, majd a teljes táblázat. Egy cella hatékony formátuma a végső formátum, amely a cellát megrajzolja.

Ehhez a példához a table-formatting.pptx fájlnak az első diáján legalább egy táblázatot kell tartalmaznia. 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.

use aspose\slides\Presentation;

function findTable($slide)
{
    $tableClass = new JavaClass("com.aspose.slides.Table");
    $shapeCount = java_values($slide->getShapes()->size());
    for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
        $shape = $slide->getShapes()->get_Item($shapeIndex);
        if (java_instanceof($shape, $tableClass)) {
            return $shape;
        }
    }
    return null;
}

$presentation = new Presentation("table-formatting.pptx");
try {
    if (java_values($presentation->getSlides()->size()) === 0) {
        throw new RuntimeException("The presentation contains no slides.");
    }

    $table = findTable($presentation->getSlides()->get_Item(0));
    if ($table === null) {
        throw new RuntimeException("The first slide must contain a table.");
    }
    if (java_values($table->getRows()->size()) === 0 || java_values($table->getColumns()->size()) === 0) {
        throw new RuntimeException("The table must contain at least one cell.");
    }

    $tableEffective = $table->getTableFormat()->getEffective();
    $rowEffective = $table->getRows()->get_Item(0)->getRowFormat()->getEffective();
    $columnEffective = $table->getColumns()->get_Item(0)->getColumnFormat()->getEffective();
    $cellEffective = $table->get_Item(0, 0)->getCellFormat()->getEffective();

    echo "Table fill: " . java_values($tableEffective->getFillFormat()->getFillType()) . PHP_EOL;
    echo "Row fill: " . java_values($rowEffective->getFillFormat()->getFillType()) . PHP_EOL;
    echo "Column fill: " . java_values($columnEffective->getFillFormat()->getFillType()) . PHP_EOL;
    echo "Final cell fill: " . java_values($cellEffective->getFillFormat()->getFillType()) . PHP_EOL;
} finally {
    $presentation->dispose();
}

Ha a színre van szüksége, nem csak a kitöltés típusára, először ellenőrizze a hatékony getFillType értéket, majd olvassa el az arra vonatkozó metódust – például a getSolidFillColor egy szilárd kitöltés esetén.

Re-read Effective Data After Changes

A hatékony adatok leírják a formázási hierarchiát a feloldás időpontjában. Hívja újra a getEffective függvényt, miután bármit módosított, ami részt vehet ebben a hierarchiában, többek között:

  • az objektum helyi formázását;
  • bekezdés vagy szövegkeret alapértelmezéseit;
  • egy táblázat stílusát, táblázatot, oszlopot, sort vagy cellaformátumot;
  • elrendezés vagy mesterdia formázását;
  • téma adatokat vagy a bemutató szintű alapértelmezéseket;
  • a diára rendelt elrendezést vagy mestert.

Ne tartson hatékony adatobjektumot állandó pillanatképként. Az Aspose.Slides belül cache-elhet bizonyos hatékony adatokat, és egy későbbi getEffective hívás frissítheti azokat. Ha az értékek összehasonlítására van szükség a módosítás előtt és után, másolja a szükséges skáláris értékeket – például betűmagasság, szín, igazítás vagy rézsútszélesség – saját változóiba a módosítás előtt.

Az érték megváltoztatásához frissítse a megfelelő helyi formátumobjektumot, majd hívja a getEffective függvényt az eredmény ellenőrzéséhez. A hatékony adatobjektumok maguk csak olvashatóak.

FAQ

How can I tell which level supplied an effective value?

A hatékony adat tartalmazza a végleges értéket, de nem annak forrását. Vizsgálja meg a megfelelő helyi objektumokat a legspecifikusabb szintről kifelé. Szöveg esetén ez magában foglalhatja a részletet, bekezdést, szövegkeretet, elrendezést, mestert, témát és a bemutató alapértelmezéseit. A NAN vagy null értékek jelzik, hogy a keresés egy másik szintre folytatódik.

What happens when no level defines a property?

Az Aspose.Slides a megfelelő PowerPoint vagy könyvtár alapértelmezést alkalmazza. Ez a feloldott érték megjelenik a hatékony adatokban, még akkor is, ha egy helyi objektum sem definiálja kifejezetten.

Why does an effective value sometimes equal the local value?

A helyi érték nyerte meg az öröklési számítást. Ez akkor várható, amikor a tulajdonság kifejezetten be van állítva az objektumon, és nincs specifikusabb szabály, ami felülírná.

When should I use local data instead of effective data?

Használjon helyi adatot egy adott formázási szint megtekintésére vagy szerkesztésére. Használjon hatékony adatot, ha a végső megjelenésre van szükség az öröklődés, a téma szabályok és a megfelelő stílusok feloldása után. A complete comparison example mindkettőt bemutatja ugyanabban a munkafolyamatban.