Upřesněte pravdu Umístění písma typu

Toto téma popisuje výchozí chování Aspose.Words když hledá písma TrueType, včetně specifických rozdílů operačního systému, a ukazuje, jak určit uživatelské zdroje písma.

The FontSourceBase třída se používá k určení různých zdrojů písma. Existuje několik implementací FontSourceBase třída:

Podrobnosti o provádění některých tříd jsou vysvětleny níže.

Načíst písma ze systému

Tam je speciální SystemFontSource třída, která se vždy používá ve výchozím nastavení. Představuje všechna písma TrueType nainstalovaná v systému. Proto je možné vytvořit seznam zdrojů s SystemFontSource a jakékoli jiné požadované zdroje:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
FontSettings.getDefaultInstance().setFontsSources(
new FontSourceBase[] { new SystemFontSource(), new FolderFontSource("C:\\MyFonts\\", true) });
Document doc = new Document(dataDir + "Rendering.doc");
dataDir = dataDir + "Rendering.SetFontsFolders_out.pdf";
doc.save(dataDir);

Jediný případ SystemFontSource třída je defaultně definována v FontSettings. Na různých operačních systémech mohou být písma umístěna na různých místech. Nicméně FontSettings příklad pro každý dokument není optimálním řešením. Ve většině případů použití DefaultInstance To by mělo stačit.

Případy jednotlivých dokumentů jsou nutné pouze v případě, že je nutné použít různé zdroje písma pro různé dokumenty, což je vzácný případ. Použití několika FontSettings instance snižují výkon, protože nesdílejí cache.

Kde Aspose.Words Hledá písma TrueType na Windows

Ve většině případů Windows uživatelé nečelí významným problémům se zmeškaným písmem nebo nesprávným uspořádáním. Typicky, Aspose.Words prochází dokumentem a když narazí na odkaz na písmo, úspěšně stáhne data ze složky systému.

Na Windows, Aspose.Words nejprve vezme všechna dostupná písma z _%windir%\Fonts Složka. Toto nastavení pro vás bude většinou fungovat. Složky písem zadáváte pouze v případě, že je to nutné. Aspose.Words také hledá další písma registrovaná v HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts registrovací klíč. Kromě toho Windows 10 umožňuje instalaci fontů pro aktuálního uživatele. Písma jsou umístěna do %userprofile%\AppData\Local\Microsoft\Windows\Fonts Složka a také uvedena v HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Fonts registr, kde Aspose.Words budou hledat tato písma.

Pokud dokument obsahuje vložená písma, Aspose.Words může z dokumentu číst relevantní údaje o písmu a používat je k vytvoření rozvržení dokumentu. Dokumenty mohou rovněž obsahovat odkazy na písma, která nejsou ve složce systému, v takovém případě se objeví následující scénáře:

  • Uživatelé mohou nastavit nové zdroje písma prostřednictvím FontSettings třída
  • Aspose.Words může zkusit nahradit zapomenuté písmo podobným písmem

Písma na Non-Windows Systémy

Aspose.Words bude hledat písma ve složce systémového písma. Seznam těchto složek lze vidět GetSystemFontFolders metoda. Pokud nejsou nalezena žádná podporovaná písma, Aspose.Words použije vestavěné výchozí písmo Fanwood.ttf.

Vzhledem k tomu, písmo metriky Windows a ne-Windows OS jsou jiné, Aspose.Words vše, co je možné najít podobné písmo a vytvořit rozvržení podobné originálu. To však není vždy možné. V těchto případech FontSettings třída by měla být použita pro přidání vlastních písem nebo pravidel nahrazení.

Kde Aspose.Words Hledá písma TrueType na Linux

Různé Linux distribuce mohou ukládat písma v různých složkách. Aspose.Words hledá písma na několika místech. Ve výchozím nastavení Aspose.Words hledá písma ve všech následujících místech: /usr/share/fonts /usr/local/share/fonts /usr/X11R6/lib/X11/fonts Toto výchozí chování bude fungovat pro většinu Linux distribuce, ale není zaručeno, že pracovat po celou dobu, v tom případě byste mohli potřebovat určit umístění true písma typu explicitně. Chcete-li to udělat, musíte vědět, kde TrueType písma jsou nainstalována na vašem Linux distribuce.

