Szövegmezők kezelése PowerPoint prezentációkban PHP-vel
Áttekintés
Egy szöveges bekezdés részekből áll. Egy szokásos Portion literális szöveget tartalmaz; egy mező résznek továbbá van egy Field, amelynek típusa egy automatikusan frissülő értéket azonosít, például diaszámot vagy dátumot. Két rész is megjeleníthet ugyanazokat a karaktereket, de csak az egyik tartalmaz mezőt.
Használd a Portion::getField metódust a megkülönböztetéshez: szokásos szöveg esetén null. A Portion::addField egy meglévő részt mezővé konvertál. Tarts egy címkét és annak dinamikus értékét külön részekben, hogy az érték konvertálása ne cserélje le a címkét is.
Ez az útmutató a szövegen belüli mezőket, azok formázását és PPTX‑ben illetve PPT‑ben történő mentését tárgyalja. A szövegkeretekkel és bekezdésekkel kapcsolatban lásd a Szöveg kezelése oldalt.
Dia szám mező létrehozása
Az alábbi teljes példa egy szövegdobozt hoz létre, amely egy literális Slide címkét tartalmaz, majd egy automatikusan frissülő számot. A mező hozzáadása előtt beállítja a szám méretét, vastagságát és színét, majd újra megnyitja a mentett prezentációt és ellenőrzi a mező típusát, szövegét és formázását. Bemeneti fájl nem szükséges.
use aspose\slides\FieldType;
use aspose\slides\FillType;
use aspose\slides\NullableBool;
use aspose\slides\Portion;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 40, 240, 50);
$shape->addTextFrame("Slide ");
$paragraph = $shape->getTextFrame()->getParagraphs()->get_Item(0);
$numberPortion = new Portion();
$numberColor = new Java("java.awt.Color", 0, 0, 139);
$numberPortion->getPortionFormat()->setFontHeight(24);
$numberPortion->getPortionFormat()->setFontBold(NullableBool::True);
$numberPortion->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$numberPortion->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor($numberColor);
$paragraph->getPortions()->add($numberPortion);
$numberPortion->addField(FieldType::getSlideNumber());
$presentation->save("slide_number.pptx", SaveFormat::Pptx);
$reopened = new Presentation("slide_number.pptx");
try {
$savedShape = $reopened->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$savedNumber = $savedShape->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(1);
$savedField = $savedNumber->getField();
$hasNumberField = !java_is_null($savedField) && java_values(FieldType::getSlideNumber()->getInternalString()) === java_values($savedField->getType()->getInternalString());
$format = $savedNumber->getPortionFormat();
$formattingPreserved = java_values($format->getFontHeight()) == 24 && java_values($format->getFontBold()) == NullableBool::True;
$formattingPreserved = $formattingPreserved && java_values($format->getFillFormat()->getSolidFillColor()->getColor()->getRGB()) == java_values($numberColor->getRGB());
echo "Text: " . $savedShape->getTextFrame()->getText() . PHP_EOL;
echo "Slide number field: " . ($hasNumberField ? "true" : "false") . PHP_EOL;
echo "Formatting preserved: " . ($formattingPreserved ? "true" : "false") . PHP_EOL;
} finally {
$reopened->dispose();
}
} finally {
$presentation->dispose();
}
Az új prezentáció az 1-es diaszámmal kezdődik, így a szöveg Slide 1, és mindkét ellenőrzés true‑t ad ki. A szám a megnyitás után is mező marad; nem egy literális 1. A ellenőrzésben szereplő indexek a példában létrehozott alakzatot és részeket jelölik.
Mező típusának kiválasztása
FieldType a következő metódusokat biztosít előre definiált értékek lekéréséhez. A megfelelő értéket add át az addField metódusnak.
| Módszer | Leírás |
|---|---|
| getSlideNumber | A jelenlegi diaszám. |
| getDateTime | A dátum/idő az alkalmazás alapértelmezett formátumában. |
| getDateTime1–getDateTime9 | Előre definiált dátum vagy kombinált dátum/idő formátumok. |
| getDateTime10–getDateTime13 | Előre definiált időformátumok, másodpercel és 12 órás órajel opcióval. |
| getHeader | Fejlécmező; lásd az alább szereplő helyőrző és formátumkorlátozások. |
| getFooter | Láblécmező. |
Például a getDateTime3 egy napot, a teljes hónap nevét és évet angolul jelenít meg. Ezek előre definiált mezőformátumok, nem tetszőleges PHP dátumformátum‑karakterláncok. A setLanguageId‑vel beállított nyelv és a prezentációt feldolgozó alkalmazás befolyásolhatja a megjelenített eredményt.
Mező létrehozása belső karakterláncból
Az addField karakterlánc‑túlterhelése belső mezőazonosítót fogad. Akkor használd, amikor egy másik alkalmazás által megadott, előre definiált értékkel nem rendelkező azonosítót szeretnéd megőrizni. Létrehozhatsz egy FieldType-t is az azonosítóból. A FieldType::getInternalString ezt az azonosítót teszi láthatóvá ellenőrzés céljából.
Ez a példa egy alkalmazás‑specifikus custom-report-id mezőt tárol a tartalék szöveggel Report-042. Az azonosító nem regisztrál számítást: az Aspose.Slides nem generál jelentés‑azonosítókat ismeretlen típus esetén. Az azonosítót értő alkalmazásnak kell biztosítania a jelentését és frissítenie az értékét.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$shape = $presentation->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 40, 300, 50);
$shape->addTextFrame("Report-042");
$portion = $shape->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$portion->addField("custom-report-id");
$presentation->save("custom_field.pptx", SaveFormat::Pptx);
$reopened = new Presentation("custom_field.pptx");
try {
$savedShape = $reopened->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$savedPortion = $savedShape->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$savedField = $savedPortion->getField();
$typeName = java_is_null($savedField) ? "ordinary text" : java_values($savedField->getType()->getInternalString());
echo "Type: " . $typeName . PHP_EOL;
echo "Text: " . $savedPortion->getText() . PHP_EOL;
} finally {
$reopened->dispose();
}
} finally {
$presentation->dispose();
}
A PPTX körbejárás után a típus custom-report-id és a szöveg Report-042. Egy Y-m-d karakterlánc átadása mezőtípust nevezne; nem hozna létre egy egyedi dátumformátumot. Rögzített dátum tetszőleges formátumban a szokásos szöveget kell használni.
Dátum/idő mezők ellenőrzése, módosítása és eltávolítása
Módosíts egy meglévő mezőt a Field::setType segítségével. Ellenőrizd, hogy a mező létezik-e, mielőtt a típusához férnél hozzá. Az automatikus frissítések leállításához hívd a Portion::removeField metódust. Ez megőrzi a részt és a jelenlegi szövegét, miközben eltávolítja a mezőkapcsolatot. Ha egy konkrét rögzített értékre van szükség, a mező eltávolítása után rendeld hozzá azt a szöveget.
A dátum/idő mező feldolgozásával kapcsolatos API-beállításért lásd a Presentation::setCurrentDateTime metódust. Az alábbi példa egy kifejezett jóváhagyási dátumot használ a mező szokásos szöveggé alakításakor.
Töltsd le a sample.pptx fájlt, és helyezd el a JavaBridge munkakönyvtárában, vagy add meg abszolút elérési útját a prezentáció konstruktornak. A fájl két elnevezett szöveges alakzatot tartalmaz, UpdatedAt és ApprovedDate, mindegyik egy dátum/idő mezővel, valamint szokásos szövegcímkékkel. Az alábbi példa végigjárja a felső szintű szöveges alakzatokat a normál diákon. A dátum/idő mezőket hosszú dátumformátumra módosítja és dőlté teszi őket, miközben a többi formázásuk változatlan marad. Csak a ApprovedDate mezők válnak rögzített szöveggé.
A minta felismert a beépített belső azonosítókat datetime és datetime1‑től datetime13‑ig. Csoportok, táblák, jegyzetek, elrendezések és fő sablonok saját szövegtárolóik bejárását igénylik, és kívül esnek ennek a példának a hatókörén.
use aspose\slides\FieldType;
use aspose\slides\NullableBool;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("sample.pptx");
try {
$approvalDate = new DateTimeImmutable("2030-04-05");
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
for ($slideIndex = 0; $slideIndex < java_values($presentation->getSlides()->size()); $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
for ($shapeIndex = 0; $shapeIndex < java_values($slide->getShapes()->size()); $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
if (!java_instanceof($shape, $autoShapeClass)) {
continue;
}
$textShape = $shape;
if (java_is_null($textShape->getTextFrame())) {
continue;
}
for ($paragraphIndex = 0; $paragraphIndex < java_values($textShape->getTextFrame()->getParagraphs()->getCount()); $paragraphIndex++) {
$paragraph = $textShape->getTextFrame()->getParagraphs()->get_Item($paragraphIndex);
for ($portionIndex = 0; $portionIndex < java_values($paragraph->getPortions()->getCount()); $portionIndex++) {
$portion = $paragraph->getPortions()->get_Item($portionIndex);
$field = $portion->getField();
if (java_is_null($field)) {
continue;
}
$typeName = java_values($field->getType()->getInternalString());
$isDateTime = $typeName != null && preg_match("/\Adatetime([1-9]|1[0-3])?\z/", $typeName) === 1;
if (!$isDateTime) {
continue;
}
$field->setType(FieldType::getDateTime3());
$portion->getPortionFormat()->setLanguageId("en-US");
$portion->getPortionFormat()->setFontItalic(NullableBool::True);
if (java_values($textShape->getName()) === "ApprovedDate") {
$portion->removeField();
$fixedDate = $approvalDate->format("d F Y");
$portion->setText($fixedDate);
}
}
}
}
}
$presentation->save("updated_dates.pptx", SaveFormat::Pptx);
$reopened = new Presentation("updated_dates.pptx");
try {
for ($shapeIndex = 0; $shapeIndex < java_values($reopened->getSlides()->get_Item(0)->getShapes()->size()); $shapeIndex++) {
$shape = $reopened->getSlides()->get_Item(0)->getShapes()->get_Item($shapeIndex);
if (!java_instanceof($shape, $autoShapeClass)) {
continue;
}
$textShape = $shape;
if (java_is_null($textShape->getTextFrame())) {
continue;
}
if (java_values($textShape->getName()) !== "UpdatedAt" && java_values($textShape->getName()) !== "ApprovedDate") {
continue;
}
$portion = $textShape->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$field = $portion->getField();
$typeName = java_is_null($field) ? "ordinary text" : java_values($field->getType()->getInternalString());
echo $textShape->getName() . ": " . $typeName . "; " . $portion->getText() . PHP_EOL;
echo "Italic: " . $portion->getPortionFormat()->getFontItalic() . PHP_EOL;
}
} finally {
$reopened->dispose();
}
} finally {
$presentation->dispose();
}
A megnyitás után az UpdatedAt típusa datetime3 és dinamikus marad. Az ApprovedDate nem tartalmaz mezőt és a 05 April 2030 szöveget tartalmazza. Mindkét dátumrész dőlt, és az eredeti betűméret, félkövér beállítás és szín változatlan marad. A szokásos szövegcímkék nem változnak. Az ellenőrzés a megadott mintában a két ismert alakzat első részét olvassa.
Szövegformázás megőrzése
A meglévő résszel dolgozz a mező hozzáadásakor, típusának módosításakor vagy eltávolításakor. Ezek a műveletek megőrzik a rész formázását. Használd a Portion::getPortionFormat metódust csak a szükséges tulajdonságok módosításához, ahogy a példák a szín vagy dőlt esetében teszik.
Kerüld el egy egész szövegkeret újjáépítését csak egy mező frissítése miatt: ez elveszítheti az eredeti részek határait és egyedi formázását. Emellett különböztetd meg a kifejezetten beállított formázást a bekezdésből, elrendezésből vagy témából örökölt formázástól. Lásd a Szövegformázás oldalt a szélesebb formázási lehetőségekért.
Mezők és fejléc/lábléc helyőrzők
Egy mező a szöveg részének része. Egy helyőrző egy olyan alakzat, amely a prezentációban szerepet kap, például lábléc vagy diaszám. Egy mező hozzáadása egy szokásos szövegdobozhoz nem alakítja azt helyőrzővé.
A fejléc-/lábléc kezelők szabályozzák a helyőrző szöveget és láthatóságot a diákon, elrendezéseken és fő sablonokon, beleértve a függő diákra való terjesztést. Egy számmező egy egyéni szövegdobozban ezért hasznos lehet akkor is, ha nem használod a diaszám helyőrzőt. Ezzel szemben a helyőrző láthatóságának módosítása nem távolítja el a mezőt egy nem kapcsolódó szövegdobozból.
Az előre definiált fejléc és lábléc típusok nem hoznak létre a megfelelő helyőrzőket, és nem biztosítják azok tartalmát. Különösen, egy szabványos PowerPoint dia nem rendelkezik fejléc helyőrzővel; a fejlécek a jegyzetoldalakhoz és a szórólapokhoz tartoznak. Ne tévedj, hogy egy fejléc vagy lábléc mező egy tetszőleges alakzatban automatikusan megkapja a helyőrzőkezelő által beállított szöveget. Ehhez a munkafolyamathoz lásd a Prezentáció fejlécek és láblécek oldalt.
PPTX és PPT korlátai
Ellenőrizd a mező típusát és a kapott szöveget a mentés és újra megnyitás után is. Egy azonosító megőrzése nem bizonyítja, hogy egy alkalmazás ki tudja számolni vagy megjeleníteni az értékét.
| Formátum | Mező viselkedése és korlátai |
|---|---|
| PPTX | A PPTX a belső mezőazonosítókat tárolja a mező szövegével együtt. A körbehajtás ellenőrzéseknél a fenti előre definiált típusok és a saját azonosító megmaradt a mentés és újra megnyitás során. Az ismeretlen egyedi típus megtartotta a tartalék szöveget; nem kapott automatikus számítási logikát. Egy másik alkalmazás másként kezelheti a nem támogatott azonosítókat. |
| PPT | A PPT régi mezőábrázolásokat használ és korlátozottabb kompatibilitással rendelkezik. A körbehajtás ellenőrzéseknél a diaszám- és előre definiált dátum/idő mezők megmaradtak a mentés és újra megnyitás után. Egy egyéni mező egy szokásos diaszövegdobozban azonosítóval nyílt meg, de szövege * volt; egy fejlécmező ugyanabban a kontextusban szintén *-ot adott. Ne számíts az egyedi mezőkre vagy a nem támogatott mezőkontextusokra, hogy megtartják a látható szöveget. |
Hordozható, rögzített kimenethez alakítsd át a nem támogatott mezőket szokásos szöveggé, és a mentés előtt add meg a kívánt értéket. Ez megőrzi a kiválasztott szöveget, de szándékosan leállítja az automatikus frissítéseket. Teszteld a célalkalmazást is, ha a saját mező újraszámítása része a munkafolyamatnak.
GYIK
Hogyan tudom megállapítani, hogy a megjelenített szám vagy dátum mező?
Vizsgáld meg a Portion::getField metódust. A nem null érték mezőt jelöl; a megjelenített szöveg önmagában nem árul el semmit.
Eltávolítja-e egy mező a szöveget vagy a formázást?
Nem. A removeField a meglévő részt szokásos szöveggé alakítja. Ha egy konkrét rögzített dátumra vagy tartalék értékre van szükség, rendelj hozzá egy explicit értéket utána.
Határozhat‑e egy belső karakterlánc új dátumformátumot vagy képletet?
Nem. Az egy mező típust azonosít. Egy ismeretlen azonosító nem biztosít kiértékelőt vagy PHP dátumformátum‑mintát. Használj egy támogatott előre definiált típust, vagy formázd a értéket saját magad szokásos szövegként.
Miért ellenőrizd újra a prezentációt a mentés után?
A mezőazonosítók, a számított szöveg és a formázás különálló elemek, amelyeket ellenőrizni kell. A formátumkonverzió megváltoztathatja a látható eredményt, még ha a mezőazonosító továbbra is jelen van.