Использование C # для печати больших изображений на нескольких страницах - PullRequest
3 голосов
/ 11 июля 2009

Я пытаюсь написать код, который будет печатать большое изображение (ширина 1200 x 475) на нескольких страницах.

Я попытался разбить изображение на три прямоугольника (разделив ширину на три) и трижды вызвал e.Graphics.DrawImage, но это не работает.

Если я укажу большое изображение на одной странице, оно будет работать, но как мне разбить изображение на несколько страниц?

1 Ответ

3 голосов
/ 11 июля 2009

Хитрость заключается в том, чтобы получить каждую часть изображения на отдельной странице, и это делается в событии 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, прежде чем снова печатать документ (например, если вы хотите распечатать документ после показа предварительного просмотра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...