Kde Aspose.Words Hledá TrueType písma na Mac OS X

Aspose.Words hledá písma ve složce /Library/Fonts, což je standardní umístění pro písma TrueType na Mac OS X. Zatímco toto nastavení bude pracovat pro vás většinu času, budete možná muset zadat své vlastní složky písem v případě, že budete potřebovat.

TrueType písma na Android

Na Android, Pracovní tok písem je zapouzdřen ve třídě Typeface. Existuje pět typů písma, každý písmo představuje skupinu podobných rodin písma:

  • DEFAULT
  • DEFAULT_ BOLD
  • MONOSPACE
  • SANS_SERIF
  • SERIF

Například podle Android? písma. xml Konfigurační soubor, časy, patří do rodiny serifů, takže NotoSerif-Regular.ttf bude použit, pokud je požadováno Times:

Písma.xml

<family name="serif">
        <font weight="400" style="normal">NotoSerif-Regular.ttf</font>
        <font weight="700" style="normal">NotoSerif-Bold.ttf</font>
        <font weight="400" style="italic">NotoSerif-Italic.ttf</font>
        <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font>
</family>
<alias name="times" to="serif" />
<alias name="times new roman" to="serif" />

Pro vyhledávání podobných písem se používají strategie popsané dříve

Kromě nich, Aspose.Words má svůj vlastní seznam náhrad za Android Platforma.

Řekněme, že dokument obsahuje písmo PMingLiU-ExtB, především, Aspose.Words hledá požadované písmo v rámci zdrojů systému.

Výchozí seznam Android Složky písma jsou:

  • /systém/fonty
  • /systém/font
  • /data/fonty

The Aspose.Words se dívá přes uživatelem definované zdroje, které byly nastaveny metodou:

Java

fontSettings.setFontsFolder("/home/user/MyFonts", true);

V případě výslovného nahrazení, Aspose.Words nahrazuje chybějící písmo návrhem uživatele:

Java

fontSettings.getSubstitutionSettings().getTableSubstitution().setSubstitutes("PMingLiU-ExtB", "Liberation Serif");

Pokud žádná z pravidel nezabrala, Aspose.Words zkontrolujte vnitřní náhradní tabulku. Pokud tabulka obsahuje informace o dobrém uložení, pak se font nahradí. V našem případě Aspose.Words vybere Typeface.SERIF. Ale pokud tabulka neví nic o požadovaném písmu pak Aspose.Words vyzvedne písmo založené na zvláštních pravidlech MS Word nebo nejbližší vzdálenost v prostoru Panose.

TrueType písma na .NET Core a Xamarin

Pro .NET Core a Xamarin platí stejné pravidlo jako pro Aspose.Words místo Java verze. Ve výchozím nastavení jsou k dispozici všechna systémová písma platformy, na které běží aplikace. Seznam složek, kde bude vyhledávání provedeno, lze nalézt voláním metody:

Java

SystemFontSource().getAvailableFonts()

Načíst písma ze složky

Pokud zpracovávaný dokument obsahuje odkazy na písma, která nejsou v systému, nebo je nechcete přidat do systémové složky, nebo vám chybí oprávnění, pak nejlepším řešením by bylo přidat složku s vlastními písmy pomocí SetFontsSources metoda. To umožní nahradit zdroj systému uživatelským zdrojem. Aspose.Words již nebude hledat písma v registru nebo Windows\Font Složka a místo toho pouze skenovat písma v zadané složce(s). The GetFontSources metoda vrátí odpovídající hodnoty.

Upřesnit jednu nebo více složek písma

