Python via Java ile Sunumlarda Yazı Tiplerini Gömme
Giriş
Yazı tiplerini gömmek, yazı tipi verilerini bir PowerPoint sunumunun içinde saklar. Bir görüntüleyici gömülü yazı tiplerini desteklediğinde, hedef sistemde yüklü olmasalar bile metni bu yazı tipleriyle gösterebilir. Bu, satır sonları, metin aralığı ve slayt düzeninin korunmasına yardımcı olur.
Aspose.Slides for Python via Java, FontsManager sınıfını Presentation.getFontsManager üzerinden dönen sınıf aracılığıyla gömülü yazı tiplerini almanıza, eklemenize ve kaldırmanıza izin verir. Ayrıca, sunumun kullanmadığı karakterleri kaldırarak gömülü yazı tipi verisinin boyutunu azaltabilirsiniz.
Aşağıdaki örnekler PPTX dosyalarıyla çalışır. Bir yazı tipini gömmeden önce, yazı tipi verisinin Aspose.Slides tarafından erişilebilir olduğundan ve lisansının gömmeye izin verdiğinden emin olun.
Gömülü Yazı Tiplerini Al ve Kaldır
Bir sunumda depolanan yazı tiplerini listelemek için getEmbeddedFonts kullanın. Birini kaldırmak için, listedeki bir yazı tipini removeEmbeddedFont metoduna aktarın ve ardından sunumu kaydedin.
Aşağıdaki örnek, EmbeddedFonts.pptx içindeki gömülü yazı tiplerini listeler ve Calibri mevcutsa kaldırır:
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()
Bir gömülü yazı tipini kaldırmak, saklanan yazı tipi verisini siler; metne atanmış yazı tipini değiştirmez. Yazı tipi hedef sistemde kuruluysa, metin hâlâ bu yazı tipini kullanabilir. Aksi takdirde, renderlama yazı tipi ikamesi gerektirebilir ve bu da düzeni etkileyebilir.
Yazı Tipi Verisini ve Gömme İzinlerini İnceleme
Yazı tiplerini gömmeden önce incelemek için FontsManager sınıfını kullanın. Sunumda kullanılan yazı tiplerini almak için FontsManager.getFonts çağırın. Her bir yazı tipi için bir FontData nesnesi ve gerekli FontStyleType değerini FontsManager.getFontBytes metoduna geçirin. Metod, o yazı tipi stilinin ikili verisini döndürür; istenen yazı tipi veya stil bulunamazsa None döner. None sonucunu FontsManager.getFontEmbeddingLevel metoduna göndermeyin, çünkü bu metod bir bayt dizisi bekler.
EmbeddingLevel yazı tipinde depolanan gömme kısıtlamalarını raporlayan bir bayrak enumeration’ıdır:
Installablegömmeye ve başka bir sistemde kalıcı kuruluma izin verir; bu, yazı tipi lisansına tabidir.Restrictedyalnızca tek kullanım‑izin bayrağı olduğunda, yazı tipinin yasal sahibinden izin alınmadıkça gömme yasaktır.PreviewPrintgeçici olarak görüntüleme ve yazdırma için izin verir; yazı tipini içeren belge salt‑okunur olmalıdır.Editablegeçici kullanım izni verir ve belgenin düzenlenip kaydedilmesine izin tanır.NoSubsettingyalnızca bir alt küme karakterin gömülmesini yasaklayan ek bir kısıtlamadır. Bu bayrak mevcutsa tüm karakterler gömülmelidir.BitmapOnlyyalnızca bitmap vuruşlarının gömülmesine izin veren ek bir kısıtlamadır; kontur verisi gömülemez. Font bitmap vuruşu içermiyorsa gömülemez.
İlk dört değer kullanım iznini tanımlarken, NoSubsetting ve BitmapOnly bunlarla birlikte kullanılabilir. Modifikasyonları bit‑düzeyi işlemlerle kontrol edin. Installable sıfır olduğundan, kullanım‑izin bitlerini maskeleyip sonucu Installable ile karşılaştırın; bayrak olarak doğrudan kontrol etmeyin. Geçerli fontlar en fazla bir kullanım‑izin biti ayarlamalıdır. Birden fazla ayarlayan eski fontlarla uyumluluk için aşağıdaki yardımcı, en az kısıtlayıcı izni seçer: Editable, ardından PreviewPrint, ardından Restricted.
Aşağıdaki örnek, getFonts tarafından döndürülen her font için normal, kalın, eğik ve kalın‑eğik verilerini denetler. Kullanılamayan stilleri, kısıtlı fontları, sadece bitmap‑only olanları, sadece önizleme‑yazdırma izni olanları (çünkü çıktı hâlâ düzenlenebilir), ve zaten gömülmüş fontları atlar. Eğer herhangi bir kullanılabilir stil NoSubsetting içeriyorsa, o font ailesi için tüm karakterler gömülür:
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()
Bu denetim, her font dosyasındaki kodlanmış kısıtlamaları raporlar. Bir lisans temini, yasal olarak font edinildiğinin kanıtı sağlamak veya gömülü bir kopya dağıtmadan önce font lisans sözleşmesini kontrol etmek yerine geçmez.
Gömülü Yazı Tipi Ekleme
Bir font gömmek için addEmbeddedFont kullanın. Aşırı yüklemeleri, bir FontData nesnesi ya da font verisini içeren bir bayt dizisi alır. EmbedFontCharacters enumeration’ı, hangi karakterlerin dahil edileceğini kontrol eder:
- All fonttaki tüm karakterleri gömer. Alıcıların sunumu düzenlemesi ve yeni metin eklemesi gerektiğinde bu seçenek kullanılır.
- OnlyUsed sadece sunumda kullanılan karakterleri gömer; dosya boyutunu azaltır. Tamamlanmış ve öncelikle görüntülenmesi amaçlanan sunumlar için bu seçenek tercih edilmelidir.
Aşağıdaki örnek, Fonts.pptx içinde kullanılan fontları getFonts ile alır ve hâlâ gömülmemiş olanları gömer. Eklemek istenen fontların kodun çalıştığı makinede bulunması gerekir. Mevcut gömülü fontlar karakter setlerini korur:
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()
Gömülü Yazı Tiplerini Sıkıştırma
Compress.compressEmbeddedFonts kullanılmayan karakterleri kaldırarak gömülü font verisini azaltır. Zaten gömülmüş fontlar üzerinde çalıştığından, boyut azalması sunumdaki kullanılmayan font verisinin miktarına bağlıdır.
Aşağıdaki örnek, EmbeddedFonts.pptx içindeki fontları sıkıştırır ve sonucu ayrı bir dosya olarak kaydeder:
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()
Alıcıların ileride metin eklemesi gerekebileceği durumlarda orijinal dosyayı saklayın. Sıkıştırma sırasında kaldırılan karakterler, gömülü font üzerinden artık kullanılamaz; başlangıçta tüm karakterler gömülmüş olsa bile.
SSS
Bir gömülü fontun renderlama sırasında yine de ikame edilip edilmeyeceğini nasıl kontrol edebilirim?
Sunumu renderladığınız ortamda getSubstitutions metodunu çağırarak Aspose.Slides’in hangi fontları değiştireceğini görebilirsiniz. Ayrıca font ikamesi ayarlarını ve font geri dönüş kurallarını kontrol edin. Geri dönüş, eksik karakterleri ele alır; bu nedenle bir fontu gömmek, fontun içinde bulunmayan karakterleri çözmez.
Arial ve Calibri gibi yaygın fontları gömmeli miyim?
Karar, hedef ortamına göre verilmelidir. Gerekli fontlar, sunumu açan veya renderlayan her makinede mevcutsa, gömmek gereksiz dosya büyüklüğü ekler. Alıcıların ya da sunucuların bu fontları bulundurma ihtimali düşükse, lisansları izin veriyorsa gömmek görünümün korunmasına yardımcı olur.