Szövegdobozok kezelése prezentációkban PHP-vel

Bevezetés

A diákon a szövegek általában szövegdobozokban vagy alakzatokban jelennek meg. Ezért a diára szöveget hozzáadni egy szövegdobozt kell létrehozni, majd szöveget helyezni a dobobozba. Az Aspose.Slides for PHP via Java a AutoShape osztályt biztosítja, amely lehetővé teszi, hogy szöveget tartalmazó alakzatot adjunk hozzá.

Szövegdoboz létrehozása a dián

A szövegdoboz létrehozásához a dián kövesse az alábbi lépéseket:

  1. Hozzon létre egy példányt a Presentation osztályból.
  2. Szerezzen referenciát az újonnan létrehozott prezentáció első diájához.
  3. Adjon hozzá egy AutoShape objektumot, amelynek alakzattípusa Rectangle, a dián megadott pozícióban, és szerezze meg az újonnan hozzáadott AutoShape objektum referenciáját.
  4. Adjon egy TextFrame elemet az AutoShape objektumhoz, amely szöveget tartalmaz. Az alábbi példában ezt a szöveget adtuk hozzá: Aspose TextBox
  5. Végül írja ki a PPTX fájlt a Presentation objektumon keresztül.

Ez a PHP kód – a fenti lépések megvalósítása – megmutatja, hogyan adjon szöveget egy diához:

  # Példányosítja a Presentation objektumot
  $pres = new Presentation();
  try {
    # Lekéri a prezentáció első diáját
    $sld = $pres->getSlides()->get_Item(0);
    # Hozzáad egy AutoShape-et típusként Rectangle
    $ashp = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 75, 150, 50);
    # Hozzáad egy TextFrame-et a Rectangle-hez
    $ashp->addTextFrame(" ");
    # Eléri a szövegkeretet
    $txtFrame = $ashp->getTextFrame();
    # Létrehozza a Paragraph objektumot a szövegkerethez
    $para = $txtFrame->getParagraphs()->get_Item(0);
    # Létrehozza a Portion objektumot a bekezdéshez
    $portion = $para->getPortions()->get_Item(0);
    # Beállítja a szöveget
    $portion->setText("Aspose TextBox");
    # Mentés a prezentációt a lemezre
    $pres->save("TextBox_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Alakzat ellenőrzése szövegdobozként

Az Aspose.Slides a isTextBox metódust biztosítja az AutoShape osztályból, amely lehetővé teszi az alakzatok vizsgálatát és a szövegdobozok azonosítását.

Szövegdoboz és alakzat

Ez a PHP kód megmutatja, hogyan ellenőrizhetjük, hogy egy alakzat szövegdobozként lett-e létrehozva:

class ShapeCallback {
    function invoke($shape, $slide, $index) {
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
            $autoShape = $shape;
            echo(java_is_true($autoShape->isTextBox()) ? "shape is a text box" : "shape is not a text box");
        }
    }
}

$presentation = new Presentation("sample.pptx");
try {
    $forEachShapeCallback = java_closure(new ShapeCallback(), null, java("com.aspose.slides.ForEachSlideCallback"));
    ForEach::shape($presentation, $forEachShapeCallback);
} finally {
    $presentation->dispose();
}

Vegye figyelembe, hogy ha egyszerűen csak egy autoshape‑t ad hozzá a ShapeCollection osztály addAutoShape metódusával, az autoshape isTextBox metódusa false értéket ad vissza. Azonban ha szöveget ad a autoshape‑hez a addTextFrame vagy a setText metódussal, a isTextBox tulajdonság true értéket ad vissza.

$presentation = new Presentation();
$slide = $presentation->getSlides()->get_Item(0);

$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
// shape1->isTextBox() false-t ad vissza
$shape1->addTextFrame("shape 1");
// shape1->isTextBox() true-t ad vissza

$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 110, 100, 40);
// shape2->isTextBox() false-t ad vissza
$shape2->getTextFrame()->setText("shape 2");
// shape2->isTextBox() true-t ad vissza

$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 210, 100, 40);
// shape3->isTextBox() false-t ad vissza
$shape3->addTextFrame("");
// shape3->isTextBox() false-t ad vissza

