Betűkészletek beágyazása prezentációkba Androidon

Bevezetés

A betűkészletek beágyazása betűkészlet‑adatokat tárol a PowerPoint‑prezentációban. Ha a megjelenítő támogatja a beágyazott betűkészleteket, meg tudja jeleníteni a szöveget a betűkkel még akkor is, ha azok nincsenek telepítve a célrendszeren. Ez segít megőrizni a sortöréseket, a szöveg távolságait és a dia elrendezését.

Az Aspose.Slides for Android via Java lehetővé teszi a beágyazott betűkészletek lekérését, hozzáadását és eltávolítását az IFontsManager felületen keresztül, amelyet a Presentation.getFontsManager ad vissza. Emellett csökkentheti a beágyazott betűkészlet‑adat méretét az olyan karakterek eltávolításával, amelyeket a prezentáció nem használ.

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

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

Használja a 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 adja át a listából a betűkészletet a removeEmbeddedFont metódusnak, majd mentse a prezentációt.

Az alábbi példa listázza a beágyazott betűkészleteket a EmbeddedFonts.pptx fájlban, és eltávolítja a Calibrít, ha jelen van:

import com.aspose.slides.IFontData;
import com.aspose.slides.IFontsManager;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;

Presentation presentation = new Presentation("EmbeddedFonts.pptx");
try {
    IFontsManager fontsManager = presentation.getFontsManager();
    IFontData[] embeddedFonts = fontsManager.getEmbeddedFonts();

    for (IFontData font : embeddedFonts) {
        System.out.println(font.getFontName());
    }

    IFontData fontToRemove = null;
    for (IFontData font : embeddedFonts) {
        if ("Calibri".equalsIgnoreCase(font.getFontName())) {
            fontToRemove = font;
            break;
        }
    }

    if (fontToRemove != null) {
        fontsManager.removeEmbeddedFont(fontToRemove);
        presentation.save("WithoutEmbeddedCalibri.pptx", SaveFormat.Pptx);
    } else {
        System.out.println("Calibri is not embedded. No output file was created.");
    }
} finally {
    presentation.dispose();
}

Egy beágyazott betűkészlet eltávolítása törli a tárolt betűkészlet‑adatokat; nem módosítja a szöveghez rendelt betűtípust. Ha a betűkészlet telepítve van a célrendszeren, a szöveg továbbra is használhatja. Ellenkező esetben a rendereléshez betűtípus helyettesítés lehet szükséges, ami befolyásolhatja az elrendezést.

Betűkészlet‑adatok és beágyazási engedélyek ellenőrzése

Használja az IFontsManager felületet a betűkészletek beágyazás előtti ellenőrzéséhez. Hívja meg a IFontsManager.getFonts metódust a prezentációban használt betűkészletek lekéréséhez. Minden egyes betűkészlethez adjon át egy IFontData objektumot és a szükséges FontStyleType értéket a IFontsManager.getFontBytes metódusnak. A metódus visszaadja a betűkészlet stílusának bináris adatait, vagy null‑t, ha a kért betűkészlet vagy stílus nem érhető el. Ne adjon át null eredményt a IFontsManager.getFontEmbeddingLevel metódusnak, mivel ez a metódus byte‑tömböt igényel.

EmbeddingLevel egy zászló‑enumeráció, amely a betűkészletben 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űkészlet licencétől függően.
  • `Restricted` tiltja a beágyazást, kivéve ha a betűkészlet jogtulajdonosától engedélyt kapunk, amikor ez az egyetlen használati‑engedély zászló.
  • `PreviewPrint` engedélyezi az ideiglenes használatot megtekintéshez és nyomtatáshoz; a betűkészletet tartalmazó dokumentum csak olvasásra van korlátozva.
  • `Editable` engedélyezi az ideiglenes használatot, és lehetővé teszi a dokumentum szerkesztését és mentését.
  • `NoSubsetting` további korlátozás, amely megtiltja a csak a glifek részhalmazának beágyazását. Ha ez a zászló jelen van, minden karaktert be kell ágyazni.
  • `BitmapOnly` további korlátozás, amely csak bitmap‑változatok beágyazását engedélyezi, nem az outline adatot. Ha a betűkészletnek nincs bitmap változata, nem ágyazható be.

