Резервные шрифты и вертикальный текст
HotPDF может выбирать резервные начертания по скрипту Unicode, сообщать о кодовых точках, оставшихся неразрешёнными, и выводить CJK-текст через настоящий режим вертикального CID-письма
Цепочки резерва на уровне документа
THotPDF.SetFontFallbackChain сохраняет упорядоченный список начертаний для одной категории THPDFFontScript
THPDFPage.TextOutWithFallback разрешает каждый скаляр Unicode относительно выбранного начертания, его цепочки по скрипту и общей цепочки, а затем выводит смежные скаляры с тем же начертанием как один текстовый проход
- Цепочки резерва являются параметрами документа и остаются доступными для всех страниц
- Повторяющиеся и пустые имена начертаний удаляются, а порядок вызывающего кода сохраняется
- Проверка установленных начертаний отклоняет тихую подстановку GDI перед приёмом покрытия
- Скаляры дополнительной плоскости декодируются из суррогатных пар UTF-16 перед классификацией
- Каждый резервный проход использует существующий встроенный шрифт Type0, поднабор,
ToUnicodeи общий межстраничный путь к шрифту - Резервная вёрстка проверяет установленные семейства шрифтов с запрошенным начертанием bold и italic, сохраняет все настройки стиля шрифта, кодировки, размера и направления письма между проходами и возвращает исходный шрифт вызывающего кода по завершении
Практичная диагностика
AnalyzeUnresolvedGlyphs выполняет проверку покрытия только для чтения, тогда как TextOutWithFallback записывает неразрешённые скаляры, встреченные при выводе
Каждая запись THPDFUnresolvedGlyphInfo содержит кодовую точку скаляра, основное начертание, классифицированный скрипт и разделённый точками с запятой список предложений резерва
GetUnresolvedGlyphs возвращает текущий отчёт документа, а ClearUnresolvedGlyphs начинает новый интервал отчёта
Перегрузки с явным стилем THotPDF.ResolveFontForCodePoint и THotPDF.AnalyzeUnresolvedGlyphs принимают TFontStyles, так что preflight может проверить то же начертание, что используется при выводе; их исходные перегрузки по-прежнему проверяют regular-начертания
Текстовые блоки, встроенный SVG-текст и appearance загруженного текста сохраняют стилизованные семейства шрифтов при резервной вёрстке, а не трактуют внутренние имена PDF-шрифтов как системные семейства и не переключают все проходы на regular-начертание
Вертикальное CJK-письмо
THPDFPage.TextOutVertical выбирает вертикальный вариант текущего начертания и выводит один текстовый проход Identity-V вместо позиционирования каждого знака вручную
- Потомок CID-шрифта содержит
/DW2дефолты и специфичные для глифов/W2записи - OpenType
vheaиvmtxпоставляют вертикальные продвижения и верхние side bearing; origins TrueType выводятся изglyfbounding box, аVORGподаёт авторитетные дефолты и исключения origin CFF - Шрифты без вертикальных таблиц используют настраиваемые дефолты продвижения 1000 единиц и origin 880 единиц
- С
sfVerticalAlternatesполный GSUB-проход с сохранением длины используетvrt2когда он объявлен, иначе откатывается кvert, сохраняя активный выбор письменности и языка - Когда шрифт опускает подстановку пунктуации, но отображает вертикальные формы представления Unicode, запятые, точки, скобки, тире, многоточия и связанная пунктуация используют эти глифы, при этом
ToUnicodeсохраняет исходный текст - Вертикальные
vkrnиvpalGPOS-фичи остаются доступны черезShapingFeatures GetVerticalTextAdvanceвозвращает продвижение в user-space, нужное для позиционирования следующего вертикального фрагмента
Пример
PDF.SetFontFallbackChain(hfsCJK,
['Microsoft YaHei UI', 'Yu Gothic UI', 'Malgun Gothic']);
PDF.SetFontFallbackChain(hfsEmoji, ['Segoe UI Emoji']);
PDF.CurrentPage.SetFont('Arial', [], 12);
PDF.CurrentPage.TextOutWithFallback(72, 72, 0, Text);
PDF.CurrentPage.SetFont('Yu Gothic UI', [], 14);
PDF.CurrentPage.TextOutVertical(420, 72, VerticalText);
Missing := PDF.GetUnresolvedGlyphs;