Я создаю квитанцию и использую объект Graphics для вызова метода DrawString для печати требуемого текста.
graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat);
Это прекрасно работает для того, что мне нужно. Я всегда знал, что я печатаю, поэтому я мог бы вручную обрезать любые строки, чтобы он правильно поместился на 80-миллиметровой квитанционной бумаге. Затем мне пришлось добавить дополнительный бит функциональности, который сделает его более гибким. Пользователь может передать строки, которые будут добавлены к нижней части.
Так как я не знал, что они собираются поставить, я просто создал свою собственную функцию переноса слов, которая принимает несколько символов для обертывания и самой строки. Чтобы узнать количество символов, я делал что-то вроде этого:
float width = document.DefaultPageSettings.PrintableArea.Width;
int max = (int)(width / graphics.MeasureString("a", font).Width);
Теперь ширина возвращает мне 283, что в мм составляет около 72, что имеет смысл, когда вы учитываете поля на бумаге 80 мм.
Но метод MeasureString возвращает 10.5 шрифта Courier New 8pt. Поэтому вместо того, чтобы обойти то, что я ожидал от 36 до 40, мне становится 26, в результате 2 строки текста превращаются в 3-4.
Единицы для PrintableArea.Width - это 1/100-дюймовый дюйм, а объект PageUnit для графического объекта - это дисплей (который, как правило, составляет 1/100-дюймовый дюйм для принтеров). Так почему я только получаю 26 назад?