Обзор
Многие форматы документов тесно связаны со шрифтами. Например, когда пользователь добавляет текст в документ DOCX, этот текст всегда имеет определённый шрифт. Некоторые форматы документов обычно сохраняют данные шрифта, встроенные непосредственно в файл документа, как PDF. Но другие, такие как форматы семейства Office, обычно полагаются на шрифты, установленные в операционной системе.
Существует также множество форматов шрифтов. Например, большинство установленных шрифтов представлены в форматах TTF (TrueType) и OTF (OpenType). Документы Office Open XML также работают с форматом EOT (Embedded OpenType). В вебе же наиболее часто используются форматы WOFF и WOFF2.
Содержание
- Обзор
- Получение всех используемых шрифтов
- Обработка отсутствующих шрифтов
- Указание отсутствующего шрифта
- Замена отсутствующего шрифта
- Исключение шрифтов при генерации HTML
- Заключение
- См. также
- Получить бесплатную пробную версию
Получение всех используемых шрифтов
Самой полезной функцией в контексте шрифтов является возможность перечислить их и получить список. GroupDocs.Viewer предоставляет специальный метод GetAllFonts() — когда документ загружен в экземпляр класса Viewer, вызовите этот метод, чтобы получить список всех шрифтов, использованных в документе. В возвращаемом списке каждый шрифт представлен как экземпляр типа, реализующего интерфейс IFontInfo. Этот интерфейс содержит общие свойства для любого шрифта: название семейства, стиль, формат и бинарное содержимое.
Конкретные семейства форматов, такие как WordProcessing, Spreadsheet, Presentation и PDF, имеют специализированные реализации IFontInfo; эти реализации предоставляют дополнительные данные, специфичные для конкретного семейства форматов. Например, типы WordProcessingFontInfo, PresentationFontInfo и PdfFontInfo содержат булево свойство IsEmbedded — флаг, указывающий, где хранится шрифт (встроен ли он в тело загруженного документа или установлен в ОС). Тип SpreadsheetFontInfo содержит множество данных, специфичных для таблиц: его цвет, наличие подчёркивания или зачёркивания. WordProcessingFontInfo может содержать альтернативное название семейства. И так далее.
Ниже приводится простой пример:
using GroupDocs.Viewer;
// ...
const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;
using (Viewer viewer = new Viewer(inputPath))
{
Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
foreach (Fonts.IFontInfo font in allFonts)
{
Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
font.FamilyName,
font.Style,
font.Content.Length,
font.Format);
}
}
Обратите внимание, что извлечение шрифтов поддерживается только для семейств форматов WordProcessing, Spreadsheet, Presentation и PDF; для всех остальных форматов метод GetAllFonts() возвращает пустой массив.
Обработка отсутствующих шрифтов
Ситуация, когда документ был создан на компьютере автора и использует шрифт «AAA», а затем обрабатывается с помощью GroupDocs.Viewer на компьютере клиента, где шрифт «AAA» отсутствует, типична. В таком случае GroupDocs.Viewer пытается подменить этот шрифт, используя сложные правила подстановки шрифтов: анализирует метаданные документа, альтернативные имена отсутствующего шрифта, настройки документа, параметры ОС, список всех доступных шрифтов, установленных в ОС, и т.д. Наконец, если по какой‑то причине ОС «чистая», то есть в ней нет установленных шрифтов, GroupDocs.Viewer подменит отсутствующий шрифт тем, который встроен в сборку GroupDocs.Viewer (DLL); этот шрифт будет служить «последней инстанцией» на случай, когда другие шрифты недоступны. Например, для форматов семейства WordProcessing GroupDocs.Viewer внутренне хранит бесплатный шрифт «Fanwood».
В текущей реализации GroupDocs.Viewer выполняет подстановку шрифтов «тихо», во время рендеринга документа (когда вызывается метод Viewer.View()) — нет никаких сообщений или событий, информирующих о том, что механизм подстановки активирован, какой шрифт отсутствует и на какой он заменён, и для какого конкретного документа. Такая функция сложна в реализации, потому что неочевидно, какие именно уведомления следует генерировать, в каком виде и как их использовать на стороне клиента.
Тем не менее GroupDocs.Viewer предлагает пользователям два возможных способа решения этой проблемы: вручную указать отсутствующий шрифт и вручную подменить его.
Указание отсутствующего шрифта
Если пользователь изначально знает, что документ использует шрифт «AAA», и также знает, что этот шрифт «AAA» не установлен на целевом компьютере, где документ будет рендериться, и пользователь имеет бинарное содержимое этого шрифта «AAA», он может указать его до вызова метода Viewer.View().
Чтобы указать один или несколько пользовательских шрифтов, которые не установлены в целевой операционной системе, пользователь должен добавить источники шрифтов. Источник шрифта — это фактически папка, в которой находятся один или несколько шрифтов. Он представлен классом FolderFontSource. Класс FontSettings имеет метод SetFontSources() для добавления источников шрифтов в GroupDocs.Viewer.
Ниже показан соответствующий фрагмент кода. Предположим, что документ «sample.docx» использует редкий шрифт «AAA.ttf», который не установлен в целевой ОС. Пользователь помещает файл «AAA.ttf» в папку C:\custom_fonts, затем создаёт экземпляр класса FolderFontSource, указывающий эту папку. Затем этот экземпляр передаётся статическому классу FontSettings, после чего файл «sample.docx» рендерится в HTML. В результате в выходном HTML‑документе будет использован шрифт «AAA».
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...
// Указываем источник шрифтов.
FolderFontSource fontSource =
new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);
using (Viewer viewer = new Viewer("sample.docx"))
{
// Создаём HTML‑файл.
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewer.View(viewOptions);
}
Замена отсутствующего шрифта
Если пользователь изначально знает, что документ использует шрифт «AAA», и также знает, что этот шрифт «AAA» не установлен на целевом компьютере, где документ должен быть отображён, но у него нет доступа к бинарному содержимому этого шрифта «AAA», он может указать другой шрифт «BBB», который будет использован вместо отсутствующего «AAA». В отличие от предыдущего случая, это делается через параметры просмотра, которые затем передаются методу Viewer.View().
Эта опция называется [DefaultFontName](https://reference.groupdocs.com/viewer/net/groupdocs.viewer.options/baseviewoptions/defaultfontname/), это свойство строкового типа, объявленное в абстрактном классе BaseViewOptions, поэтому оно доступно для всех вариантов рендеринга: HtmlViewerOptions, PdfViewOptions, PngViewOptions и JpgViewOptions.
Когда эта опция указана, GroupDocs.Viewer использует указанный шрифт во время рендеринга вместо любых недоступных шрифтов. Например, если документ содержит шрифт с нелатинскими символами, укажите имя шрифта по умолчанию, чтобы гарантировать, что GroupDocs.Viewer заменит любой отсутствующий шрифт на такой, у которого одинаковый набор символов. Конечно, шрифт, имя которого указано в свойстве DefaultFontName, должен быть установлен в операционной системе, где GroupDocs.Viewer выполняет рендеринг документа.
Ниже показан фрагмент кода, демонстрирующий установку имени шрифта по умолчанию:
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.pptx"))
{
// Создаём параметры рендеринга HTML‑документа с встроенными ресурсами
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
// Указываем имя шрифта по умолчанию в параметрах
viewOptions.DefaultFontName = "Courier New";
// Рендерим входной PPTX в выходной HTML
viewer.View(viewOptions);
}
Исключение шрифтов при генерации HTML
При рендеринге документов в формат HTML GroupDocs.Viewer по умолчанию экспортирует все использованные шрифты в HTML‑документ. Это обеспечивает корректное отображение независимо от наличия требуемых шрифтов на устройстве просмотра. Шрифты могут храниться в результирующем HTML‑документе как внешние ресурсы (HtmlViewOptions.ForExternalResources) или быть встроенными непосредственно в разметку HTML с помощью схемы data URI через кодирование base64 (HtmlViewOptions.ForEmbeddedResources). Экспорт шрифтов в HTML поддерживается практически всеми форматами документов, поддерживающими шрифты: Microsoft Office (кроме Excel), форматы OpenDocument, электронные письма, PDF, электронные книги и т.д.
Однако иногда эта функция нежелательна. На практике, когда шрифты включены, они существенно увеличивают размер получаемого HTML‑документа. Поэтому, если на целевой машине или устройстве, где должен отображаться HTML‑документ, уже установлены все используемые шрифты, браузер может использовать эти системные шрифты.
Для удовлетворения такой потребности GroupDocs.Viewer позволяет исключать шрифты из генерируемого HTML‑документа, и это можно сделать двумя способами: исключить все шрифты и исключить только конкретные шрифты.
Обе эти опции представлены в классе HtmlViewOptions различными свойствами:
ExcludeFonts— флаг, отключающий экспорт всех использованных шрифтов в результирующий HTML‑документ, когда установлен (true). По умолчанию опция выключена (false).FontsToExclude— список строк, каждая из которых представляет имя шрифта, который следует исключить из генерируемого HTML‑документа. По умолчанию список пуст — никакие шрифты не исключаются. Обратите внимание, что эта опция работает только если свойствоExcludeFontsвыключено (false).
Ниже показаны два фрагмента кода, демонстрирующие обе возможности: первый использует ExcludeFonts, второй — FontsToExclude.
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.docx"))
{
// Создаём HTML‑файл.
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.ExcludeFonts = true;
viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("presentation.pptx"))
{
// Создаём HTML‑файл.
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.FontsToExclude.Add("Times New Roman");// Исключаем шрифт Times New Roman.
viewOptions.FontsToExclude.Add("Arial");// Исключаем шрифт Arial.
viewer.View(viewOptions);
}
Заключение
GroupDocs.Viewer в первую очередь ориентирован на рендеринг документов различных форматов в широко используемые “просматриваемые” форматы — HTML, PDF, JPEG и PNG. Но за последнее время мы добавили несколько полезных функций, связанных с обработкой шрифтов, которые позволяют просматривать и анализировать используемые шрифты, настраивать их экспорт и управлять подстановкой шрифтов.
См. также
- Получение всех используемых шрифтов в загруженном документе
- Установка пользовательских шрифтов
- Замена отсутствующего шрифта
- Исключение шрифтов при рендеринге в HTML
Получить бесплатную пробную версию
Вы можете скачать бесплатную пробную версию GroupDocs.Viewer для .NET с сайта releases.groupdocs.com. Вы также можете получить временную лицензию, чтобы испытать все функции и возможности без ограничений, перейдя сюда.