The SetFontsFolder a SetFontsFolder metody jsou zkratky k SetFontSources metoda s jedním nebo několika FolderFontSource případy. Tyto metody se používají k označení místa Aspose.Words Měli bychom hledat písma. Pokud složka neexistuje nebo není přístupná, Aspose.Words ignoruje tuhle složku. Pokud by byly všechny složky, včetně zdrojů pro výměnu písma, ignorovány, Aspose.Words použije Fanwood písmo jako výchozí.

Následující příklad ukazuje, jak nastavit složku nebo zdroj, který Aspose.Words bude následně používat pro vyhledávání fontů TrueType při vykreslování nebo vkládání písem:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "Rendering.doc");
FontSettings FontSettings = new FontSettings();
// Note that this setting will override any default font sources that are being
// searched by default. Now only these folders will be searched for
// Fonts when rendering or embedding fonts. To add an extra font source while
// keeping system font sources then use both FontSettings.GetFontSources and
// FontSettings.SetFontSources instead.
FontSettings.setFontsFolder("C:\\MyFonts\\", false);
// Set font settings
doc.setFontSettings(FontSettings);
doc.save(dataDir + "Rendering.SetFontsFolder_out.pdf");

Extra Boolean parametr kontroluje, zda jsou písma skenována rekurzivně prostřednictvím všech složek, a proto skenuje všechny složky dětí v zadané složce. Následující příklad ukazuje, jak nastavit Aspose.Words prohlížení více složek pro písma TrueType při vykreslování nebo vkládání písem:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-.NET
// Open a Document
Document doc = new Document(dataDir + "Rendering.doc");
FontSettings FontSettings = new FontSettings();
// Note that this setting will override any default font sources that are being
// searched by default. Now only these folders will be searched for
// Fonts when rendering or embedding fonts. To add an extra font source while
// keeping system font sources then use both FontSettings.GetFontSources and
// FontSettings.SetFontSources instead.
FontSettings.setFontsFolders(new String[] { "C:\\MyFonts\\", "D:\\Misc\\Fonts\\" }, true);
// Set font settings
doc.setFontSettings(FontSettings);
doc.save(dataDir + "Rendering.SetFontsFolders_out.pdf");

Můžete si stáhnout soubor šablony tohoto příkladu z Aspose.Words GitHub.

Pokud vůbec nechcete používat systémová písma, Aspose.Words umožňuje ignorovat a používat pouze vlastní písma:

Java

FontSettings.getDefaultInstance().setFontsFolder("C:\\MyFonts\\", true);

Prioritní majetek

The Priority Vlastnost se používá, pokud existují písma se stejným příjmením a stylem v různých zdrojích písma. V tomto případě Aspose.Words vybere písmo ze zdroje s vyšší prioritou. Například na systémové složce je stará verze písma a zákazník do vlastní složky přidal novou verzi stejného písma.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
FontSettings.getDefaultInstance().setFontsSources(
new FontSourceBase[] { new SystemFontSource(), new FolderFontSource("C:\\MyFonts\\", true, 1) });

Načíst písma ze Streamu

Aspose.Words poskytuje StreamFontSource třída, která umožňuje načítání písem z potoka. Chcete-li použít zdroj streamového písma, uživatel musí vytvořit odvozenou třídu z StreamFontSource a poskytovat provádění OpenFontDataStream metoda. The OpenFontDataStream metoda může být volána několikrát. Poprvé, to bude volat, když Aspose.Words skenuje poskytnuté zdroje písma pro získání seznamu dostupných písem. Později může být voláno, pokud je písmo použito v dokumentu k analýze dat písma a k vložení dat písma do některých výstupních formátů. StreamFontSource může být užitečné, protože umožňuje načítání dat písma pouze v případě, že je požadováno, a neukládat je do paměti pro FontSettings Život.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public void streamFontSourceFileRendering() throws Exception {
FontSettings fontSettings = new FontSettings();
fontSettings.setFontsSources(new FontSourceBase[]{new StreamFontSourceFile()});
DocumentBuilder builder = new DocumentBuilder();
builder.getDocument().setFontSettings(fontSettings);
builder.getFont().setName("Kreon-Regular");
builder.writeln("Test aspose text when saving to PDF.");
builder.getDocument().save(dataDir + "FontSettings.StreamFontSourceFileRendering.pdf");
}
/// <summary>
/// Load the font data only when required instead of storing it in the memory for the entire lifetime of the "FontSettings" object.
/// </summary>
private static class StreamFontSourceFile extends StreamFontSource {
public FileInputStream openFontDataStream() throws Exception {
return new FileInputStream(dataDir + "Kreon-Regular.ttf");
}
}

