Печать по оси X: начальная позиция не точна - есть ли значение / функция для оси X? - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема с

e.Graphics.DrawString(TextToPrint, Font, Brush, New RectangleF(StartPositionX, StartPositionY, Width, Height))

Допустим, я хочу напечатать "Hello World" в Arial-20pt при 25 мм по оси X от левого края.Кроме того, я использую версию с Arial-50pt.

Для этого я устанавливаю

e.Graphics.PageUnit = GraphicsUnit.Millimeter

и

PrintDocument.OriginAtMargins = False

Я печатаю PDF через "PDFCreator" ииспользуйте измерительный инструмент Acrobat Reader.

Положение на оси Y является желаемым.Проверьте!

"H" начинается примерно с 26,6 мм (Arial-20pt) / 29,3 мм (Arial-50pt).

Поэтому я также печатаю прямоугольник в тех же начальных точках с помощью

e.Graphics.FillRectangle

и залейте его зеленым.

Этот прямоугольник начинается с 25 мм !!

Так что я предполагаю, что вокруг текста есть своего рода поле.На оси Y можно найти самую низкую точку «H» с помощью «CellAscent».

Есть ли значение / функция для оси X?

Вот мой код:

e.Graphics.PageUnit = GraphicsUnit.Millimeter
PrintDocument.OriginAtMargins = False

TextToPrint = "Hello World"
Font = New Font("Arial", 20)
Brush = Brushes.Black
StartPositionX = 25
StartPositionY = 30
Width = 50
Height = 60

Я хочу использовать точную позицию первого левого нижнего пикселя буквы «H» в качестве отправной точки.Для оси Y это работает:

CellAscent = Font.Size * CSng(Font.FontFamily.GetCellAscent(Font.Style)/ Font.FontFamily.GetEmHeight(Font.Style))

StartPositionY = StartPositionY - CellAscent

После этой настройки я использую

e.Graphics.DrawString(TextToPrint, Font, Brush, New RectangleF(StartPositionX, StartPositionY, .Width, .Height))

Example

1 Ответ

0 голосов
/ 11 октября 2018

Решено

C # Рендеринг символов шрифта (ошибка GDI)

"Чтобы избежать этих проблем, выполните следующие действия:

Всегда передавайте MeasureString иDrawString объект StringFormat, основанный на типографском StringFormat (GenericTypographic). -And- Установить для графики TextRenderingHint значение TextRenderingHintAntiAlias.

Эти меры отключают дополнительные 1/6 em, добавляемые в конце цикла, во избежание проблем подгонки сетки при помощииспользование сглаживания и субпиксельного позиционирования глифа, и в результате получается идеально масштабируемый текст "(из: http://support.microsoft.com/kb/307208)

DrawString(myText, myFont, myBrush, myPoint, StringFormat.GenericTypographic)
...