Хитрость заключается в том, чтобы получить каждую часть изображения на отдельной странице, и это делается в событии PrintPage
события PrintDocument
.
Я думаю, что самый простой подход - разделить изображение на отдельные изображения, по одному на каждую страницу. Я предполагаю, что вы уже можете справиться с этим (если вы попытаетесь разбить изображение на части; то же самое, просто поместите их на отдельные изображения). Затем мы создаем экземпляр PrintDocument, подключаем событие PrintPage и идем:
private List<Image> _pages = new List<Image>();
private int pageIndex = 0;
private void PrintImage()
{
Image source = new Bitmap(@"C:\path\file.jpg");
// split the image into 3 separate images
_pages.AddRange(SplitImage(source, 3));
PrintDocument printDocument = new PrintDocument();
printDocument.PrintPage += PrintDocument_PrintPage;
PrintPreviewDialog previewDialog = new PrintPreviewDialog();
previewDialog.Document = printDocument;
pageIndex = 0;
previewDialog.ShowDialog();
// don't forget to detach the event handler when you are done
printDocument.PrintPage -= PrintDocument_PrintPage;
}
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
// Draw the image for the current page index
e.Graphics.DrawImageUnscaled(_pages[pageIndex],
e.PageBounds.X,
e.PageBounds.Y);
// increment page index
pageIndex++;
// indicate whether there are more pages or not
e.HasMorePages = (pageIndex < _pages.Count);
}
Обратите внимание, что вам потребуется сбросить pageIndex на 0, прежде чем снова печатать документ (например, если вы хотите распечатать документ после показа предварительного просмотра).