Vkládání písem do prezentací pomocí Pythonu
Úvod
Vkládání písem ukládá data písma uvnitř prezentace PowerPoint. Když prohlížeč podporuje vložená písma, může zobrazovat text s těmito písmy, i když nejsou nainstalována na cílovém systému. To pomáhá zachovat zalomení řádků, mezery mezi textem a rozvržení snímků.
Aspose.Slides for Python via .NET vám umožňuje získávat, přidávat a odstraňovat vložená písma prostřednictvím vlastnosti fonts_manager objektu Presentation. Můžete také snížit velikost dat vloženého písma odebráním znaků, které prezentace nepoužívá.
Níže uvedené příklady pracují se soubory PPTX. Před vložením písma se ujistěte, že jeho data jsou k dispozici pro Aspose.Slides a že jeho licence umožňuje vkládání.
Získání a odstranění vložených písem
Použijte get_embedded_fonts k vypsání písem uložených v prezentaci. Pro odebrání jednoho předáte písmo ze seznamu metodě remove_embedded_font, poté prezentaci uložíte.
Následující příklad vypíše vložená písma v souboru EmbeddedFonts.pptx a odstraní Calibri, pokud je přítomen:
import aspose.slides as slides
with slides.Presentation("EmbeddedFonts.pptx") as presentation:
fonts_manager = presentation.fonts_manager
embedded_fonts = fonts_manager.get_embedded_fonts()
for font in embedded_fonts:
print(font.font_name)
font_to_remove = next((font for font in embedded_fonts if font.font_name.casefold() == "calibri"), None)
if font_to_remove is not None:
fonts_manager.remove_embedded_font(font_to_remove)
presentation.save("WithoutEmbeddedCalibri.pptx", slides.export.SaveFormat.PPTX)
else:
print("Calibri is not embedded. No output file was created.")
Odstranění vloženého písma odstraní jeho uložená data; nemění písmo přiřazené textu. Pokud je písmo nainstalováno na cílovém systému, může text stále používat ho. V opačném případě může vykreslování vyžadovat font substitution, což může ovlivnit rozvržení.
Inspekce dat písma a oprávnění k vložení
Použijte třídu FontsManager k inspekci písem před jejich vložením. Zavolejte get_fonts pro získání písem použitých v prezentaci. Pro každé písmo předáte objekt FontData a požadovanou hodnotu FontStyleType metodě get_font_bytes. Metoda vrací binární data pro daný styl písma nebo None, pokud požadované písmo nebo styl není k dispozici. Nepředávejte výsledek None metodě get_font_embedding_level, protože tato metoda vyžaduje pole bajtů.
EmbeddingLevel je výčtová značka s příznaky, která uvádí omezení vložení uložená v písmu:
INSTALLABLEpovoluje vkládání a trvalou instalaci na jiném systému, pokud to licence písma umožňuje.RESTRICTEDzakazuje vkládání, pokud není získáno povolení od právního vlastníka písma, když je to jediný příznak oprávnění k použití.PREVIEW_PRINTpovoluje dočasné použití pro prohlížení a tisk; dokument obsahující písmo musí být jen pro čtení.EDITABLEpovoluje dočasné použití a umožňuje dokument upravovat a ukládat.NO_SUBSETTINGje další omezení, které zakazuje vkládání pouze podmnožiny glifů. Vložit všechny znaky, pokud je tento příznak přítomen.BITMAP_ONLYje další omezení, které povoluje vložit jen bitmapové řezy, ne vektorová data. Pokud písmo nemá bitmapové řezy, nemůže být vloženo.
Prvních čtyři hodnoty popisují oprávnění k použití, zatímco NO_SUBSETTING a BITMAP_ONLY lze s nimi kombinovat. Zkontrolujte modifikátory pomocí bitových operací. Protože INSTALLABLE je nula, maskujte bity oprávnění k použití a porovnejte výsledek s INSTALLABLE. Aktuální písma by měla nastavit nejvýše jeden bit oprávnění k použití. Pro kompatibilitu se staršími písmy, která nastavují více než jeden, níže uvedený pomocník vybírá nejméně restriktivní oprávnění: EDITABLE, poté PREVIEW_PRINT, poté RESTRICTED.
Následující příklad kontroluje běžná, tučná, kurzívní a tučně‑kurzívní data dostupná pro každé písmo vrácené metodou get_fonts. Přeskakuje nedostupné styly, omezená písma, pouze bitmapová písma, písma omezená na náhled a tisk, protože výstup zůstává editovatelný, a písma, která jsou již vložena. Pokud má kterýkoli dostupný styl NO_SUBSETTING, vloží všechny znaky pro tuto rodinu písma.
import aspose.slides as slides
def get_usage_permission(level):
permission_mask = slides.EmbeddingLevel.RESTRICTED | slides.EmbeddingLevel.PREVIEW_PRINT | slides.EmbeddingLevel.EDITABLE
permissions = level & permission_mask
if permissions & slides.EmbeddingLevel.EDITABLE:
return slides.EmbeddingLevel.EDITABLE
if permissions & slides.EmbeddingLevel.PREVIEW_PRINT:
return slides.EmbeddingLevel.PREVIEW_PRINT
if permissions & slides.EmbeddingLevel.RESTRICTED:
return slides.EmbeddingLevel.RESTRICTED
return slides.EmbeddingLevel.INSTALLABLE
with slides.Presentation("Fonts.pptx") as presentation:
fonts_manager = presentation.fonts_manager
font_styles = [slides.FontStyleType.REGULAR, slides.FontStyleType.BOLD, slides.FontStyleType.ITALIC, slides.FontStyleType.BOLD | slides.FontStyleType.ITALIC]
embedded_font_names = {font.font_name.casefold() for font in fonts_manager.get_embedded_fonts()}
embedding_plan = []
for font in fonts_manager.get_fonts():
if font.font_name.casefold() in embedded_font_names:
print(f"{font.font_name}: already embedded.")
continue
has_available_data = False
all_available_styles_can_be_embedded = True
preview_print_only = False
requires_full_font = False
for font_style in font_styles:
font_bytes = fonts_manager.get_font_bytes(font, font_style)
if font_bytes is None:
print(f"{font.font_name} ({font_style}): font data is unavailable.")
continue
has_available_data = True
embedding_level = fonts_manager.get_font_embedding_level(font_bytes, font.font_name)
usage_permission = get_usage_permission(embedding_level)
no_subsetting = bool(embedding_level & slides.EmbeddingLevel.NO_SUBSETTING)
bitmap_only = bool(embedding_level & slides.EmbeddingLevel.BITMAP_ONLY)
requires_full_font |= no_subsetting
preview_print_only |= usage_permission == slides.EmbeddingLevel.PREVIEW_PRINT
all_available_styles_can_be_embedded &= usage_permission != slides.EmbeddingLevel.RESTRICTED and not bitmap_only
print(f"{font.font_name} ({font_style}): {embedding_level}.")
if not has_available_data:
print(f"{font.font_name}: skipped because no requested style is available.")
elif not all_available_styles_can_be_embedded:
print(f"{font.font_name}: skipped because at least one available style does not permit outline embedding.")
elif preview_print_only:
print(f"{font.font_name}: skipped because this example produces an editable presentation.")
else:
rule = slides.export.EmbedFontCharacters.ALL if requires_full_font else slides.export.EmbedFontCharacters.ONLY_USED
embedding_plan.append((font, rule))
for font, rule in embedding_plan:
fonts_manager.add_embedded_font(font, rule)
presentation.save("WithAuditedFonts.pptx", slides.export.SaveFormat.PPTX)
Tato inspekce hlásí omezení zakódovaná v každém souboru písma. Neposkytuje licenci, neprokazuje, že jste písmo získali legálně, ani nenahrazuje kontrolu licenční smlouvy písma před distribucí vložené kopie.
Přidání vložených písem
Použijte add_embedded_font k vložení písma. Jeho přetížení přijímají buď objekt FontData nebo pole bajtů obsahující data písma. Výčtová hodnota EmbedFontCharacters určuje, které znaky jsou zahrnuty:
- ALL vloží všechny znaky ve fontu. Použijte tuto možnost, když příjemci potřebují prezentaci upravovat a zadávat nový text.
- ONLY_USED vloží pouze znaky použité v prezentaci ke snížení velikosti souboru. Vyberte tuto možnost pro dokončenou prezentaci, která je primárně určena k prohlížení.
Následující příklad používá get_fonts k získání písem použitých v souboru Fonts.pptx a vloží ty, které ještě nejsou vloženy. Písma k přidání musí být dostupná na počítači, na kterém se kód spouští. Existující vložená písma zachovají své aktuální sady znaků.
import aspose.slides as slides
with slides.Presentation("Fonts.pptx") as presentation:
fonts_manager = presentation.fonts_manager
all_fonts = fonts_manager.get_fonts()
embedded_fonts = fonts_manager.get_embedded_fonts()
embedded_names = {font.font_name.casefold() for font in embedded_fonts}
for font in all_fonts:
normalized_name = font.font_name.casefold()
if normalized_name not in embedded_names:
fonts_manager.add_embedded_font(font, slides.export.EmbedFontCharacters.ALL)
embedded_names.add(normalized_name)
presentation.save("WithEmbeddedFonts.pptx", slides.export.SaveFormat.PPTX)
Komprese vložených písem
compress_embedded_fonts snižuje data vložených písem odstraněním nepoužívaných znaků. Funguje na písmech, která jsou již vložena, takže úspora velikosti závisí na množství nepoužitých dat písma, která prezentace obsahuje.
Následující příklad komprimuje písma v souboru EmbeddedFonts.pptx a uloží výsledek jako samostatný soubor:
import aspose.slides as slides
with slides.Presentation("EmbeddedFonts.pptx") as presentation:
slides.lowcode.Compress.compress_embedded_fonts(presentation)
presentation.save("CompressedEmbeddedFonts.pptx", slides.export.SaveFormat.PPTX)
Uchovejte původní soubor, pokud příjemci mohou později potřebovat přidat text. Znaky odstraněné během komprese již nejsou k dispozici z vloženého písma, i když jste původně vložili všechny znaky.
FAQ
Jak mohu zkontrolovat, zda bude vložené písmo během vykreslování stále nahrazeno?
Zavolejte get_substitutions v prostředí, ve kterém prezentaci vykreslujete, abyste zjistili, která písma Aspose.Slides nahradí. Také zkontrolujte nastavení font substitution a pravidla font fallback. Náhrada (fallback) řeší chybějící znaky, takže vložení písma nevyřeší znaky, které samotné písmo neobsahuje.
Mám vložit běžná písma, jako jsou Arial a Calibri?
Rozhodnutí se odvíjí od cílového prostředí. Pokud jsou požadovaná písma dostupná na každém počítači, který prezentaci otevírá nebo vykresluje, může jejich vložení přidat zbytečnou velikost souboru. Pokud mohou příjemci nebo servery tato písma postrádat, může jejich vložení pomoci zachovat zamýšlený vzhled, pokud to licence povolují.