Настройка шрифтов PowerPoint в PHP
Aspose Slides позволяет загружать эти шрифты с помощью метода loadExternalFonts:
Загрузка пользовательских шрифтов
Aspose.Slides позволяет загружать шрифты, используемые в презентации, без их установки в системе. Это влияет на вывод при экспорте — например PDF, изображения и другие поддерживаемые форматы — так что получающиеся документы выглядят одинаково в разных средах. Шрифты загружаются из пользовательских каталогов.
- Укажите одну или несколько папок, содержащих файлы шрифтов.
- Вызовите статический метод FontsLoader::loadExternalFonts для загрузки шрифтов из этих папок.
- Загрузите и отрендерите/экспортируйте презентацию.
- Вызовите FontsLoader::clearCache для очистки кеша шрифтов.
Следующий пример кода демонстрирует процесс загрузки шрифтов:
// Определите папки, содержащие пользовательские файлы шрифтов.
$fontFolders = array($externalFontFolder1, $externalFontFolder2);
// Загрузите пользовательские шрифты из указанных папок.
FontsLoader::loadExternalFonts($fontFolders);
$presentation = null;
try {
$presentation = new Presentation("sample.pptx");
// Отрендерите/экспортируйте презентацию (например, в PDF, изображения или другие форматы), используя загруженные шрифты.
$presentation->save("output.pdf", SaveFormat::Pdf);
} finally {
if ($presentation != null) $presentation->dispose();
// Очистите кэш шрифтов после завершения работы.
FontsLoader::clearCache();
}
Note
FontsLoader::loadExternalFonts добавляет дополнительные папки в пути поиска шрифтов, но не меняет порядок инициализации шрифтов. Шрифты инициализируются в следующем порядке:
- Путь шрифтов операционной системы по умолчанию.
- Пути, загруженные через FontsLoader.
Получить пользовательские папки шрифтов
Aspose.Slides предоставляет метод getFontFolders для поиска папок с шрифтами. Этот метод возвращает папки, добавленные через метод LoadExternalFonts, и системные папки шрифтов.
Этот PHP‑код показывает, как использовать getFontFolders:
# Эта строка выводит папки, в которых ищутся файлы шрифтов.
# Это папки, добавленные через метод LoadExternalFonts, и системные папки шрифтов.
$fontFolders = FontsLoader->getFontFolders();
Указание пользовательских шрифтов, используемых в презентации
Aspose.Slides предоставляет метод setDocumentLevelFontSources для указания внешних шрифтов, которые будут использоваться с презентацией.
Этот PHP‑код показывает, как использовать метод setDocumentLevelFontSources:
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = new JavaClass("java.lang.Byte");
$file1 = new Java("java.io.File", "customfonts/CustomFont1.ttf");
$memoryFont1 = $Array->newInstance($Byte, $Array->getLength($file1));
try {
$dis1 = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", $file1));
$dis1->readFully($memoryFont1);
} finally {
if (!java_is_null($dis1)) $dis1->close();
}
$file2 = new Java("java.io.File", "customfonts/CustomFont2.ttf");
$memoryFont2 = $Array->newInstance($Byte, $Array->getLength($file2));
try {
$dis2 = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", $file2));
$dis2->readFully($memoryFont2);
} finally {
if (!java_is_null($dis2)) $dis2->close();
}
$loadOptions = new LoadOptions();
$loadOptions->getDocumentLevelFontSources()->setFontFolders(array("assets/fonts", "global/fonts" ));
$loadOptions->getDocumentLevelFontSources()->setMemoryFonts(array($memoryFont1, $memoryFont2 ));
$pres = new Presentation("MyPresentation.pptx", $loadOptions);
try {
# Работа с презентацией
# CustomFont1, CustomFont2 и шрифты из папок assets\fonts & global\fonts, а также их подпапок доступны в презентации
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Управление шрифтами извне
Aspose.Slides предоставляет метод loadExternalFont(byte[] data) для загрузки внешних шрифтов из бинарных данных.
Этот PHP‑код демонстрирует процесс загрузки шрифта из массива байтов:
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "ARIALN.TTF"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
FontsLoader->loadExternalFont($bytes);
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "ARIALNBI.TTF"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
FontsLoader->loadExternalFont($bytes);
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "ARIALNI.TTF"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
FontsLoader->loadExternalFont($bytes);
try {
$pres = new Presentation("");
try {
# внешний шрифт загружен в течение жизни презентации
} finally {
}
} finally {
FontsLoader->clearCache();
}
FAQ
Влияют ли пользовательские шрифты на экспорт во все форматы (PDF, PNG, SVG, HTML)?
Да. Подключённые шрифты используются рендерером во всех форматах экспорта.
Встраиваются ли пользовательские шрифты автоматически в полученный PPTX?
Нет. Регистрация шрифта для рендеринга не равна его встраиванию в PPTX. Если нужен шрифт внутри файла презентации, необходимо использовать явные возможности встраивания.
Можно ли управлять поведением fallback, когда у пользовательского шрифта отсутствуют некоторые глифы?
Да. Настройте замену шрифтов, правила замены и наборы fallback, чтобы точно определить, какой шрифт использовать при отсутствии запрашиваемого глифа.
Можно ли использовать шрифты в Linux/Docker‑контейнерах без их установки в системе?
Да. Укажите свои папки со шрифтами или загружайте шрифты из массивов байтов. Это устраняет любую зависимость от системных каталогов шрифтов в образе контейнера.
А как насчёт лицензирования — можно ли встраивать любой пользовательский шрифт без ограничений?
Вы отвечаете за соблюдение лицензий шрифтов. Условия различаются; некоторые лицензии запрещают встраивание или коммерческое использование. Всегда проверяйте EULA шрифта перед распространением результатов.