Иван
23.04.2025
Есть программа в которой отображаются панели с текстом, затем эти панели А4 отправляются на печать, но текст получается нечетким, скорее всего дело в DPI, но исправить не получилось самостоятельно, можете пожалуйста помочь. Часть кода ниже, сами значения: const int WidthA4Inches = 827;
const int HeightA4Inches = 1169;
Операционная система: Windows
Статус: вопрос решён
Вячеслав
клиент
23.04.2025
Иван, проблема вашего кода заключается в неправильном расчете размеров панели. Вы используете преобразование дюймов в пиксели с фиксированным коэффициентом (делите на 96), предполагая стандартный DPI монитора, что неверно отражает реальную плотность точек принтера. Как вариант, можете попробовать следующее:
// Размеры страницы формата A4 в дюймах
const double WidthA4Inches = 8.27; // ширина листа A4 в дюймах
const double HeightA4Inches = 11.69; // высота листа A4 в дюймах
// Расчет ширины и высоты панели в пикселях с учетом реального DPI принтера
panelA4 = new Panel
{
BackColor = Color.White,
BorderStyle = BorderStyle.FixedSingle,
Size = new Size(
(int)(WidthA4Inches * printerDpiX), // Ширина в пикселях
(int)(HeightA4Inches * printerDpiY)), // Высота в пикселях
Anchor = AnchorStyles.None
};
Здесь printerDpiX и printerDpiY будут отвечать за горизонтальное и вертикальное разрешение принтера.
Иван
клиент
23.04.2025
Вячеслав, а каким образом задать значения для printerDpiX и printerDpiY?
Вячеслав
клиент
23.04.2025
Иван, можно так, код для определения реальных DPI устройства печати:
PrintDocument pd = new PrintDocument();
pd.PrintController = new StandardPrintController(); // контроллер печати по умолчанию
Graphics g = pd.CreateMeasurementGraphics(); // временный Graphics объект для измерения DPI
int printerDpiX = (int)g.DpiX; // горизонтальное разрешение принтера
int printerDpiY = (int)g.DpiY; // вертикальное разрешение принтера
g.Dispose(); // освобождаем ресурсы
и далее можете интегрировать код выше
Иван
клиент
23.04.2025
Вячеслав, понял, спасибо
Чтобы комментировать, необходимо авторизоваться или зарегистрироваться.
Все советы и рекомендации, размещённые на форуме, носят исключительно информационный характер и не являются официальной инструкцией.
Перед применением любых советов убедитесь в их актуальности и безопасности для вашей конкретной ситуации. Правила форума.