VintaSoft Imaging .NET SDK 15.2: Документация для .NET разработчика
В этом разделе
Печать изображений с помощью System.Drawing
В этом разделе
UI-контрол ImagePrintDocument, который является производным от UI-контрола System.Drawing.Printing.PrintDocument, используется для печати и предварительного просмотра изображений в WinForms.
По умолчанию UI-контрол ImagePrintDocument печатает все изображение без масштабирования, изображение делится на страницы, если все изображение не может быть напечатано на одной странице.
Также UI-контрол позволяет масштабировать изображение при печати, режим масштабирования можно выбрать с помощью свойства ImagePrintDocument.PrintScaleMode.
Поддерживаются следующие режимы масштабирования изображения:

Перед началом печати можно задать поля для всех страниц, выбранных для печати, с помощью диалога System.Windows.Forms.PageSetupDialog.

В процессе печати поля для печатаемой страницы можно задать в обработчике события System.Drawing.Printing.PrintDocument.PrintPage с помощью свойства Margins класса System.Drawing.Printing.PageSettings.

Изображение можно центрировать на странице при печати с помощью свойства ImagePrintDocument.Center.


UI-контрол ImagePrintDocument использует стандартный диалог настроек WinForms, реализованный в классе System.Windows.Forms.PrintDialog, для выбора устройства печати и настройки параметров печати.


Во время печати UI-контрол ImagePrintDocument генерирует набор событий, которые позволяют получать подробную информацию о процессе печати и контролировать все аспекты печати:
Вот C#/VB.NET код, который демонстрирует, как распечатать коллекцию изображений с настройками печати по умолчанию, каждое изображение из коллекции будет напечатано на отдельной странице, каждое изображение будет масштабировано на странице в режиме BestFit:

Vintasoft.Imaging.ImageCollection _printingImages;
int _printingImageIndex;

public void PrintImagesOnDefaultPrinter(Vintasoft.Imaging.ImageCollection images)
{
    // save information about printing image collection in global variable
    _printingImages = images;
    _printingImageIndex = 0;

    // create print manager
    Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
        new Vintasoft.Imaging.Print.ImagePrintDocument();
    // specify that each image must be resized to fit within the page margins,
    // image proportions are not changed
    imagePrintDocument.PrintScaleMode = Vintasoft.Imaging.Print.PrintScaleMode.BestFit;

    // subscribe to the PrintImage event
    imagePrintDocument.PrintImage +=
        new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImage);

    // start print
    imagePrintDocument.Print();
}

private void imagePrintDocument_PrintImage(object sender, Vintasoft.Imaging.Print.PrintImageEventArgs e)
{
    e.Image = _printingImages[_printingImageIndex];

    _printingImageIndex++;

    if (_printingImageIndex >= _printingImages.Count)
    {
        Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
            (Vintasoft.Imaging.Print.ImagePrintDocument)sender;
        // unsubscribe from the PrintImage event
        imagePrintDocument.PrintImage -=
            new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImage);
        // indicate that there is no more images to print
        e.HasMoreImages = false;
    }
    else
    {
        // indicate that there are additional images to print
        e.HasMoreImages = true;
    }
}
Private _printingImages As Vintasoft.Imaging.ImageCollection
Private _printingImageIndex As Integer

Public Sub PrintImagesOnDefaultPrinter(images As Vintasoft.Imaging.ImageCollection)
    ' save information about printing image collection in global variable
    _printingImages = images
    _printingImageIndex = 0

    ' create print manager
    Dim imagePrintDocument As New Vintasoft.Imaging.Print.ImagePrintDocument()
    ' specify that each image must be resized to fit within the page margins,
    ' image proportions are not changed
    imagePrintDocument.PrintScaleMode = Vintasoft.Imaging.Print.PrintScaleMode.BestFit

    ' subscribe to the PrintImage event
    AddHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImage)

    ' start print
    imagePrintDocument.Print()
End Sub

Private Sub imagePrintDocument_PrintImage(sender As Object, e As Vintasoft.Imaging.Print.PrintImageEventArgs)
    e.Image = _printingImages(_printingImageIndex)

    _printingImageIndex += 1

    If _printingImageIndex >= _printingImages.Count Then
        Dim imagePrintDocument As Vintasoft.Imaging.Print.ImagePrintDocument = DirectCast(sender, Vintasoft.Imaging.Print.ImagePrintDocument)
        ' unsubscribe from the PrintImage event
        RemoveHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImage)
        ' indicate that there is no more images to print
        e.HasMoreImages = False
    Else
        ' indicate that there are additional images to print
        e.HasMoreImages = True
    End If