Az első négy érték a használati engedélyt írja le, míg a `NoSubsetting` és `BitmapOnly` ezekhez kombinálható. Ellenőrizze a módosítókat bitműveletekkel. Mivel a `Installable` nulla, maszkolja a használati‑engedély biteket, és hasonlítsa össze az eredményt a `Installable` értékével ahelyett, hogy zászlóként ellenőrizné. A jelenlegi betűkészleteknek legfeljebb egy használati‑engedély bitet kell beállítaniuk. A régebbi, több bitet beállító betűkészletekkel való kompatibilitás érdekében az alábbi segédfüggvény a legkevésbé korlátozó engedélyt választja: `Editable`, majd `PreviewPrint`, majd `Restricted`.

Az alábbi példa auditálja a normál, félkövér, dőlt és félkövér‑dőlt adatokat minden betűkészlethez, amelyet a getFonts visszaad. Kihagyja a nem elérhető stílusokat, a korlátozott betűkészleteket, a csak bitmap‑betűkészleteket, a megtekintésre és nyomtatásra korlátozott betűkészleteket, mivel a kimenet szerkeszthető marad, valamint a már beágyazott betűkészleteket. Ha bármely elérhető stílus rendelkezik `NoSubsetting` értékkel, minden karaktert beágyaz a betűkészlet családhoz.

import com.aspose.slides.EmbedFontCharacters;
import com.aspose.slides.EmbeddingLevel;
import com.aspose.slides.FontStyleType;
import com.aspose.slides.IFontData;
import com.aspose.slides.IFontsManager;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

