Есть ли фундаментальный недостаток в моем подходе [...]?
Да.
Вы берете размер panel1
, чтобы вычислить размер изображения.Позже вы позволите this
рисовать изображение, но this
- это форма, а не панель.
Что заставляет вас думать, что SystemInformation.WorkingArea
связано с окном, которое выхотите распечатать?
Вы должны позаботиться об одноразовых предметах.
[...] есть лиспособ переформатировать текст перед печатью, чтобы он получался четким?
Не существует общего способа, который позволил бы вам масштабировать и все остальные элементы управления.
Однако вместо этогоиз размытого текста вы можете получить четкий пиксельный текст, увеличив растровое изображение на определенный коэффициент с помощью механизма NearestNeighbor
.
Вот разница в PDF, сгенерированном без масштабирования (слева) и с коэффициентом 3 масштабирования(справа) при том же уровне масштабирования в Acrobat Reader (нажмите, чтобы увеличить):
Вот код масштабирования, также без устранения одноразовых проблем:
this.DrawToBitmap(img, bounds);
Point p = new Point(100, 100);
img = ResizeBitmap(img, 3);
e.Graphics.DrawImage(img, p);
}
private static Bitmap ResizeBitmap(Bitmap source, int factor)
{
Bitmap result = new Bitmap(source.Width*factor, source.Height*factor);
result.SetResolution(source.HorizontalResolution*factor, source.VerticalResolution*factor);
using (Graphics g = Graphics.FromImage(result))
{
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawImage(source, 0, 0, source.Width*factor, source.Height*factor);
}
return result;
}