End Sub



Вот C#/VB.NET код, который демонстрирует, как выбрать принтер, запустить печать коллекции изображений иотменить печать после того, как будет напечатана первая половина коллекции изображений:

Vintasoft.Imaging.ImageCollection _printingImages;
int _printingImageIndex;

public void PrintImagesAndCancel(Vintasoft.Imaging.ImageCollection images)
{
    // save information about printing image collection in global variable
    _printingImages = images;
    _printingImageIndex = 0;

    // create print manager
    Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
        new Vintasoft.Imaging.Print.ImagePrintDocument();
    // specify that each image must be resized to fit within the page margins,
    // image proportions is not changed
    imagePrintDocument.PrintScaleMode = Vintasoft.Imaging.Print.PrintScaleMode.BestFit;

    // create an instance of PrintDialog class
    System.Windows.Forms.PrintDialog printDialog1 =
        new System.Windows.Forms.PrintDialog();
    // specify that printer settings should be obtain for imagePrintDocument
    printDialog1.Document = imagePrintDocument;
    // if printer is not selected
    if (printDialog1.ShowDialog() != System.Windows.Forms.DialogResult.OK)
        // exit
        return;

    // subscribe to the PrintImage event
    imagePrintDocument.PrintImage +=
        new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImageAndCancel);

    // start print
    imagePrintDocument.Print();
}

private void imagePrintDocument_PrintImageAndCancel(object sender, Vintasoft.Imaging.Print.PrintImageEventArgs e)
{
    if ((_printingImageIndex >= _printingImages.Count) ||
        (_printingImageIndex >= (_printingImages.Count / 2)))
    {
        Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
            (Vintasoft.Imaging.Print.ImagePrintDocument)sender;
        // unsubscribe from the PrintImage event
        imagePrintDocument.PrintImage -=
            new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImageAndCancel);
        // indicate that there is no more images to print
        e.HasMoreImages = false;
        return;
    }

    e.Image = _printingImages[_printingImageIndex];

    _printingImageIndex++;
}
Private _printingImages As Vintasoft.Imaging.ImageCollection
Private _printingImageIndex As Integer

Public Sub PrintImagesAndCancel(images As Vintasoft.Imaging.ImageCollection)
    ' save information about printing image collection in global variable
    _printingImages = images
    _printingImageIndex = 0

    ' create print manager
    Dim imagePrintDocument As New Vintasoft.Imaging.Print.ImagePrintDocument()
    ' specify that each image must be resized to fit within the page margins,
    ' image proportions is not changed
    imagePrintDocument.PrintScaleMode = Vintasoft.Imaging.Print.PrintScaleMode.BestFit

    ' create an instance of PrintDialog class
    Dim printDialog1 As New System.Windows.Forms.PrintDialog()
    ' specify that printer settings should be obtain for imagePrintDocument
    printDialog1.Document = imagePrintDocument
    ' if printer is not selected
    If printDialog1.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
        ' exit
        Return
    End If

    ' subscribe to the PrintImage event
    AddHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImageAndCancel)

    ' start print
    imagePrintDocument.Print()
End Sub

Private Sub imagePrintDocument_PrintImageAndCancel(sender As Object, e As Vintasoft.Imaging.Print.PrintImageEventArgs)
    If (_printingImageIndex >= _printingImages.Count) OrElse (_printingImageIndex >= (_printingImages.Count \ 2)) Then
        Dim imagePrintDocument As Vintasoft.Imaging.Print.ImagePrintDocument = DirectCast(sender, Vintasoft.Imaging.Print.ImagePrintDocument)
        ' unsubscribe from the PrintImage event
        RemoveHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImageAndCancel)
        ' indicate that there is no more images to print
        e.HasMoreImages = False
        Return
    End If

    e.Image = _printingImages(_printingImageIndex)

    _printingImageIndex += 1
End Sub



Вот C#/VB.NET код, который демонстрирует, как распечатать все изображения из коллекции изображений, кроме второго:

Vintasoft.Imaging.ImageCollection _printingImages;
int _printingImageIndex;

public void PrintImagesAndSuppressSecondImage(Vintasoft.Imaging.ImageCollection images)
{
    // save information about printing image collection in global variable
    _printingImages = images;
    _printingImageIndex = 0;

    // create print manager
    Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
        new Vintasoft.Imaging.Print.ImagePrintDocument();

    // subscribe to the PrintImage event
    imagePrintDocument.PrintImage +=
        new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImageAndSuppress);

    // start print
    imagePrintDocument.Print();
}

private void imagePrintDocument_PrintImageAndSuppress(object sender, Vintasoft.Imaging.Print.PrintImageEventArgs e)
{
    if (_printingImageIndex == 1)
        _printingImageIndex++;

    if (_printingImageIndex >= _printingImages.Count)
    {
        Vintasoft.Imaging.Print.ImagePrintDocument imagePrintDocument =
            (Vintasoft.Imaging.Print.ImagePrintDocument)sender;
        // unsubscribe from the PrintImage event
        imagePrintDocument.PrintImage -=
            new System.EventHandler<Vintasoft.Imaging.Print.PrintImageEventArgs>(imagePrintDocument_PrintImageAndSuppress);
        // indicate that there is no more images to print
        e.HasMoreImages = false;
        return;
    }

    e.Image = _printingImages[_printingImageIndex];

    _printingImageIndex++;
}
Private _printingImages As Vintasoft.Imaging.ImageCollection
Private _printingImageIndex As Integer

Public Sub PrintImagesAndSuppressSecondImage(images As Vintasoft.Imaging.ImageCollection)
    ' save information about printing image collection in global variable
    _printingImages = images
    _printingImageIndex = 0

    ' create print manager
    Dim imagePrintDocument As New Vintasoft.Imaging.Print.ImagePrintDocument()

    ' subscribe to the PrintImage event
    AddHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImageAndSuppress)

    ' start print
    imagePrintDocument.Print()
End Sub

Private Sub imagePrintDocument_PrintImageAndSuppress(sender As Object, e As Vintasoft.Imaging.Print.PrintImageEventArgs)
    If _printingImageIndex = 1 Then
        _printingImageIndex += 1
    End If

    If _printingImageIndex >= _printingImages.Count Then
        Dim imagePrintDocument As Vintasoft.Imaging.Print.ImagePrintDocument = DirectCast(sender, Vintasoft.Imaging.Print.ImagePrintDocument)
        ' unsubscribe from the PrintImage event
        RemoveHandler imagePrintDocument.PrintImage, New System.EventHandler(Of Vintasoft.Imaging.Print.PrintImageEventArgs)(AddressOf imagePrintDocument_PrintImageAndSuppress)
        ' indicate that there is no more images to print
        e.HasMoreImages = False
        Return
    End If

    e.Image = _printingImages(_printingImageIndex)

    _printingImageIndex += 1
End Sub



Пример кода, показывающий, как добавить верхний и/или нижний колонтитул к печатаемому изображению или странице,можно найти в демо приложении PrintDemo, которое доступно в дистрибутиве SDK.


Предварительный просмотр изображений для печати

UI-контрол ImagePrintDocument может использовать UI-контрол System.Windows.Forms.PrintPreviewControl для предварительного просмотра изображений при печати.

Во время предварительного просмотра UI-контрол System.Windows.Forms.PrintPreviewControl позволяет:
Хороший пример, демонстрирующий реализацию предварительного просмотра печати коллекции изображений, доступен в демо приложении PrintDemo, которое доступно в дистрибутиве SDK.


Печать изображений с аннотациями

UI-контрол AnnotatedImagePrintDocument, производный от UI-контрола ImagePrintDocument, должен использоваться для печати и предварительного просмотра изображений с аннотациями.
UI-контрол AnnotatedImagePrintDocument печатает аннотации в векторном виде, что обеспечивает более эффективное использование памяти и большую производительность, чем при растеризации аннотаций на клоне изображения перед печатью. UI-контрол AnnotatedImagePrintDocument будет работать как UI-контрол ImagePrintDocument, если значение свойства AnnotatedImagePrintDocument.PrintAnnotations установлено на false.