class EmbeddingPermission {
    int getUsagePermission(int level) {
        int permissionMask = EmbeddingLevel.Restricted | EmbeddingLevel.PreviewPrint | EmbeddingLevel.Editable;
        int 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 presentation = new Presentation("Fonts.pptx");
try {
    IFontsManager fontsManager = presentation.getFontsManager();
    int[] fontStyles = {
        FontStyleType.Regular,
        FontStyleType.Bold,
        FontStyleType.Italic,
        FontStyleType.Bold | FontStyleType.Italic
    };

    Set<String> embeddedFontNames = new HashSet<String>();
    for (IFontData embeddedFont : fontsManager.getEmbeddedFonts()) {
        embeddedFontNames.add(embeddedFont.getFontName().toLowerCase(Locale.ROOT));
    }

    EmbeddingPermission permissionHelper = new EmbeddingPermission();
    List<IFontData> fontsToEmbed = new ArrayList<IFontData>();
    List<Integer> embeddingRules = new ArrayList<Integer>();
    for (IFontData font : fontsManager.getFonts()) {
        if (embeddedFontNames.contains(font.getFontName().toLowerCase(Locale.ROOT))) {
            System.out.println(font.getFontName() + ": already embedded.");
            continue;
        }

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

        for (int fontStyle : fontStyles) {
            byte[] fontBytes = fontsManager.getFontBytes(font, fontStyle);
            if (fontBytes == null) {
                System.out.println(font.getFontName() + " (" + fontStyle + "): font data is unavailable.");
                continue;
            }

            hasAvailableData = true;
            int embeddingLevel = fontsManager.getFontEmbeddingLevel(fontBytes, font.getFontName());
            int usagePermission = permissionHelper.getUsagePermission(embeddingLevel);
            boolean noSubsetting = (embeddingLevel & EmbeddingLevel.NoSubsetting) != 0;
            boolean bitmapOnly = (embeddingLevel & EmbeddingLevel.BitmapOnly) != 0;

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

            System.out.println(font.getFontName() + " (" + fontStyle + "): " + embeddingLevel + ".");
        }

        if (!hasAvailableData) {
            System.out.println(font.getFontName() + ": skipped because no requested style is available.");
        } else if (!allAvailableStylesCanBeEmbedded) {
            System.out.println(font.getFontName() + ": skipped because at least one available style does not permit outline embedding.");
        } else if (previewPrintOnly) {
            System.out.println(font.getFontName() + ": skipped because this example produces an editable presentation.");
        } else {
            int rule = requiresFullFont ? EmbedFontCharacters.All : EmbedFontCharacters.OnlyUsed;
            fontsToEmbed.add(font);
            embeddingRules.add(rule);
        }
    }

    for (int i = 0; i < fontsToEmbed.size(); i++) {
        fontsManager.addEmbeddedFont(fontsToEmbed.get(i), embeddingRules.get(i));
    }

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

Ez az ellenőrzés jelentéseket készít a betűkészlet‑fájlokban kódolt korlátozásokról. Nem ad licencet, nem bizonyítja, hogy a betűkészletet jogszerűen szerezte be, és nem helyettesíti a betűkészlet 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álja a addEmbeddedFont metódust egy betűkészlet beágyazásához. A túlterhelései elfogadnak vagy egy IFontData objektumot, vagy egy byte‑tömböt, amely a betűkészlet adatokat tartalmazza. Az EmbedFontCharacters enumeráció határozza meg, mely karakterek legyenek belefoglalva:

  • All embeds all characters in the font. Use this option when recipients need to edit the presentation and enter new text.
  • OnlyUsed embeds only the characters used in the presentation to reduce file size. Choose this option for a finished presentation that is primarily intended for viewing.

Az alábbi példa a getFonts metódust használja a Fonts.pptx fájlban használt betűkészletek lekérésére, és beágyazza azokat, amelyek még nincsenek beágyazva. A hozzáadandó betűkészleteknek elérhetőnek kell lenniük az Android‑eszközön vagy regisztrálva kell lenniük az Aspose.Slides‑ben. A már létező beágyazott betűkészletek megtartják a jelenlegi karakterkészletüket.

import com.aspose.slides.EmbedFontCharacters;
import com.aspose.slides.IFontData;
import com.aspose.slides.IFontsManager;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

Presentation presentation = new Presentation("Fonts.pptx");
try {
    IFontsManager fontsManager = presentation.getFontsManager();
    IFontData[] allFonts = fontsManager.getFonts();
    IFontData[] embeddedFonts = fontsManager.getEmbeddedFonts();
    Set<String> embeddedFontNames = new HashSet<String>();

    for (IFontData embeddedFont : embeddedFonts) {
        embeddedFontNames.add(embeddedFont.getFontName().toLowerCase(Locale.ROOT));
    }

    for (IFontData font : allFonts) {
        String fontName = font.getFontName().toLowerCase(Locale.ROOT);
        if (!embeddedFontNames.contains(fontName)) {
            fontsManager.addEmbeddedFont(font, EmbedFontCharacters.All);
            embeddedFontNames.add(fontName);
        }
    }

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

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

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

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

import com.aspose.slides.Compress;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;

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

Tartsa meg az eredeti fájlt, ha a címzetteknek később szöveget kell hozzáadniuk. A tömörítés során eltávolított karakterek már nem elérhetőek a beágyazott betűkészletből, még akkor sem, ha eredetileg az összes karaktert beágyazta.

GYIK

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

Hívja meg a getSubstitutions metódust abban a környezetben, ahol a prezentációt rendereli, hogy lássa, mely betűkészleteket cseréli le az Aspose.Slides. Ellenőrizze továbbá a betűtípus helyettesítés beállításokat és a betűkészlet helyettesítő szabályokat. A fallback kezeli a hiányzó karaktereket, így egy betűkészlet beágyazása nem oldja meg azokat a karaktereket, amelyeket a betűkészlet maga sem tartalmaz.

Érdemes-e általános betűkészleteket, például az Arial‑t és a Calibri‑t beágyazni?

A döntést a célkörnyezet alapján hozza meg. Ha a szükséges betűkészletek minden olyan eszközön elérhetők, amely megnyitja vagy rendereli a prezentációt, a beágyazás csak felesleges fájlméretet adhat hozzá. Ha a címzettek vagy szerverek esetleg nem rendelkeznek ezekkel a betűkészletekkel, a beágyazás segíthet megőrizni a kívánt megjelenést, feltéve hogy a licencek lehetővé teszik.