[.NET] Как рисовать текст на принтере?

6yrop

Требуется печатать на принтере текст сложного формата. Поэтому нужно знать размеры текста, которые он будет занимать после печати. Но у класса Font нет метода, чтобы узнать ширину символа
Метод TextRenderer.MeasureText не совсем то, что нужно. Он не дает полного информации о размерах текста, например,

Size size1 = TextRenderer.MeasureText("Q", new Font("Arial", 12.0F;
Size size2 = TextRenderer.MeasureText("W", new Font("Arial", 12.0F;
Size size3 = TextRenderer.MeasureText("QW", new Font("Arial", 12.0F;

size3 не равен сумме size1 + size2, что вполне ожидаемо.
Какие еще есть способы рисования шрифтов на принтере?

6yrop

на самом деле требуется получить PDF, но если мы можем печатать на принтре, то PDF получить не проблема

Vodnik

а size3 вроде и не должен равнятся сумме первых двух

6yrop

как узнать ширину одного символа?

nattana

Ширину символа в каких единицах?
Ширина строки может не равняться сумме ширин символов этой строки.
Чтобы правильно нарисовать строку символов надо проделать следующее:
1. Нарисовать символ. (Если нужна именно длина, то только определить размеры)
2. Получить смещение до следующего символа.
3. Скорректировать смещение для пары символов.
Первые два шага делает функция GetGlyphOutline в win32 (в .net аналогов я не нашел). Она возвращает GLYPHMETRICS с параметрами смещения, размерами символа и смещение относительно "центра" символа. Плюс эта же функция может нарисовать символ в каком-нибудь виде.
Третий шаг делается функцией GetKernigPairs в win32 (в .net аналогов я не нашел которая возвпащает массив символов, которые следует смещать, если они печатаются рядом.
Собственно, это все, если нужна одна строка символов, если больше одной, тогда ещё две проблемы возникнут: пробелы между словами и расстояние между строками.
ЗЫ: Почему ты не хочешь делать сразу MeasureString?

6yrop

Спасибо, за ответ
Почему ты не хочешь делать сразу MeasureString?
как быть, если в строке текст разного формата?

Возможно даже часть слова другого формата.

kokoc88

как быть, если в строке текст разного формата?
Измерить одну часть, затем другую. И добавить расстояние между ними. В чём проблема-то?

nattana

Ага, ещё надо правильно по вертикали выровнять. Поюзав GetEmHeight, GetCellAscent, GetCellDescent, GetLineSpacing.
типа, вот (статья Obtain Font Metrics из мсдн):

6yrop

В чём проблема-то?
Два символа будут занимать расстояние раное сумме расстояний, занимаемых каждым из символов?
Как через MeasureString сделать второй и третий шаг, описанный выше.

kokoc88

Как через MeasureString сделать второй и третий шаг, описанный выше.
Ты хоть какие-то усилия к решению проблемы прилагаешь? Например, было бы неплохо почитать MSDN. В частности, про функции, о которых тебе написали. MeasureString тебе вернёт СРАЗУ ВЕСЬ прямоугольник, в котором рисуется строка.

nattana

Ты не понял. именно про рисование строки символов одним шрифтом, одним кеглем и одним стилем. В случае, если ты решил руками сам строку рисовать, в OpenGL, например.
Чтобы отобразить две строки разными шрифтами (кеглем, стилем) общего рецепта нет, нужно какое-то выравнивание по вертикали и по горизонтали. Попробуй в ворде по-разному повыравнивать: увидишь, что он пробелы изменяет. Да и если строка разным кеглем, то расстояние до другой строки тоже хз какое. Но все это к MeasureString уже отношения не имеет.
Кернинг тоже для разных кеглей не делается, как ты себе представляешь слово символами с разным кеглем?
Кстати, в GDI есть ещё пачка функций для форматирования символов и текста (GetCharWidth32 GetCharWidthFloat GetCharABCWidths GetCharABCWidthsFloat)
В Ворде если посмотришь можно кернингом управлять.
Оставить комментарий
Имя или ник:
Комментарий: