Betűkészletek beágyazása prezentációkba PHP használatával

Bevezetés

A betűkészletek beágyazása a betűtípus‑adatokat a PowerPoint‑prezentációba tárolja. Ha a megjelenítő támogatja a beágyazott betűkészleteket, akkor a szöveget a betűkészletekkel jelenítheti meg, még ha azok nincsenek is telepítve a célrendszeren. Ez segít megőrizni a sortöréseket, a szövegközöket és a diaelrendezést.

Az Aspose.Slides for PHP via Java lehetővé teszi beágyazott betűkészletek lekérdezését, hozzáadását és eltávolítását a FontsManager osztályon keresztül, amely a Presentation::getFontsManager visszaadja. A beágyazott betűtípus‑adat méretét is csökkentheted a prezentáció által nem használt karakterek eltávolításával.

Az alábbi példák PPTX fájlokkal működnek. Betűkészlet beágyazása előtt győződj meg arról, hogy a betűtípus‑adatok elérhetők az Aspose.Slides számára, és a licenc engedélyezi a beágyazást.

Beágyazott betűkészletek lekérése és eltávolítása

Használd a FontsManager::getEmbeddedFonts metódust a prezentációban tárolt betűkészletek listázásához. Egy betűkészlet eltávolításához add át a listából a betűt a FontsManager::removeEmbeddedFont metódusnak, majd mentsd el a prezentációt.

Az alábbi példa listázza a EmbeddedFonts.pptx fájl beágyazott betűkészleteit, és eltávolítja a Calibrít, ha megtalálható:

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

$presentation = new Presentation("EmbeddedFonts.pptx");
try {
    $fontsManager = $presentation->getFontsManager();
    $embeddedFonts = $fontsManager->getEmbeddedFonts();

    foreach ($embeddedFonts as $font) {
        echo java_values($font->getFontName()) . PHP_EOL;
    }

    $fontToRemove = null;
    foreach ($embeddedFonts as $font) {
        $fontName = java_values($font->getFontName());
        if (strcasecmp($fontName, "Calibri") === 0) {
            $fontToRemove = $font;
            break;
        }
    }

    if ($fontToRemove !== null) {
        $fontsManager->removeEmbeddedFont($fontToRemove);
        $presentation->save("WithoutEmbeddedCalibri.pptx", SaveFormat::Pptx);
    } else {
        echo "Calibri is not embedded. No output file was created." . PHP_EOL;
    }
} finally {
    $presentation->dispose();
}

Egy beágyazott betűkészlet eltávolítása a tárolt betűtípus‑adatot törli; a szöveghez rendelt betűt nem változtatja meg. Ha a betűt a célrendszeren telepítve van, a szöveg továbbra is használhatja azt. Egyébként a rendereléshez szükség lehet font substitution-ra, ami befolyásolhatja az elrendezést.

Betűtípus‑adatok és beágyazási engedélyek ellenőrzése

Használd a FontsManager osztályt a betűkészletek beágyazása előtti vizsgálatához. Hívd a FontsManager::getFonts metódust a prezentációban használt betűkészletek lekéréséhez. Minden egyes betűkészlethez add át egy FontData objektumot és a szükséges FontStyleType értéket a FontsManager::getFontBytes metódusnak. A metódus a betűtípus‑stílus bináris adatait adja vissza, vagy null‑t, ha a kért betűt vagy stílust nem találja. Ne add át a null eredményt a FontsManager::getFontEmbeddingLevel metódusnak, mert az byte‑tömböt vár.

EmbeddingLevel egy jelzőenumeráció, amely a betűtípusban tárolt beágyazási korlátozásokat jelzi:

  • Installable engedélyezi a beágyazást és a tartós telepítést egy másik rendszeren, a betűtípus licencétől függően.
  • Restricted tilos a beágyazás, hacsak a betűtípus jogtulajdonosától nem kapunk engedélyt, ha ez az egyetlen használati engedély jelző.
  • PreviewPrint engedélyezi az ideiglenes használatot megtekintéshez és nyomtatáshoz; a betűkészletet tartalmazó dokumentumnak csak olvashatónak kell lennie.
  • Editable engedélyezi az ideiglenes használatot, és lehetővé teszi a dokumentum szerkesztését és mentését.
  • NoSubsetting egy további korlátozás, amely megtiltja a csak egy részhalmaz beágyazását. Ha ez a jelző jelen van, az összes karaktert be kell ágyazni.
  • BitmapOnly egy további korlátozás, amely csak bitmap változatok beágyazását engedélyezi, nem az outline adatokat. Ha a betűtípusnak nincs bitmap változata, nem lehet beágyazni.

