Ενσωμάτωση Γραμματοσειρών σε Παρουσιάσεις στο .NET
Εισαγωγή
Η ενσωμάτωση γραμματοσειρών αποθηκεύει τα δεδομένα της γραμματοσειράς μέσα σε μια παρουσίαση PowerPoint. Όταν ένας προβάλλοντας υποστηρίζει ενσωματωμένες γραμματοσειρές, μπορεί να εμφανίζει το κείμενο χρησιμοποιώντας αυτές τις γραμματοσειρές ακόμη και αν δεν είναι εγκατεστημένες στο σύστημα‑στόχο. Αυτό βοηθά στη διατήρηση των αλλαγών γραμμής, του διαστήματος του κειμένου και της διάταξης των διαφάνειων.
Το Aspose.Slides για .NET σας επιτρέπει να ανακτήσετε, να προσθέσετε και να αφαιρέσετε ενσωματωμένες γραμματοσειρές μέσω της FontsManager ιδιότητας ενός Presentation. Μπορείτε επίσης να μειώσετε το μέγεθος των δεδομένων ενσωματωμένης γραμματοσειράς αφαιρώντας χαρακτήρες που δεν χρησιμοποιεί η παρουσίαση.
Τα παραδείγματα παρακάτω λειτουργούν με αρχεία PPTX. Πριν ενσωματώσετε μια γραμματοσειρά, βεβαιωθείτε ότι τα δεδομένα της γραμματοσειράς είναι διαθέσιμα στο Aspose.Slides και ότι η άδειά της επιτρέπει την ενσωμάτωση.
Λήψη και Αφαίρεση Ενσωματωμένων Γραμματοσειρών
Χρησιμοποιήστε το GetEmbeddedFonts για να καταγράψετε τις γραμματοσειρές που αποθηκεύονται σε μια παρουσίαση. Για να αφαιρέσετε μία, περάστε μια γραμματοσειρά από αυτή τη λίστα στο RemoveEmbeddedFont, έπειτα αποθηκεύστε την παρουσίαση.
Το ακόλουθο παράδειγμα καταγράφει τις ενσωματωμένες γραμματοσειρές στο EmbeddedFonts.pptx και αφαιρεί την Calibri εάν είναι παρούσα:
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("EmbeddedFonts.pptx");
var fontsManager = presentation.FontsManager;
var embeddedFonts = fontsManager.GetEmbeddedFonts();
foreach (var font in embeddedFonts)
{
Console.WriteLine(font.FontName);
}
var fontToRemove = Array.Find(embeddedFonts, font => string.Equals(font.FontName, "Calibri", StringComparison.OrdinalIgnoreCase));
if (fontToRemove != null)
{
fontsManager.RemoveEmbeddedFont(fontToRemove);
presentation.Save("WithoutEmbeddedCalibri.pptx", SaveFormat.Pptx);
}
else
{
Console.WriteLine("Calibri is not embedded. No output file was created.");
}
Αφαιρώντας μια ενσωματωμένη γραμματοσειρά αφαιρεί τα αποθηκευμένα δεδομένα της γραμματοσειράς· δεν αλλάζει τη γραμματοσειρά που έχει ανατεθεί στο κείμενο. Εάν η γραμματοσειρά είναι εγκατεστημένη στο σύστημα‑στόχο, το κείμενο μπορεί ακόμα να τη χρησιμοποιήσει. Διαφορετικά, η απόδοση μπορεί να απαιτήσει την αντικατάσταση γραμματοσειράς, η οποία μπορεί να επηρεάσει τη διάταξη.
Επιθεώρηση Δεδομένων Γραμματοσειράς και Δικαιωμάτων Ενσωμάτωσης
Χρησιμοποιήστε τη διεπαφή IFontsManager για να επιθεωρήσετε τις γραμματοσειρές πριν τις ενσωματώσετε. Καλέστε το IFontsManager.GetFonts για να ανακτήσετε τις γραμματοσειρές που χρησιμοποιούνται στην παρουσίαση. Για κάθε γραμματοσειρά, περάστε ένα αντικείμενο IFontData και την απαιτούμενη τιμή FontStyleType στο IFontsManager.GetFontBytes. Η μέθοδος επιστρέφει τα δυαδικά δεδομένα για αυτό το στυλ γραμματοσειράς, ή null όταν η ζητούμενη γραμματοσειρά ή στυλ δεν είναι διαθέσιμα. Μην περάσετε ένα αποτέλεσμα null στο IFontsManager.GetFontEmbeddingLevel, επειδή αυτή η μέθοδος απαιτεί έναν πίνακα byte.
EmbeddingLevel είναι μια απαρίθμηση σημαίας που αναφέρει τους περιορισμούς ενσωμάτωσης που αποθηκεύονται στη γραμματοσειρά:
Installableεπιτρέπει την ενσωμάτωση και μόνιμη εγκατάσταση σε άλλο σύστημα, υπό την άδεια της γραμματοσειράς.Restrictedαπαγορεύει την ενσωμάτωση εκτός αν ληφθεί άδεια από τον νομικό κάτοχο της γραμματοσειράς όταν είναι η μοναδική σημαία άδειας χρήσης.PreviewPrintεπιτρέπει προσωρινή χρήση για προβολή και εκτύπωση· ένα έγγραφο που περιέχει τη γραμματοσειρά πρέπει να είναι μόνο για ανάγνωση.Editableεπιτρέπει προσωρινή χρήση και επιτρέπει το έγγραφο να επεξεργαστεί και να αποθηκευτεί.NoSubsettingείναι ένας πρόσθετος περιορισμός που απαγορεύει την ενσωμάτωση μόνο ενός υποσυνόλου των χαρακτήρων. Ενσωματώστε όλους τους χαρακτήρες όταν αυτή η σημαία είναι παρούσα.BitmapOnlyείναι ένας πρόσθετος περιορισμός που επιτρέπει την ενσωμάτωση μόνο bitmap εκδόσεων, όχι δεδομένων περιγράμματος. Αν η γραμματοσειρά δεν έχει bitmap εκδόσεις, δεν μπορεί να ενσωματωθεί.
Οι πρώτες τέσσερις τιμές περιγράφουν την άδεια χρήσης, ενώ τα NoSubsetting και BitmapOnly μπορούν να συνδυαστούν μαζί τους. Ελέγξτε τις τροποποιήσεις με λειτουργίες bitwise. Επειδή το Installable ισούται με μηδέν, μην χρησιμοποιείτε το HasFlag για να το εντοπίσετε· μάσκαρε τα bits άδειας χρήσης και σύγκρινε το αποτέλεσμα με το Installable. Οι τρέχουσες γραμματοσειρές πρέπει να ορίζουν το πολύ ένα bit άδειας χρήσης. Για συμβατότητα με παλαιότερες γραμματοσειρές που ορίζουν περισσότερα από ένα, ο βοηθός παρακάτω επιλέγει την λιγότερο περιοριστική άδεια: Editable, έπειτα PreviewPrint, έπειτα Restricted.
Το ακόλουθο παράδειγμα ελέγχει τα κανονικά, έντονα, πλάγια και έντονα‑πλάγια δεδομένα που διατίθενται για κάθε γραμματοσειρά που επιστρέφεται από το GetFonts. Παραλείπει τα μη διαθέσιμα στυλ, τις περιορισμένες γραμματοσειρές, τις γραμματοσειρές μόνο bitmap, τις γραμματοσειρές περιορισμένες σε προεπισκόπηση και εκτύπωση επειδή η έξοδος παραμένει επεξεργάσιμη, και τις γραμματοσειρές που είναι ήδη ενσωματωμένες. Εάν κάποιο διαθέσιμο στυλ έχει NoSubsetting, ενσωματώνει όλους τους χαρακτήρες για αυτήν την οικογένεια γραμματοσειρών.
using System;
using System.Collections.Generic;
using Aspose.Slides;
using Aspose.Slides.Export;
static EmbeddingLevel GetUsagePermission(EmbeddingLevel level)
{
const EmbeddingLevel permissionMask = EmbeddingLevel.Restricted | EmbeddingLevel.PreviewPrint | EmbeddingLevel.Editable;
var 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;
}
using var presentation = new Presentation("Fonts.pptx");
var fontsManager = presentation.FontsManager;
var fontStyles = new[]
{
FontStyleType.Regular,
FontStyleType.Bold,
FontStyleType.Italic,
FontStyleType.Bold | FontStyleType.Italic
};
var embeddedFontNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var embeddedFont in fontsManager.GetEmbeddedFonts())
{
embeddedFontNames.Add(embeddedFont.FontName);
}
var embeddingPlan = new List<(IFontData Font, EmbedFontCharacters Rule)>();
foreach (var font in fontsManager.GetFonts())
{
if (embeddedFontNames.Contains(font.FontName))
{
Console.WriteLine($"{font.FontName}: already embedded.");
continue;
}
var hasAvailableData = false;
var allAvailableStylesCanBeEmbedded = true;
var previewPrintOnly = false;
var requiresFullFont = false;
foreach (var fontStyle in fontStyles)
{
var fontBytes = fontsManager.GetFontBytes(font, fontStyle);
if (fontBytes == null)
{
Console.WriteLine($"{font.FontName} ({fontStyle}): font data is unavailable.");
continue;
}
hasAvailableData = true;
var embeddingLevel = fontsManager.GetFontEmbeddingLevel(fontBytes, font.FontName);
var usagePermission = GetUsagePermission(embeddingLevel);
var noSubsetting = (embeddingLevel & EmbeddingLevel.NoSubsetting) != 0;
var bitmapOnly = (embeddingLevel & EmbeddingLevel.BitmapOnly) != 0;
requiresFullFont |= noSubsetting;
previewPrintOnly |= usagePermission == EmbeddingLevel.PreviewPrint;
allAvailableStylesCanBeEmbedded &= usagePermission != EmbeddingLevel.Restricted && !bitmapOnly;
Console.WriteLine($"{font.FontName} ({fontStyle}): {embeddingLevel}.");
}
if (!hasAvailableData)
{
Console.WriteLine($"{font.FontName}: skipped because no requested style is available.");
}
else if (!allAvailableStylesCanBeEmbedded)
{
Console.WriteLine($"{font.FontName}: skipped because at least one available style does not permit outline embedding.");
}
else if (previewPrintOnly)
{
Console.WriteLine($"{font.FontName}: skipped because this example produces an editable presentation.");
}
else
{
var rule = requiresFullFont ? EmbedFontCharacters.All : EmbedFontCharacters.OnlyUsed;
embeddingPlan.Add((font, rule));
}
}
foreach (var item in embeddingPlan)
{
fontsManager.AddEmbeddedFont(item.Font, item.Rule);
}
presentation.Save("WithAuditedFonts.pptx", SaveFormat.Pptx);
Αυτή η επιθεώρηση αναφέρει τους περιορισμούς που κωδικοποιούνται σε κάθε αρχείο γραμματοσειράς. Δεν χορηγεί άδεια, δεν αποδεικνύει ότι αποκτήσατε τη γραμματοσειρά νόμιμα, ούτε αντικαθιστά τον έλεγχο της συμφωνίας άδειας της γραμματοσειράς πριν διανείμετε ένα ενσωματωμένο αντίγραφο.
Προσθήκη Ενσωματωμένων Γραμματοσειρών
Χρησιμοποιήστε το AddEmbeddedFont για να ενσωματώσετε μια γραμματοσειρά. Οι υπερφορτώσεις του δέχονται είτε ένα αντικείμενο IFontData είτε έναν πίνακα byte που περιέχει τα δεδομένα της γραμματοσειράς. Η απαρίθμηση EmbedFontCharacters ελέγχει ποιοι χαρακτήρες περιλαμβάνονται:
- All ενσωματώνει όλους τους χαρακτήρες στη γραμματοσειρά. Χρησιμοποιήστε αυτή την επιλογή όταν οι παραλήπτες χρειάζονται να επεξεργαστούν την παρουσίαση και να εισάγουν νέο κείμενο.
- OnlyUsed ενσωματώνει μόνο τους χαρακτήρες που χρησιμοποιούνται στην παρουσίαση για να μειωθεί το μέγεθος του αρχείου. Επιλέξτε αυτή την επιλογή για μια τελική παρουσίαση που προορίζεται κυρίως για προβολή.
Το παρακάτω παράδειγμα χρησιμοποιεί το GetFonts για να ανακτήσει τις γραμματοσειρές που χρησιμοποιούνται στο Fonts.pptx και ενσωματώνει αυτές που δεν είναι ήδη ενσωματωμένες. Οι γραμματοσειρές που θα προστεθούν πρέπει να είναι διαθέσιμες στο μηχάνημα που εκτελεί τον κώδικα. Οι υπάρχουσες ενσωματωμένες γραμματοσειρές διατηρούν τα τρέχοντα σύνολα χαρακτήρων τους.
using System;
using System.Collections.Generic;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("Fonts.pptx");
var fontsManager = presentation.FontsManager;
var allFonts = fontsManager.GetFonts();
var embeddedFonts = fontsManager.GetEmbeddedFonts();
var embeddedFontNames = embeddedFonts.Select(font => font.FontName);
var embeddedNames = new HashSet<string>(embeddedFontNames, StringComparer.OrdinalIgnoreCase);
foreach (var font in allFonts)
{
if (!embeddedNames.Contains(font.FontName))
{
fontsManager.AddEmbeddedFont(font, EmbedFontCharacters.All);
embeddedNames.Add(font.FontName);
}
}
presentation.Save("WithEmbeddedFonts.pptx", SaveFormat.Pptx);
Συμπίεση Ενσωματωμένων Γραμματοσειρών
Το CompressEmbeddedFonts μειώνει τα δεδομένα ενσωματωμένων γραμματοσειρών αφαιρώντας αχρησιμοποίητους χαρακτήρες. Λειτουργεί σε γραμματοσειρές που είναι ήδη ενσωματωμένες, επομένως η μείωση του μεγέθους εξαρτάται από το πόσα αχρησιμοποίητα δεδομένα γραμματοσειράς περιέχει η παρουσίαση.
Το παρακάτω παράδειγμα συμπιέζει τις γραμματοσειρές στο EmbeddedFonts.pptx και αποθηκεύει το αποτέλεσμα ως ξεχωριστό αρχείο:
using Aspose.Slides;
using Aspose.Slides.Export;
using Aspose.Slides.LowCode;
using var presentation = new Presentation("EmbeddedFonts.pptx");
Compress.CompressEmbeddedFonts(presentation);
presentation.Save("CompressedEmbeddedFonts.pptx", SaveFormat.Pptx);
Διατηρήστε το αρχικό αρχείο εάν οι παραλήπτες μπορεί να χρειαστούν να προσθέσουν κείμενο αργότερα. Οι χαρακτήρες που αφαιρέθηκαν κατά τη συμπίεση δεν είναι πλέον διαθέσιμοι από την ενσωματωμένη γραμματοσειρά, ακόμη και αν αρχικά ενσωματώσατε όλους τους χαρακτήρες.
Για να επιτρέψετε σε μια ταιριαχή καταχωρημένη γραμματοσειρά να έχει προτεραιότητα κατά την εξαγωγή χωρίς αφαίρεση της ενσωματωμένης γραμματοσειράς, δείτε Δώστε Προτεραιότητα στις Καταχωρημένες Γραμματοσειρές έναντι των Ενσωματωμένων Γραμματοσειρών (.NET 26.11 ή μεταγενέστερο).
Συχνές Ερωτήσεις
Πώς μπορώ να ελέγξω αν μια ενσωματωμένη γραμματοσειρά θα αντικατασταθεί ακόμα κατά την απόδοση;
Καλέστε το GetSubstitutions στο περιβάλλον όπου αποδίδετε την παρουσίαση για να δείτε ποιες γραμματοσειρές θα αντικαταστήσει το Aspose.Slides. Επίσης ελέγξτε τις ρυθμίσεις της αντικατάστασης γραμματοσειράς και τους κανόνες εφεδρικής γραμματοσειράς. Η εφεδρική γραμματοσειρά διαχειρίζεται τους λείποντες χαρακτήρες, έτσι η ενσωμάτωση μιας γραμματοσειράς δεν επιλύει χαρακτήρες που η ίδια η γραμματοσειρά δεν περιέχει.
Πρέπει να ενσωματώσω κοινές γραμματοσειρές όπως Arial και Calibri;
Βάστε την απόφαση στο περιβάλλον‑στόχο. Εάν οι απαιτούμενες γραμματοσειρές είναι διαθέσιμες σε κάθε μηχάνημα που ανοίγει ή αποδίδει την παρουσίαση, η ενσωμάτωση τους μπορεί να προσθέσει περιττό μέγεθος αρχείου. Εάν οι παραλήπτες ή οι διακομιστές ενδέχεται να μην έχουν αυτές τις γραμματοσειρές, η ενσωμάτωση τους μπορεί να βοηθήσει στη διατήρηση της προγραμματισμένης εμφάνισης, εφόσον οι άδειές τους το επιτρέπουν.