Prezentációk exportálása XAML-be PHP használatával

Áttekintés

Ez a cikk bemutatja, hogyan lehet PowerPoint‑prezentációkat exportálni XAML‑be az Aspose.Slides használatával. Tartalmaz egy rövid bevezetést a XAML‑ba, bemutatja, hogyan lehet egy prezentációt XAML‑be menteni az alapértelmezett beállításokkal, és demonstrálja, hogyan lehet testre szabni az exportálást a XamlOptions használatával, beleértve a rejtett diák exportálását is. A cikk továbbá válaszol néhány gyakori kérdésre, amelyek a tartalék betűtípusokra, a XAML‑verem kompatibilitásra és a rejtett diák exportálási viselkedésére vonatkoznak.

A XAML‑ról

A XAML egy XML‑alapú jelölőnyelv, amelyet felhasználói felületek leírására használnak olyan keretrendszerekben, mint a WPF (Windows Presentation Foundation), az UWP (Universal Windows Platform) és a Xamarin.Forms.

A XAML‑fájlokkal dolgozhat vizuális tervezőben, vagy közvetlenül írhatja és szerkesztheti a jelölőt.

Prezentációk exportálása XAML‑be alapértelmezett beállításokkal

Az alábbi PHP‑példa megmutatja, hogyan lehet egy prezentációt XAML‑be exportálni alapértelmezett beállításokkal. Inicializálja a PHP Java Bridge‑et, és töltse be a aspose.slides.php‑t, mielőtt a cikkben szereplő példákat futtatná. Helyezze a pres.pptx‑t a Java Bridge szerver munkakönyvtárába, vagy adjon meg egy abszolút útvonalat, amely a szerver számára elérhető.

use aspose\slides\Presentation;
use aspose\slides\XamlOptions;

$presentation = new Presentation("pres.pptx");
try {
    $options = new XamlOptions();
    $presentation->save($options);
} finally {
    $presentation->dispose();
}

Alapértelmezés szerint az exportált diák egy pres almappába kerülnek a Java Bridge szerver aktuális munkakönyvtárában. A mappa automatikusan létrejön, és a szükséges képek is oda kerülnek mentésre.

A kimeneti mappa neve a forrásfájl neve a kiterjesztés nélkül. A pres.pptx esetén a kimeneti fájlok nevei pres/Slide_1.xaml, pres/Slide_2.xaml stb. Még ha abszolút útvonalat ad meg a bemeneti prezentációnak, a kimeneti mappa a Java Bridge szerver aktuális munkakönyvtárához viszonyítva jön létre, nem pedig a bemeneti fájl mellett.

Prezentációk exportálása XAML‑be egyéni beállításokkal

Használja az IXamlOptions interfészt, hogy szabályozza, hogyan exportálja az Aspose.Slides a prezentációt XAML‑be.

A kimenet egyedi helyre mentéséhez biztosítson egy Java proxy‑t, amely megvalósítja a IXamlOutputSaver interfészt, és adja át ennek egy példányát a setOutputSaver metódusnak a XamlOptions objektumból.

A rejtett diák XAML‑kimenetben való szerepeltetéséhez hívja meg a setExportHiddenSlides metódust true értékkel, ahogy az alábbi PHP‑példában látható:

use aspose\slides\Presentation;
use aspose\slides\XamlOptions;

$presentation = new Presentation("pres.pptx");
try {
    $options = new XamlOptions();
    $options->setExportHiddenSlides(true);
    $presentation->save($options);
} finally {
    $presentation->dispose();
}

Az összes generált XAML‑artefaktus rögzítése

Egy XAML‑exportum minden exportált dia számára egy XAML‑dokumentumot, valamint külön képeket és támogató erőforrásokat hozhat létre. Rendeljen egyedi IXamlOutputSaver objektumot a XamlOptions::setOutputSaver metódushoz, hogy ezeket az artefaktusokat kapja meg a fájlrendszer‑alapértelmezett mentő helyett. Indítsa el az exportálást a XAML‑specifikus Presentation::save túlterheléssel, amely XAML‑beállításokat fogad.

A PHP Java Bridge java_closure függvénye egy PHP‑objektumot tesz elérhetővé Java interfészként. Tartsa fenn mind a PHP‑mentőt, mind annak proxy‑ját, amíg az export be nem fejeződik. Az interfész‑linkek a proxy által megvalósított Java API‑ra mutatnak.

A visszahívási életciklus megértése

Az exportáló külön-külön meghívja a IXamlOutputSaver::save metódust minden létrehozott artefaktusra:

  • path azonosítja az artefaktust, és tartalmazhat relatív könyvtárakat. Őrizze meg ezt az információt, mivel a XAML gyakran hivatkozik erőforrásokra relatív útvonalakkal.
  • data az artefaktus bájtjait tartalmazza. A képeket és egyéb bináris erőforrásokat ne dekódolja szövegként.
  • A mentőnek felelőssége, hogy megőrizze vagy perzisztálja az adatokat a visszatérés előtt. A példák minden Java bájt‑tömböt PHP bináris stringgé alakítanak, amelyet az alkalmazás birtokol.
  • Tekintse az exportot sikeresnek csak akkor, amikor a prezentáció mentési művelete visszatér, és minden visszahívás sikeresen befejeződött. Ne nyelje le a tárolási hibákat, és ne indítson megfigyelés nélküli háttér‑írásokat. Ha a perzisztálás később történik, a teljes sikerességet csak akkor jelentse, ha az a lépés is sikeres.

XamlOptions::setExportHiddenSlides egy egyéni mentőre is érvényes. Az alapértelmezett beállítás, false, kizárja a rejtett diák XAML‑dokumentumait. true megadása belefoglalja őket és minden exportáláshoz szükséges erőforrást. Az erőforrások száma a prezentációtól függ; ne feltételezze, hogy minden diának egy visszahívása van vagy hogy a visszahívások sorrendje rögzített.

Exportálás memóriába és az artefaktusok vizsgálata

Ez a teljes példakód betölti a pres.pptx‑t, minden artefaktust egy PHP asszociatív tömbben tárol bináris stringként, majd kiírja nevét, típusát és bájt‑számát. Az eredeti neveket pontosan megőrzi. Azonos nevek esetén a gyűjtemény érvénytelennek minősül, ahelyett, hogy csendben felülírná az artefaktust. A példa ezt ellenőrzi, mielőtt felhasználná az eredményeket.

use aspose\slides\Presentation;
use aspose\slides\XamlOptions;

class MemoryXamlSaver {
    public $artifacts = [];
    public $valid = true;

    public function save($path, $data) {
        $name = (string) java_values($path);
        if (array_key_exists($name, $this->artifacts)) {
            $this->valid = false;
            echo "Export rejected: duplicate artifact name: " . $name . PHP_EOL;
            return;
        }
        $bytes = java_values($data);
        if (is_string($bytes)) {
            $binary = $bytes;
        } else {
            $binary = "";
            foreach ($bytes as $byte) {
                $binary .= chr($byte & 0xff);
            }
        }
        $this->artifacts[$name] = $binary;
    }
}

$saver = new MemoryXamlSaver();
$proxy = java_closure($saver, null, java("com.aspose.slides.IXamlOutputSaver"));
$presentation = new Presentation("pres.pptx");
try {
    $options = new XamlOptions();
    $options->setOutputSaver($proxy);
    $options->setExportHiddenSlides(true);
    $presentation->save($options);
} finally {
    $presentation->dispose();
}

if (!$saver->valid) {
    echo "Export rejected: the artifact collection is invalid." . PHP_EOL;
    return;
}

$inspectXamlText = false;
foreach ($saver->artifacts as $name => $bytes) {
    $extension = strtolower(pathinfo($name, PATHINFO_EXTENSION));
    $isXaml = $extension === "xaml";
    $isImage = in_array($extension, ["png", "jpg", "jpeg", "gif", "bmp", "tif", "tiff", "svg"], true);
    $kind = $isXaml ? "slide XAML" : ($isImage ? "image" : "supporting resource");
    echo $name . ": " . strlen($bytes) . " bytes (" . $kind . ")" . PHP_EOL;

    // Csak a XAML-t kezeljük UTF-8 szövegként opcionális vizsgálathoz.
    if ($isXaml && $inspectXamlText) {
        echo $bytes . PHP_EOL;
    }
}

