Имеется принтер карточек Zebra p430i, программа на .NET, которая должна на нем печатать и проблема с выравниванием текстов, которая заключается в следующем:
есть несколько текстов, выровненных по правому краю в области с 10 до 50 мм, тексты печатаются разными стилями и шрифтами, при этом правые края текстов должны находиться на одном уровне, а в реальности наблюдается смещение от миллиметра до 2-х, зависит от шрифтов и стилей… Выравнивать пытался как средствами принтера, так и средствами объекта Graphics, созданного из графического контекста принтера, результатов ноль… Ну и соответственно вопрос — можно ли как-нибудь узнать точные размеры строки, которая будет напечатана, чтобы внести поправки при печати, или как-то выровнять текст попиксельно? Желательно при этом не лезть в дебри шрифтов… Уже пробовал вырианты с MeasureString и MeasureCharacterRanges, размер получается лишь приблизительный…
Вы уверены, что всё делаете правильно? Я как-то решал похожую задачу и таких проблем не было. Попробуйте нарисовать макет на форме/пенели и посмотреть останется ли смещение?
Если да, то дело видимо в особенностях шрифтов, в этом случае можете пробовать вручную найти отступ текста относительно левого края и скорректировать позицию.
Если нет, то смотрите параметры хинтинга и всяких улучшайзеров принтера.
Для рисования лайоута на форме сейчас используется хак в виде рисования текста на временном битмапе, идентичным по размеру с лайоутом, и поиском на нем первого пикселя, отличающегося по цвету от фона. Отсюда получается смещение, на которое двигается текст при отрисовке, и в итоге рисуется все нормально. А при печати так сделать не получится — размер напечатанного текста отличается от размера нарисованного на битмапе.
Т.е. вы хотите печатать не через виндовый драйвер, а с помощью команд принтера? Если так, то очень странно измерять длинну текста с помощью .NET функций… Проблема возникает со стандартными шрифтами принтера?
У принтера есть SDK, текст сейчас печатается через него. Если можно настроить нормально сглаживание и печать черного через .NET, буду только рад узнать как.
Конкретно с этим принтером я не сталкивался. Работал с другим, тоже Zebra для печати этикеток, так вот он очень душевно подчинялся командам EPL. Это конечно сложнее чем SDK, но зато полный контроль над процессом.
А вообще напишите в саппорт Зебры, там должны подсказать правильный путь.
От шрифтов на самом деле очень много зависит, моноширинные шрифты, например, кроме самой буквы учитывают так же и промежуток в расчетах ширины, тоесть та же точка будет иметь ширину буквы ш, и от этого никуда не деться =)
технически можете найти попиксельно =) края руками, но это великий костыль, вообще как в C# это делается я не вкурсе, просто написал одну из особенностей шрифтов