$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 310, 100, 40);
// shape4->isTextBox() false-t ad vissza
$shape4->getTextFrame()->setText("");
// shape4->isTextBox() false-t ad vissza

Oszlopok hozzáadása szövegdobozhoz

Az Aspose.Slides a setColumnCount és a setColumnSpacing metódusokat biztosítja a TextFrameFormat osztályból, amelyek lehetővé teszik oszlopok hozzáadását a szövegdobozokhoz. Megadhatja a szövegdobozban lévő oszlopok számát, és beállíthatja az oszlopok közötti távolságot pontban.

Ez a kód demonstrálja a leírt műveletet:

  $pres = new Presentation();
  try {
    # Lekéri a prezentáció első diáját
    $slide = $pres->getSlides()->get_Item(0);
    # Hozzáad egy AutoShape-et típusként Rectangle
    $aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
    # Hozzáad egy TextFrame-et a Rectangle-hez
    $aShape->addTextFrame("All these columns are limited to be within a single text container -- " . "you can add or delete text and the new or remaining text automatically adjusts " . "itself to flow within the container. You cannot have text flow from one container " . "to other though -- we told you PowerPoint's column options for text are limited!");
    # Lekéri a TextFrame szövegformátumát
    $format = $aShape->getTextFrame()->getTextFrameFormat();
    # Meghatározza a oszlopok számát a TextFrame-ben
    $format->setColumnCount(3);
    # Meghatározza az oszlopok közötti távolságot
    $format->setColumnSpacing(10);
    # Mentés a prezentációt
    $pres->save("ColumnCount.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Oszlopok hozzáadása szövegkerethez

Az Aspose.Slides for PHP via Java a setColumnCount metódust biztosítja a TextFrameFormat osztályból, amely lehetővé teszi oszlopok hozzáadását a szövegkeretekben. Ezen tulajdonság segítségével megadhatja a kívánt oszlopszámot a szövegkeretben.

Ez a PHP kód megmutatja, hogyan adjon egy oszlopot egy szövegkerethez:

  $outPptxFileName = "ColumnsTest.pptx";
  $pres = new Presentation();
  try {
    $shape1 = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
    $format = $shape1->getTextFrame()->getTextFrameFormat();
    $format->setColumnCount(2);
    $shape1->getTextFrame()->setText("All these columns are forced to stay within a single text container -- " . "you can add or delete text - and the new or remaining text automatically adjusts " . "itself to stay within the container. You cannot have text spill over from one container " . "to other, though -- because PowerPoint's column options for text are limited!");
    $pres->save($outPptxFileName, SaveFormat::Pptx);
    $test = new Presentation($outPptxFileName);
    try {
      $autoShape = $test->getSlides()->get_Item(0)->getShapes()->get_Item(0);
      Assert->assertTrue(2 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
      Assert->assertTrue(Double->NaN == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
    } finally {
      if (!java_is_null($test)) {
        $test->dispose();
      }
    }
    $format->setColumnSpacing(20);
    $pres->save($outPptxFileName, SaveFormat::Pptx);
    $test1 = new Presentation($outPptxFileName);
    try {
      $autoShape = $test1->getSlides()->get_Item(0)->getShapes()->get_Item(0);
      Assert->assertTrue(2 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
      Assert->assertTrue(20 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
    } finally {
      if (!java_is_null($test1)) {
        $test1->dispose();
      }
    }
    $format->setColumnCount(3);
    $format->setColumnSpacing(15);
    $pres->save($outPptxFileName, SaveFormat::Pptx);
    $test2 = new Presentation($outPptxFileName);
    try {
      $autoShape = $test2->getSlides()->get_Item(0)->getShapes()->get_Item(0);
      Assert->assertTrue(3 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
      Assert->assertTrue(15 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
    } finally {
      if (!java_is_null($test2)) {
        $test2->dispose();
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Szöveg frissítése

Az Aspose.Slides lehetővé teszi a szövegdobozban vagy a prezentációban lévő összes szöveg módosítását vagy frissítését.

Ez a PHP kód bemutat egy műveletet, amely a prezentációban lévő összes szöveget frissíti vagy megváltoztatja:

  $pres = new Presentation("text.pptx");
  try {
    foreach($pres->getSlides() as $slide) {
      foreach($slide->getShapes() as $shape) {
        # Ellenőrzi, hogy az alakzat támogatja-e a szövegkeretet (IAutoShape).
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
          $autoShape = $shape;
          # Végigiterál a szövegkeret bekezdésein
          foreach($autoShape->getTextFrame()->getParagraphs() as $paragraph) {
            # Végigiterál a bekezdés minden részén
            foreach($paragraph->getPortions() as $portion) {
              $portion->setText($portion->getText()->replace("years", "months"));// Megváltoztatja a szöveget

              $portion->getPortionFormat()->setFontBold(NullableBool::True);// Megváltoztatja a formázást

            }
          }
        }
      }
    }
    # Elmenti a módosított prezentációt
    $pres->save("text-changed.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Szövegdoboz hozzáadása hiperhivatkozással

Hiperhivatkozást szúrhat be egy szövegdobozba. Amikor a szövegdobozra kattintanak, a felhasználók a hivatkozás megnyitására kerülnek irányításra.

A hivatkozást tartalmazó szövegdoboz hozzáadásához kövesse az alábbi lépéseket:

  1. Hozzon létre egy példányt a Presentation osztályból.
  2. Szerezzen referenciát az újonnan létrehozott prezentáció első diájához.
  3. Adjon hozzá egy AutoShape objektumot, amelynek ShapeType értéke Rectangle, a dián megadott pozícióban, és szerezze meg az újonnan hozzáadott AutoShape objektum referenciáját.
  4. Adjon egy TextFrame elemet az AutoShape objektumhoz, amely Aspose TextBox alapértelmezett szöveget tartalmaz.
  5. Hozza létre a HyperlinkManager osztályt.
  6. Rendeljen hiperhivatkozást a setExternalHyperlinkClick metódus segítségével a TextFrame kívánt részéhez.
  7. Végül írja ki a PPTX fájlt a Presentation objektumon keresztül.

Ez a PHP kód – a fenti lépések megvalósítása – megmutatja, hogyan adjon szövegdobozt hiperhivatkozással egy diához:

  # Példányosít egy Presentation osztályt, amely egy PPTX-et képvisel
  $pres = new Presentation();
  try {
    # Lekéri a prezentáció első diáját
    $slide = $pres->getSlides()->get_Item(0);
    # Hozzáad egy AutoShape objektumot, amelynek típusa Rectangle
    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 150, 150, 50);
    # Átalakítja az alakzatot AutoShape típusra
    $pptxAutoShape = $shape;
    # Eléri az AutoShape-hez kapcsolódó ITextFrame tulajdonságot
    $pptxAutoShape->addTextFrame("");
    $textFrame = $pptxAutoShape->getTextFrame();
    # Szöveget ad a kerethez
    $textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->setText("Aspose.Slides");
    # Beállítja a hiperhivatkozást a rész szövegéhez
    $hyperlinkManager = $textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->getHyperlinkManager();
    $hyperlinkManager->setExternalHyperlinkClick("http://www.aspose.com");
    # Elmenti a PPTX prezentációt
    $pres->save("hLink_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

GYIK

Mi a különbség egy szövegdoboz és egy szöveghelyettesítő között, amikor mesterdiákkal dolgozunk?

Egy placeholder örökli a stílust/pozíciót a master diától, és felülírható a layouts diáknál, míg egy hagyományos szövegdoboz egy független objektum egy adott dián, és nem változik, amikor elrendezéseket váltunk.

Hogyan hajthatok végre tömeges szövegcserét a prezentációban anélkül, hogy a diagramok, táblázatok és SmartArt szövegét módosítanám?

Korlátozza az iterációt azokra az autoshape‑okra, amelyeknek van szövegkerete, és hagyja ki a beágyazott objektumokat (charts, tables, SmartArt) úgy, hogy külön gyűjteményeken járja be őket, vagy kihagyja ezeket az objektumtípusokat.