Az első négy érték a használati engedélyt írja le, míg a NoSubsetting és a BitmapOnly kombinálható velük. Ellenőrizd a módosítókat bitwise műveletekkel. Mivel az Installable értéke null, maszkoljuk a használati engedély biteket, és hasonlítsuk össze az eredményt az Installable‑nel, ahelyett, hogy flagként ellenőriznénk. A jelenlegi betűtípusoknak legfeljebb egy használati engedély bitet kell beállítaniuk. Régebbi betűtípusok, amelyek egynél több bitet állítanak be, kompatibilitás céljából a lenti segéd a legkevésbé korlátozó engedélyt választja: Editable, majd PreviewPrint, majd Restricted.

Az alábbi példa ellenőrzi a normál, félkövér, dőlt és félkövér‑dőlt adatokat minden, a FontsManager::getFonts által visszaadott betűkészlethez. Kihagyja a nem elérhető stílusokat, a korlátozott, bitmap‑only betűkészleteket, a csak megtekintésre és nyomtatásra korlátozottakat, mivel a kimenet szerkeszthető marad, valamint a már beágyazott betűkészleteket. Ha bármely elérhető stílus NoSubsetting‑et tartalmaz, az összes karaktert beágyazza az adott betűcsaládhoz.

use aspose\slides\EmbedFontCharacters;
use aspose\slides\EmbeddingLevel;
use aspose\slides\FontStyleType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

function getUsagePermission($level) {
    $permissionMask = EmbeddingLevel::Restricted | EmbeddingLevel::PreviewPrint | EmbeddingLevel::Editable;
    $permissions = $level & $permissionMask;

    if (($permissions & EmbeddingLevel::Editable) !== 0) {
        return EmbeddingLevel::Editable;
    }

    if (($permissions & EmbeddingLevel::PreviewPrint) !== 0) {
        return EmbeddingLevel::PreviewPrint;
    }

    if (($permissions & EmbeddingLevel::Restricted) !== 0) {
        return EmbeddingLevel::Restricted;
    }

    return EmbeddingLevel::Installable;
}