StreamFontSource je alternativou k MemoryFontSource protože je vždy možné načíst proud do paměti a předat jej MemoryFontSource. Rozdíl je v tom, že MemoryFontSource je neustále uložen v paměti a StreamFontSource je naloženo na požádání a ihned zlikvidováno. Ale může být nabita několikrát, jak je popsáno výše. V některých případech MemoryFontSource je lepší, a v jiných, StreamFontSource.

Uložit a načíst vyhledávací Cache

Při hledání písma poprvé, Aspose.Words iteruje přes zdroje písma určené uživatelem a vytváří cache vyhledávání písma na základě dat z těchto zdrojů. Takto bude cache shromažďovat informace o dostupných písmech: rodina písem, styl, celé jméno písma a další. V následujících hovorech, Aspose.Words hledá informace o požadovaném fontu svým jménem v cache vyhledávání písma, po kterém rozebírá zadané soubory pro použití písma.

Postup pro analýzu všech dostupných souborů písma k inicializaci cache je poměrně časově náročné. Aspose.Words umožňuje uložit a načíst cache pomocí FontSettings.SaveSearchCache způsob řešení problému výkonu. To znamená, že uživatel může načíst dříve uložené cache ze souboru a přeskočit krok analýze všech dostupných souborů písma.

Získat seznam dostupných písem

Pokud chcete získat seznam dostupných písem, která mohou být použita například k vytvoření PDF dokumentu, můžete použít GetAvailableFonts metoda, jak je uvedena v následujícím příkladu kódu. The PhysicalFontInfo třída určuje informace o fyzickém písmu, které jsou k dispozici Aspose.Words font engine:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Get available system fonts
for (PhysicalFontInfo fontInfo : (Iterable<PhysicalFontInfo>) new SystemFontSource().getAvailableFonts()) {
System.out.println("FontFamilyName : " + fontInfo.getFontFamilyName());
System.out.println("FullFontName : " + fontInfo.getFullFontName());
System.out.println("Version : " + fontInfo.getVersion());
System.out.println("FilePath : " + fontInfo.getFilePath());
}
// Get available fonts in folder
for (PhysicalFontInfo fontInfo : (Iterable<PhysicalFontInfo>) new FolderFontSource(dataDir, true)
.getAvailableFonts()) {
System.out.println("FontFamilyName : " + fontInfo.getFontFamilyName());
System.out.println("FullFontName : " + fontInfo.getFullFontName());
System.out.println("Version : " + fontInfo.getVersion());
System.out.println("FilePath : " + fontInfo.getFilePath());
}
// Get available fonts from FontSettings
ArrayList<FolderFontSource> fontSources = new ArrayList(
Arrays.asList(FontSettings.getDefaultInstance().getFontsSources()));
// Convert the Arraylist of source back into a primitive array of FontSource
// objects.
FontSourceBase[] updatedFontSources = (FontSourceBase[]) fontSources
.toArray(new FontSourceBase[fontSources.size()]);
for (PhysicalFontInfo fontInfo : (Iterable<PhysicalFontInfo>) updatedFontSources[0].getAvailableFonts()) {
System.out.println("FontFamilyName : " + fontInfo.getFontFamilyName());
System.out.println("FullFontName : " + fontInfo.getFullFontName());
System.out.println("Version : " + fontInfo.getVersion());
System.out.println("FilePath : " + fontInfo.getFilePath());
}