Schriftarten in Präsentationen in Python via Java einbetten
Einführung
Das Einbetten von Schriftarten speichert die Schriftartdaten innerhalb einer PowerPoint‑Präsentation. Wenn ein Viewer eingebettete Schriftarten unterstützt, kann er den Text mit diesen Schriftarten anzeigen, selbst wenn sie nicht im Zielsystem installiert sind. Dies hilft, Zeilenumbrüche, Textabstände und das Folienlayout beizubehalten.
Aspose.Slides for Python via Java ermöglicht das Abrufen, Hinzufügen und Entfernen eingebetteter Schriftarten über die FontsManager‑Klasse, die von Presentation.getFontsManager zurückgegeben wird. Sie können die Größe der eingebetteten Schriftartdaten auch reduzieren, indem Sie Zeichen entfernen, die in der Präsentation nicht verwendet werden.
Die nachfolgenden Beispiele arbeiten mit PPTX‑Dateien. Vor dem Einbetten einer Schriftart stellen Sie sicher, dass deren Schriftartdaten für Aspose.Slides verfügbar sind und dass die Lizenz das Einbetten erlaubt.
Abrufen und Entfernen eingebetteter Schriftarten
Verwenden Sie getEmbeddedFonts, um die in einer Präsentation gespeicherten Schriftarten aufzulisten. Um eine Schriftart zu entfernen, übergeben Sie eine Schriftart aus dieser Liste an removeEmbeddedFont und speichern anschließend die Präsentation.
Das folgende Beispiel listet die eingebetteten Schriftarten in EmbeddedFonts.pptx auf und entfernt Calibri, falls sie vorhanden ist:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("EmbeddedFonts.pptx")
try:
fonts_manager = presentation.getFontsManager()
embedded_fonts = fonts_manager.getEmbeddedFonts()
for font in embedded_fonts:
print(font.getFontName())
font_to_remove = None
for font in embedded_fonts:
if str(font.getFontName()).casefold() == "calibri":
font_to_remove = font
break
if font_to_remove is not None:
fonts_manager.removeEmbeddedFont(font_to_remove)
presentation.save("WithoutEmbeddedCalibri.pptx", SaveFormat.Pptx)
else:
print("Calibri is not embedded. No output file was created.")
finally:
presentation.dispose()
Das Entfernen einer eingebetteten Schriftart löscht die gespeicherten Schriftartdaten; die der Text zugewiesene Schriftart bleibt unverändert. Ist die Schriftart auf dem Zielsystem installiert, kann der Text sie weiterhin verwenden. Andernfalls kann beim Rendern eine Schriftartsubstitution erfolgen, was das Layout beeinflussen kann.
Untersuchen von Schriftartdaten und Einbettungsrechten
Verwenden Sie die FontsManager‑Klasse, um Schriftarten vor dem Einbetten zu inspizieren. Rufen Sie FontsManager.getFonts auf, um die in der Präsentation verwendeten Schriftarten zu erhalten. Für jede Schriftart übergeben Sie ein FontData‑Objekt und den erforderlichen FontStyleType‑Wert an FontsManager.getFontBytes. Die Methode liefert die Binärdaten für diesen Schriftstil oder None, wenn die angeforderte Schriftart bzw. der Stil nicht verfügbar ist. Übergeben Sie kein None‑Ergebnis an FontsManager.getFontEmbeddingLevel, da diese Methode ein Byte‑Array erwartet.
EmbeddingLevel ist eine Flags‑Enumeration, die die in der Schriftart gespeicherten Einbettungsbeschränkungen meldet:
Installableerlaubt das Einbetten und die permanente Installation auf einem anderen System, vorbehaltlich der Schriftlizenz.Restrictedverbietet das Einbetten, es sei denn, es liegt eine Genehmigung des Rechteinhabers vor, wenn es das einzige Nutzungs‑Flag ist.PreviewPrinterlaubt die temporäre Verwendung zum Anzeigen und Drucken; ein Dokument, das die Schriftart enthält, muss schreibgeschützt sein.Editableerlaubt die temporäre Verwendung und gestattet das Bearbeiten und Speichern des Dokuments.NoSubsettingist eine zusätzliche Beschränkung, die das Einbetten nur eines Teil‑Sets der Glyphen verbietet. In diesem Fall müssen alle Zeichen eingebettet werden.BitmapOnlyist eine zusätzliche Beschränkung, die nur das Einbetten von Bitmap‑Strikes erlaubt, nicht jedoch von Konturdaten. Hat die Schriftart keine Bitmap‑Strikes, kann sie nicht eingebettet werden.
Die ersten vier Werte beschreiben die Nutzungs‑Erlaubnis, während NoSubsetting und BitmapOnly mit ihnen kombiniert werden können. Prüfen Sie die Modifikatoren mit Bit‑Operationen. Da Installable den Wert 0 hat, maskieren Sie die Nutzungs‑Bits und vergleichen das Ergebnis mit Installable, anstatt das Flag direkt zu prüfen. Aktuelle Schriftarten sollten höchstens ein Nutzungs‑Bit setzen. Für die Kompatibilität mit älteren Schriftarten, die mehrere Bits setzen, wählt die Hilfsmethode unten die am wenigsten restriktive Erlaubnis: Editable, dann PreviewPrint, dann Restricted.
Das folgende Beispiel prüft die regulären, fetten, kursiven und fett‑kursiven Daten jeder von getFonts zurückgegebenen Schriftart. Nicht verfügbare Stile, eingeschränkte Schriftarten, ausschließlich Bitmap‑Schriftarten, Schriftarten, die nur für Vorschau und Druck zulässig sind (weil das Ergebnis bearbeitbar bleiben soll), sowie bereits eingebettete Schriftarten werden übersprungen. Hat ein verfügbarer Stil NoSubsetting, werden alle Zeichen für diese Schriftfamilie eingebettet:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import EmbedFontCharacters, EmbeddingLevel, FontStyleType, Presentation, SaveFormat
def get_usage_permission(level):
permission_mask = EmbeddingLevel.Restricted | EmbeddingLevel.PreviewPrint | EmbeddingLevel.Editable
permissions = level & permission_mask
if permissions & EmbeddingLevel.Editable:
return EmbeddingLevel.Editable
if permissions & EmbeddingLevel.PreviewPrint:
return EmbeddingLevel.PreviewPrint
if permissions & EmbeddingLevel.Restricted:
return EmbeddingLevel.Restricted
return EmbeddingLevel.Installable
presentation = Presentation("Fonts.pptx")
try:
fonts_manager = presentation.getFontsManager()
font_styles = [
FontStyleType.Regular,
FontStyleType.Bold,
FontStyleType.Italic,
FontStyleType.Bold | FontStyleType.Italic,
]
embedded_font_names = {str(embedded_font.getFontName()).casefold() for embedded_font in fonts_manager.getEmbeddedFonts()}
fonts_to_embed = []
embedding_rules = []
for font in fonts_manager.getFonts():
font_name = str(font.getFontName())
if font_name.casefold() in embedded_font_names:
print(f"{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.getFontBytes(font, font_style)
if font_bytes is None:
print(f"{font_name} ({font_style}): font data is unavailable.")
continue
has_available_data = True
embedding_level = fonts_manager.getFontEmbeddingLevel(font_bytes, font.getFontName())
usage_permission = get_usage_permission(embedding_level)
no_subsetting = bool(embedding_level & EmbeddingLevel.NoSubsetting)
bitmap_only = bool(embedding_level & EmbeddingLevel.BitmapOnly)
requires_full_font = requires_full_font or no_subsetting
preview_print_only = preview_print_only or usage_permission == EmbeddingLevel.PreviewPrint
usage_permits_embedding = usage_permission != EmbeddingLevel.Restricted and not bitmap_only
all_available_styles_can_be_embedded = all_available_styles_can_be_embedded and usage_permits_embedding
print(f"{font_name} ({font_style}): {embedding_level}.")
if not has_available_data:
print(f"{font_name}: skipped because no requested style is available.")
elif not all_available_styles_can_be_embedded:
print(f"{font_name}: skipped because at least one available style does not permit outline embedding.")
elif preview_print_only:
print(f"{font_name}: skipped because this example produces an editable presentation.")
else:
rule = EmbedFontCharacters.All if requires_full_font else EmbedFontCharacters.OnlyUsed
fonts_to_embed.append(font)
embedding_rules.append(rule)
for font, rule in zip(fonts_to_embed, embedding_rules):
fonts_manager.addEmbeddedFont(font, rule)
presentation.save("WithAuditedFonts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Diese Inspektion meldet die in jeder Schriftartdatei kodierten Beschränkungen. Sie stellt keine Lizenz bereit, beweist nicht, dass Sie die Schriftart legal erworben haben, und ersetzt nicht die Prüfung der Lizenzvereinbarung, bevor Sie eine eingebettete Kopie verbreiten.
Eingebettete Schriftarten hinzufügen
Verwenden Sie addEmbeddedFont, um eine Schriftart einzubetten. Die Überladungen akzeptieren entweder ein FontData‑Objekt oder ein Byte‑Array mit den Schriftartdaten. Die Enumeration EmbedFontCharacters steuert, welche Zeichen eingeschlossen werden:
- All bettet alle Zeichen der Schriftart ein. Verwenden Sie diese Option, wenn Empfänger die Präsentation bearbeiten und neuen Text eingeben müssen.
- OnlyUsed bettet nur die in der Präsentation verwendeten Zeichen ein, um die Dateigröße zu reduzieren. Wählen Sie diese Option für eine fertige Präsentation, die hauptsächlich zur Anzeige bestimmt ist.
Das folgende Beispiel ruft mit getFonts die in Fonts.pptx verwendeten Schriftarten ab und bettet diejenigen ein, die noch nicht eingebettet sind. Die hinzuzufügenden Schriftarten müssen auf dem Computer, auf dem der Code ausgeführt wird, verfügbar sein. Bereits eingebettete Schriftarten behalten ihre aktuellen Zeichensätze bei:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import EmbedFontCharacters, Presentation, SaveFormat
presentation = Presentation("Fonts.pptx")
try:
fonts_manager = presentation.getFontsManager()
all_fonts = fonts_manager.getFonts()
embedded_fonts = fonts_manager.getEmbeddedFonts()
embedded_font_names = {str(embedded_font.getFontName()).casefold() for embedded_font in embedded_fonts}
for font in all_fonts:
font_name = str(font.getFontName()).casefold()
if font_name not in embedded_font_names:
fonts_manager.addEmbeddedFont(font, EmbedFontCharacters.All)
embedded_font_names.add(font_name)
presentation.save("WithEmbeddedFonts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Eingebettete Schriftarten komprimieren
Compress.compressEmbeddedFonts reduziert eingebettete Schriftartdaten, indem nicht verwendete Zeichen entfernt werden. Die Methode arbeitet an bereits eingebetteten Schriftarten, sodass die Größenreduktion von der Menge nicht genutzter Schriftartdaten in der Präsentation abhängt.
Das folgende Beispiel komprimiert die Schriftarten in EmbeddedFonts.pptx und speichert das Ergebnis als separate Datei:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Compress, Presentation, SaveFormat
presentation = Presentation("EmbeddedFonts.pptx")
try:
Compress.compressEmbeddedFonts(presentation)
presentation.save("CompressedEmbeddedFonts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Behalten Sie die Originaldatei, wenn Empfänger später Text hinzufügen müssen. Während der Komprimierung entfernte Zeichen stehen nicht mehr aus der eingebetteten Schriftart zur Verfügung, selbst wenn ursprünglich alle Zeichen eingebettet wurden.
FAQ
Wie kann ich prüfen, ob eine eingebettete Schriftart beim Rendern trotzdem substituiert wird?
Rufen Sie getSubstitutions in der Umgebung auf, in der Sie die Präsentation rendern, um zu sehen, welche Schriftarten Aspose.Slides ersetzt. Prüfen Sie außerdem die Schriftart‑Substitutions‑Einstellungen und die Fallback‑Regeln. Fallback verarbeitet fehlende Zeichen, sodass das Einbetten einer Schriftart nicht fehlende Zeichen der Schriftart selbst ergänzt.
Sollte ich gängige Schriftarten wie Arial und Calibri einbetten?
Entscheiden Sie basierend auf der Zielumgebung. Wenn die benötigten Schriftarten auf jedem Gerät, das die Präsentation öffnet oder rendert, verfügbar sind, kann das Einbetten unnötig Dateigröße hinzufügen. Fehlen die Schriftarten jedoch bei Empfängern oder Servern, kann das Einbetten helfen, das gewünschte Erscheinungsbild beizubehalten, sofern die Lizenzen dies erlauben.