Компонент StiText и наследуемые от него компоненты имеют свойство TextQuality. Это свойство позволяет выбрать режим/качество отображения текста. Свойство может принимать одно из трех значений:
Standard,
Typographic,
Wysiwyg.
В режимах Standard и Typographic отображение текста производится с помощью системной библиотеки GDI+. Отличие этих режимов в том, что в режиме Typographic текст выводится со сглаживанием (antialiasing) и выглядит красивее, но отрисовка производится медленнее. В режиме Wysiwyg отображение текста производится с помощью системной библиотеки GDI. Текст в этом режиме может выглядеть не так красиво, как в других двух.
Зачем нужен GDI, если уже давно есть GDI+, который более красивый и простой в использовании? Чтобы ответить на этот вопрос, обратимся к определению термина WYSIWYG. WYSIWYG (сокращение от What You See Is What You Get, англ. что видишь, то и получишь) — способ редактирования, при котором редактируемый материал в процессе редактирования выглядит в точности так же, как и конечный результат. Применительно к генератору отчетов это означает, что отчет должен выглядеть одинаково и при редактировании шаблона, и при просмотре готового отчета, и распечатанный на бумаге. Однако на практике не все так просто. Многие методы отображения текста могут по-разному показывать текст на разных мониторах и по-разному распечатывать его на разных принтерах. Особенно хорошо это заметно на больших текстах: при просмотре во вкладке Просмотр с разными масштабами и при печати на принтере переносы строк могут располагаться в разных местах. Это связано со многими причинами. В системной библиотеке GDI+ большинство этих проблем уже решено, но не все, и иногда неточности отображения еще встречаются. Для решения оставшихся проблем нужен полный контроль над выводом текста. GDI+ не дает такого контроля. Поэтому и был добавлен режим Wysiwyg, который выводит текст с использованием GDI. Методы GDI позволяют контролировать вывод каждого символа текста, что позволяет ликвидировать почти все проблемы. Таким образом, режим Wysiwyg выводит текст не так красиво, как два остальных метода, но более точно.
Есть еще одно различие между этими режимами: так как текст в каждом режиме выводится по разному, то и измерение длины строки производится по разному. Например, возьмем три текстбокса с текстом "Test string"; у первого установим TextQuality в Standard, у второго в Typographic, у третьего в Wysiwyg. У всех текстбоксов установим свойство AutoWidth в значение true. В режиме дизайна отчета мы получим следующее:
На глаз разница между этими строками не очень заметна. Однако после построения отчета, когда ширина текстовых компонентов будет рассчитана в зависимости от ширины текста, мы сразу заметим разницу между используемыми методами:
На приведенном изображении хорошо видно, что для разных типов и размеров шрифтов получаются совершенно разные результаты. Это надо учитывать, например, если вы собираетесь использовать компонент Cross-Tab: в этом компоненте ширина колонок таблицы подгоняется под текст, и при разных режимах ширина таблицы может довольно сильно меняться.
TextQuality и экспорты в MS-Office
Приложения из пакета MS-Office используют свой собственный метод отображения текста. Он не похож ни на GDI, ни на GDI+. Соответственно нельзя заранее рассчитать, как будет выглядеть текст. Довольно часто встречается ситуация, когда на вкладке Просмотр текст замечательно помещается в ячейку, а в полученном экспортированном файле последняя буква не помещается на одну точку, и все слово переносится на следующую строку. Также, как показывает практика, WYSIWYG в этих приложениях часто работает некорректно. Например, ваш отчет в EXCEL в режиме редактирования и в предпросмотре печати может выглядеть по-разному. Ещё больше различий вы увидите, если в режиме редактирования начнете менять масштаб страницы от 50% до 200%: при масштабе 100% текст может помещаться в ячейку, при 50% не доходить до края ячейки, а при 200% последнее слово может переноситься на следующую строку. Другой пример - это многострочный текст: при разном масштабе не всегда верно рассчитывается межстрочный интервал, и высота текста в ячейке может меняться. При одном масштабе в ячейку могут не поместиться все строки текста, т.е. текст обрезается. При другом масштабе этот же текст может сжаться, и снизу ячейки останется пустое место. Даже команда Excel "Автоподбор высоты строки" может выдавать непредсказуемые результаты, особенно на мелких шрифтах.
Поэтому при экспорте отчетов в MS-Office мы рекомендуем использовать некоторые приемы, описанные ниже. Рекомендации можно условно разделить на две части: общие рекомендации по подготовке отчетов и рекомендации для каждого конкретного экспорта.
Общие рекомендации по экспорту отчетов в MS-Office относятся к дизайну шаблона отчета:
постарайтесь по возможности всегда оставлять зазор между концом строки и краем текстбокса; в этом случае проблемы не должны возникнуть;
вытекает из предыдущего пункта: не используйте без особой надобности свойство AutoWidth, так как размер текстбокса в этом случае вычисляется без зазора;
подберите для текста такое значение TextQuality, чтобы строка текста получалась наиболее длинной; это повысит вероятность того, что текст после экспорта будет отображаться нормально.
Рекомендации по экспорту отчетов в MS-Word
При экспорте в MS-Word применяется следующая уловка: для каждой строки текста устанавливается уплотнение шрифта. Величина плотности шрифта измеряется в единицах twips и хранится в статическом свойстве StiOptions.Export.Rtf.SpaceBetweenCharacters (StiOptions.Export.Word2007.SpaceBetweenCharacters). По умолчанию значение свойства установлено в -2. На глаз эта величина сжатия текста не заметна, но для большинства случаев её достаточно. При необходимости эту величину можно изменить. Нулевое значение свойства соответствует нормальному шрифту, положительные значения соответствуют разреженному шрифту.
Рекомендации по экспорту отчетов в MS-Excel
При экспорте в MS-Excel применяется следующая уловка: для всех проблемных текстбоксов рекомендуется установить правую или/и левую границу текстбокса. Ячейки таблицы в Excel не имеют границ, поэтому граница будет учитываться только при рендеринге текстбокса как гарантированный зазор. Граница текстбокса задается свойством Margins, величина указывается в сотых дюйма. Для большинства случаев достаточно установить правую границу равной 1 сотой дюйма (записать в свойство 0;1;0;0).