A kiterjesztés‑ellenőrzések hasznosak a vizsgálathoz; őrizze meg az összes artefaktust, beleértve az ismeretlen erőforrás‑típusokat is. A bájt‑adatokat változatlanul hagyja tárolás vagy továbbítás során. A PHP stringek képesek bináris adatot tárolni, beleértve a null‑bájtokat is. A stringet csak akkor kezelje UTF‑8 szövegként, amikor XAML‑t vizsgál, ne transzkódolja a kép‑ vagy erőforrás‑bájtokat.

Gyűjtött artefaktusok csomagolása ZIP archívumba

Ez az önálló példa összegyűjti az exportot, érvényesíti a neveket, és az eredeti bájtokat ZIP archívumba írja. Egy kizárólag létrehozott munkakönyvtár választja el a párhuzamos export‑feladatokat. A példa a PHP Phar‑kiterjesztést igényli ZIP‑támogatással. A ZIP‑bejegyzések előre‑perjelek és megtartják a relatív könyvtárakat. Nem biztonságos nevek vagy a normalizálás után ütköző nevek esetén az egész csomag elutasításra kerül, mielőtt írásra kerülne.

use aspose\slides\Presentation;
use aspose\slides\XamlOptions;

class MemoryXamlSaver {
    public $artifacts = [];
    public $valid = true;

    public function save($path, $data) {
        $name = (string) java_values($path);
        if (array_key_exists($name, $this->artifacts)) {
            $this->valid = false;
            echo "Export rejected: duplicate artifact name: " . $name . PHP_EOL;
            return;
        }
        $bytes = java_values($data);
        if (is_string($bytes)) {
            $binary = $bytes;
        } else {
            $binary = "";
            foreach ($bytes as $byte) {
                $binary .= chr($byte & 0xff);
            }
        }
        $this->artifacts[$name] = $binary;
    }
}

$saver = new MemoryXamlSaver();
$proxy = java_closure($saver, null, java("com.aspose.slides.IXamlOutputSaver"));
$presentation = new Presentation("pres.pptx");
try {
    $options = new XamlOptions();
    $options->setOutputSaver($proxy);
    $options->setExportHiddenSlides(false);
    $presentation->save($options);
} finally {
    $presentation->dispose();
}

if (!$saver->valid) {
    echo "Export rejected: the artifact collection is invalid." . PHP_EOL;
    return;
}

$entries = [];
$entryNames = [];
foreach ($saver->artifacts as $name => $bytes) {
    $entryName = str_replace("\\", "/", $name);
    $unsafeName = substr($entryName, 0, 1) === "/" || strpos($entryName, ":") !== false;
    foreach (explode("/", $entryName) as $segment) {
        $unsafeName = $unsafeName || trim($segment) === "" || $segment === "." || $segment === "..";
    }
    $key = strtolower($entryName);
    if ($unsafeName || isset($entryNames[$key])) {
        echo "Export rejected: unsafe or duplicate artifact name: " . $name . PHP_EOL;
        return;
    }
    $entryNames[$key] = true;
    $entries[$entryName] = $bytes;
}

$jobDirectory = "xaml-" . bin2hex(random_bytes(16));
if (!mkdir($jobDirectory, 0700)) {
    echo "Cannot create the export directory." . PHP_EOL;
    return;
}
$archivePath = $jobDirectory . "/export.zip";
try {
    $archive = new PharData($archivePath, 0, null, Phar::ZIP);
    foreach ($entries as $name => $bytes) {
        $archive->addFromString($name, $bytes);
    }
    unset($archive);
    echo "Saved " . count($entries) . " artifacts to " . $archivePath . PHP_EOL;
} catch (Throwable $exception) {
    unset($archive);
    echo "Archive persistence failed: " . $exception->getMessage() . PHP_EOL;
}

A példa a PharData‑t használja egy helyi ZIP archívum írására a PHP folyamat munkakönyvtárában; az exportáló maga nem ír laza XAML‑ vagy képfájlokat. Távoli tároláshoz cserélje ki az archiválási lépést a gyűjtött bináris stringek feltöltésére. Használjon export‑feladat‑azonosítót és a relatív artefaktus‑nevet blob‑kulcsként, vagy tárolja a feladat‑azonosítót, a relatív nevet és a bináris adatot egy adatbázis‑sorban. A feladatot csak akkor publikálja, amikor minden feltöltés befejeződött vagy a tranzakció elköteleződött. Ha a perzisztálás hibázik, tisztítsa meg a részleges kimenetet.

Nagy prezentációk esetén egy egyéni mentő közvetlenül az alkalmazás‑tárolóba mentheti az egyes artefaktusokat, ezáltal elkerülve a teljes export memóriában tartását. Tartsa a visszahívásokat szinkronban az exportáló szemszögéből: csak akkor térjen vissza, amikor a cél elfogadta a bájtokat, és engedje, hogy a hibák eljussanak a hívóhoz.

Erőforrásnevek megőrzése és hivatkozások ellenőrzése

  • Normalizálja az útválasztó karaktereket, ha a célkönyvtár megköveteli, de őrizze meg a relatív könyvtárakat. Ne használja kizárólag a basename‑t, hacsak minden generált név egyedi és az erőforrás‑hivatkozások érvényesek.
  • Alkalmazzon cél‑specifikus név‑validációt. Laza fájlok írásakor utasítsa el a gyökér‑útvonalakat és a traversz szegmenseket, oldja fel a célt abszolút úttá, és ellenőrizze, hogy az a tervezett export‑könyvtár alatt marad‑e, beleértve a könyvtár‑elválasztót a tartalmazási ellenőrzésben. Használjon olyan alkalmazás‑vezérelt könyvtárat, amelynek nincsenek szimbolikus linkjei, amelyek átirányíthatják az írásokat.
  • Használjon külön mentőt és tárolási névtér‑környezetet minden export‑feladathoz. Ütközéseket csak a szeparátor normalizálása után és a cél esetleges kis‑/nagybetű‑érzékenységének szabályai szerint detektáljon.
  • Közzététel előtt minden XAML‑dokumentumot XML‑ként parse‑olja, és ellenőrizze annak fájl‑alapú erőforrás‑hivatkozásait, például a kép Source vagy ImageSource attribútumait. Oldja fel minden relatív URI‑t a tartalmazó XAML‑artefaktus könyvtárához képest, normalizálja a kapott tárolási nevet, és ellenőrizze, hogy a megfelelő térkép‑kulcs, ZIP‑bejegyzés vagy tárolt objektum létezik. Kezelje külön a külső URI‑kat és a XAML‑jelölő kifejezéseket a relatív fájlnevektől.

Például, ha a pres/Slide_1.xaml a images/image1.png‑re hivatkozik, a tárolt erőforrásnak pres/images/image1.png‑ként kell léteznie. Ha csak image1.png van megőrizve, a kapcsolat megszakad. Objektumtárolás esetén őrizze meg ugyanazt a struktúrát a feladat‑prefix alatt, és tegye elérhetővé ezeket az erőforrás‑URL‑eket a XAML‑fogyasztó számára. Nyissa meg a kész ZIP‑et, ellenőrizze a bejegyzés‑neveket és az erőforrás‑bájtokat, majd töltsön be reprezentatív diákat a cél‑XAML‑környezetben, hogy megbizonyosodjon a képek helyes feloldásáról.

GYIK

Hogyan biztosíthatom a kiszámítható betűtípusokat, ha az eredeti betűtípus nem elérhető a gépen?

Hívja meg a setDefaultRegularFont metódust a XamlOptions objektumban – ez lesz a tartalék betűtípus az exportálás során, ha az eredeti hiányzik. Ez nem garantálja, hogy a generált XAML a tartalék betűtípust használja vagy hogy a betűtípus elérhető a célgépen. Biztosítsa, hogy a XAML által hivatkozott betűtípusok a megjelenítő környezetben jelen legyenek.

A exportált XAML csak WPF‑hez szánt, vagy használható más XAML‑veremekben is?

Az Aspose.Slides a WPF XAML‑t exportálja a nyilvános API‑ján keresztül. Más XAML‑veremekkel, például az UWP‑vel vagy a Xamarin.Forms‑szal való kompatibilitás nem garantált. Tesztelje a generált jelölőt a célkörnyezetben.

Támogatottak a rejtett diák, és hogyan akadályozhatom meg, hogy alapértelmezés szerint exportálásra kerüljenek?

Alapértelmezés szerint a rejtett diák nincsenek belefoglalva. Ezt a viselkedést a setExportHiddenSlides metódus segítségével szabályozhatja a XamlOptions objektumban – tartsa letiltva, ha nem kívánja őket exportálni.