$presentation = new Presentation("Fonts.pptx");
try {
    $fontsManager = $presentation->getFontsManager();
    $fontStyles = [
        FontStyleType::Regular,
        FontStyleType::Bold,
        FontStyleType::Italic,
        FontStyleType::Bold | FontStyleType::Italic
    ];

    $embeddedFontNames = [];
    foreach ($fontsManager->getEmbeddedFonts() as $embeddedFont) {
        $fontName = java_values($embeddedFont->getFontName());
        $embeddedFontNames[strtolower($fontName)] = true;
    }

    $fontsToEmbed = [];
    $embeddingRules = [];
    foreach ($fontsManager->getFonts() as $font) {
        $fontName = java_values($font->getFontName());
        if (isset($embeddedFontNames[strtolower($fontName)])) {
            echo $fontName . ": already embedded." . PHP_EOL;
            continue;
        }

        $hasAvailableData = false;
        $allAvailableStylesCanBeEmbedded = true;
        $previewPrintOnly = false;
        $requiresFullFont = false;

        foreach ($fontStyles as $fontStyle) {
            $fontBytes = $fontsManager->getFontBytes($font, $fontStyle);
            if (java_is_null($fontBytes)) {
                echo $fontName . " (" . $fontStyle . "): font data is unavailable." . PHP_EOL;
                continue;
            }

            $hasAvailableData = true;
            $embeddingLevel = java_values($fontsManager->getFontEmbeddingLevel($fontBytes, $fontName));
            $usagePermission = getUsagePermission($embeddingLevel);
            $noSubsetting = ($embeddingLevel & EmbeddingLevel::NoSubsetting) !== 0;
            $bitmapOnly = ($embeddingLevel & EmbeddingLevel::BitmapOnly) !== 0;

            $requiresFullFont = $requiresFullFont || $noSubsetting;
            $previewPrintOnly = $previewPrintOnly || $usagePermission === EmbeddingLevel::PreviewPrint;
            $allAvailableStylesCanBeEmbedded = $allAvailableStylesCanBeEmbedded && $usagePermission !== EmbeddingLevel::Restricted && !$bitmapOnly;

            echo $fontName . " (" . $fontStyle . "): " . $embeddingLevel . "." . PHP_EOL;
        }

        if (!$hasAvailableData) {
            echo $fontName . ": skipped because no requested style is available." . PHP_EOL;
        } elseif (!$allAvailableStylesCanBeEmbedded) {
            echo $fontName . ": skipped because at least one available style does not permit outline embedding." . PHP_EOL;
        } elseif ($previewPrintOnly) {
            echo $fontName . ": skipped because this example produces an editable presentation." . PHP_EOL;
        } else {
            $rule = $requiresFullFont ? EmbedFontCharacters::All : EmbedFontCharacters::OnlyUsed;
            $fontsToEmbed[] = $font;
            $embeddingRules[] = $rule;
        }
    }

    for ($i = 0; $i < count($fontsToEmbed); $i++) {
        $fontsManager->addEmbeddedFont($fontsToEmbed[$i], $embeddingRules[$i]);
    }

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

Ez az ellenőrzés jelentést készít minden betűfájlban kódolt korlátozásról. Nem ad licencet, nem bizonyítja, hogy a betűt legális módon szerezted be, és nem helyettesíti a betűtípus licencszerződésének ellenőrzését a beágyazott másolat terjesztése előtt.

Beágyazott betűkészletek hozzáadása

Használd a FontsManager::addEmbeddedFont metódust betűkészlet beágyazásához. A túlterhelések elfogadnak egy FontData objektumot vagy egy byte‑tömböt, amely a betűtípus‑adatokat tartalmazza. Az EmbedFontCharacters enumeráció szabályozza, hogy mely karakterek legyenek belefoglalva:

  • All beágyazza a betűkészlet összes karakterét. Ezt a lehetőséget akkor használd, ha a címzetteknek szerkeszteniük kell a prezentációt és új szöveget beírni.
  • OnlyUsed csak a prezentációban használt karaktereket ágyazza be a fájlméret csökkentése érdekében. Ezt a lehetőséget választod egy kész prezentációhoz, amely elsősorban megtekintésre szolgál.

Az alábbi példa a FontsManager::getFonts segítségével lekéri a Fonts.pptx fájlban használt betűkészleteket, és beágyazza azokat, amelyek még nincsenek beágyazva. A hozzáadandó betűkészleteknek elérhetőnek kell lenniük azon a gépen, amelyen a kód fut. A már létező beágyazott betűkészletek megtartják a jelenlegi karakterkészletüket.

use aspose\slides\EmbedFontCharacters;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$presentation = new Presentation("Fonts.pptx");
try {
    $fontsManager = $presentation->getFontsManager();
    $allFonts = $fontsManager->getFonts();
    $embeddedFonts = $fontsManager->getEmbeddedFonts();
    $embeddedFontNames = [];

    foreach ($embeddedFonts as $embeddedFont) {
        $fontName = java_values($embeddedFont->getFontName());
        $embeddedFontNames[strtolower($fontName)] = true;
    }

    foreach ($allFonts as $font) {
        $fontName = java_values($font->getFontName());
        $normalizedFontName = strtolower($fontName);
        if (!isset($embeddedFontNames[$normalizedFontName])) {
            $fontsManager->addEmbeddedFont($font, EmbedFontCharacters::All);
            $embeddedFontNames[$normalizedFontName] = true;
        }
    }

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

Beágyazott betűkészletek tömörítése

A Compress::compressEmbeddedFonts a beágyazott betűtípus‑adatot a nem használt karakterek eltávolításával csökkenti. Már beágyazott betűkészleteken működik, így a méretcsökkenés a prezentációban található fel nem használt betűtípus‑adat mennyiségétől függ.

Az alábbi példa tömöríti az EmbeddedFonts.pptx fájl betűkészleteit, és az eredményt külön fájlként menti:

use aspose\slides\Compress;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$presentation = new Presentation("EmbeddedFonts.pptx");
try {
    Compress::compressEmbeddedFonts($presentation);
    $presentation->save("CompressedEmbeddedFonts.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Tartsd meg az eredeti fájlt, ha a címzettek később szöveget szeretnének hozzáadni. A tömörítés során eltávolított karakterek már nem állnak rendelkezésre a beágyazott betűtípusból, még akkor sem, ha eredetileg az összes karaktert beágyaztad.

GYIK

Hogyan ellenőrizhetem, hogy egy beágyazott betűkészlet a renderelés során még mindig helyettesítésre kerül-e?

Hívd a FontsManager::getSubstitutions metódust abban a környezetben, ahol a prezentációt rendereled, hogy megtudd, mely betűkészleteket cseréli ki az Aspose.Slides. Ellenőrizd továbbá a font substitution beállításokat és a font fallback szabályokat. A fallback a hiányzó karaktereket kezeli, így egy betűkészlet beágyazása nem oldja meg azokat a karaktereket, amelyek a betűkészletben nincsenek.

Érdemes általános betűkészleteket, például Arial‑t vagy Calibri‑t beágyazni?

A döntést a célkörnyezet alapján hozd meg. Ha a szükséges betűkészletek minden olyan gépen rendelkezésre állnak, amely megnyitja vagy rendereli a prezentációt, a beágyazás felesleges fájlméret-növekedést okozhat. Ha a címzettek vagy a szerverek esetleg nem rendelkeznek ezekkel a betűkkel, a beágyazás segíthet megőrizni a kívánt megjelenést, feltéve hogy a licencük engedélyezi azt.