Betűtípusok beágyazása prezentációkba Java-ban
Bevezetés
A betűtípusok beágyazása a betűtípus‑adatokat a PowerPoint‑prezentációba menti. Ha egy megjelenítő támogatja a beágyazott betűtípusokat, képes a szöveget ezekkel a betűtípusokkal megjeleníteni akkor is, ha nincsenek telepítve a célrendszeren. Ez segít megőrizni a sortöréseket, a szövegtávolságot és a diaelrendezést.
Az Aspose.Slides for Java lehetővé teszi a beágyazott betűtípusok lekérdezését, hozzáadását és eltávolítását az IFontsManager felületen keresztül, amelyet a Presentation.getFontsManager ad vissza. A beágyazott betűtípus‑adat méretét is csökkentheti 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. A betűtípus beágyazása előtt győződjön meg arról, hogy a betűtípus adat elérhető az Aspose.Slides számára, és a licenc engedélyezi a beágyazást.
Beágyazott betűtípusok lekérése és eltávolítása
Használja a getEmbeddedFonts metódust a prezentációban tárolt betűtípusok felsorolásához. Egy betűtípus eltávolításához adja át a listából egy betűtípust a removeEmbeddedFont metódusnak, majd mentse a prezentációt.
Az alábbi példa felsorolja a beágyazott betűtípusokat a EmbeddedFonts.pptx fájlban, és eltávolítja a Calibri-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();
}
A beágyazott betűtípus eltávolítása a tárolt betűtípus‑adatot törli; nem változtatja meg a szöveghez rendelt betűtípust. Ha a betűtípus telepítve van a célrendszeren, a szöveg továbbra is használhatja azt. Egyébként a megjelenítés font substitution igényelhet, ami befolyásolhatja az elrendezést.
Betűtípus adat és beágyazási engedélyek ellenőrzése
Használja az IFontsManager felületet a betűtípusok beágyazás előtti ellenőrzéséhez. Hívja a IFontsManager.getFonts metódust a prezentációban használt betűtípusok lekérdezéséhez. Minden betűtípushoz adjon át egy IFontData objektumot és a szükséges FontStyleType értéket a IFontsManager.getFontBytes metódusnak. A metódus visszaadja a betűtípus adott stílusának bináris adatait, vagy null‑t, ha a kért betűtípus vagy stílus nem érhető el. Ne adjon át null eredményt a IFontsManager.getFontEmbeddingLevel metódusnak, mivel ez a metódus bájt tömböt igényel.
EmbeddingLevel egy zászló enumeráció, amely a betűtípusba tárolt beágyazási korlátozásokat jelzi:
Installableengedé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.Restrictedtiltja a beágyazást, hacsak nem szerez engedélyt a betűtípus jogtulajdonosától, ha ez az egyetlen használati‑engedély zászló.PreviewPrintideiglenes használatot enged a megtekintéshez és nyomtatáshoz; a betűtípust tartalmazó dokumentumnak csak olvashatónak kell lennie.Editableideiglenes használatot enged és lehetővé teszi a dokumentum szerkesztését és mentését.NoSubsettingegy további korlátozás, amely megtiltja a betűtípus csak egy részhalmazának beágyazását. Ha ez a zászló jelen van, az összes karaktert be kell ágyazni.BitmapOnlyegy további korlátozás, amely csak bitmap (raszteres) betűtípust enged beágyazni, nem az outline (váz) adatot. Ha a betűtípusnak nincsenek bitmap változatai, 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. A módosítókat bitműveletekkel ellenőrizze. Mivel az Installable értéke nulla, maszkolja a használati engedély biteket, és hasonlítsa össze az eredményt az Installable‑lel, ahelyett, hogy zászlóként ellenőrizné. A jelenlegi betűtípusoknak legfeljebb egy használati engedély bitet kell beállítaniuk. Az idősebb, több bitet beállító betűtípusok kompatibilitása érdekében az alábbi segédprogram a legkevésbé korlátozó engedélyt választja: Editable, majd PreviewPrint, végül Restricted.
Az alábbi példa ellenőrzi a getFonts által visszaadott minden betűtípushoz elérhető normál, félkövér, dőlt és félkövér‑dőlt adatokat. Kihagyja a nem elérhető stílusokat, a korlátozott betűtípusokat, a csak bitmap betűtípusokat, a csak előnézetre és nyomtatásra korlátozott betűtípusokat, mivel a kimenet szerkeszthető marad, valamint a már beágyazott betűtípusokat. Ha bármely elérhető stílus rendelkezik NoSubsetting‑tel, beágyazza az összes karaktert az adott betűtípuscsalá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ései a betűtípusfájlokban kódolt korlátozásokat. Nem ad licencet, nem bizonyítja, hogy a betűtípust legálisan szerezte 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űtípusok hozzáadása
Használja a addEmbeddedFont metódust egy betűtípus beágyazásához. A túlterhelései elfogadnak egy IFontData objektumot vagy a betűtípus adatot tartalmazó bájt tömböt. Az EmbedFontCharacters enumeráció szabályozza, hogy mely karakterek legyenek belefoglalva:
- All beágyazza a betűtípus összes karakterét. Ezt a lehetőséget használja, ha a címzetteknek szerkeszteniük kell a prezentációt és új szöveget kell beírniuk.
- OnlyUsed csak a prezentációban használt karaktereket ágyazza be a fájlméret csökkentése érdekében. Válassza ezt a lehetőséget egy kész prezentációhoz, amely elsősorban megtekintésre szolgál.
Az alábbi példa a getFonts metódust használja a Fonts.pptx fájlban használt betűtípusok lekérdezéséhez, és beágyazza azokat, amelyek még nincsenek beágyazva. A hozzáadandó betűtípusoknak elérhetőnek kell lenniük a kódot futtató gépen. A már létező beágyazott betűtípusok megőrzik aktuális 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űtípusok tömörítése
A Compress.compressEmbeddedFonts a beágyazott betűtípus‑adatot csökkenti a nem használt karakterek eltávolításával. Már beágyazott betűtípusokon működik, így a méretcsökkentés attól függ, mennyi fel nem használt betűtípus‑adatot tartalmaz a prezentáció.
Az alábbi példa tömöríti a EmbeddedFonts.pptx fájl betűtípusait, és az eredményt külön fájlként 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ímzettek később szöveget kell hozzáadniuk. 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ágyazta.
GYIK
Hogyan ellenőrizhetem, hogy egy beágyazott betűtípus továbbra is helyettesítésre kerül-e a megjelenítés során?
Hívja meg a getSubstitutions metódust abban a környezetben, ahol a prezentációt megjeleníti, hogy lássa, mely betűtípusokat cseréli le az Aspose.Slides. Ellenőrizze a font substitution beállításokat és a font fallback szabályokat is. A fallback kezeli a hiányzó karaktereket, így a betűtípus beágyazása nem oldja meg azokat a karaktereket, amelyeket a betűtípus önmagában nem tartalmaz.
Be kellene-e ágyazni általános betűtípusokat, például az Arial‑t és a Calibri‑t?
A döntést a célkörnyezet alapján hozza meg. Ha a szükséges betűtípusok minden gépen elérhetők, amely megnyitja vagy megjeleníti a prezentációt, a beágyazás felesleges fájlméret növekedést eredményezhet. Ha a címzettek vagy a szerverek esetleg nem rendelkeznek ezekkel a betűtípusokkal, a beágyazás segíthet megőrizni a kívánt megjelenést, amennyiben a licencük ezt engedélyezi.