我想打印multipage .tiff files的列表。我遇到的问题是我没有得到多页,只有第一页被“打印”了。有人可以指出我到底在做什么错吗?

Private Sub docPrintPage(sender As Object, e As PrintPageEventArgs)

    For Each filName As String In fileN
        Dim m_Image As Image = Image.FromFile(filName)
        Dim pc As Integer = 0
        Dim currPage As Integer = 0

        pc = m_Image.GetFrameCount(FrameDimension.Page)

        While (currPage < pc)
            m_Image.SelectActiveFrame(FrameDimension.Page, currPage)
            e.Graphics.DrawImage(m_Image, e.PageBounds) 'Most likely the problem lies here

            currPage = currPage + 1
            e.HasMorePages = true

        End While
    Next
    e.HasMorePages = false
 End Sub

变量的一些解释:
fileN: List of paths to my files
pc: pagecount/framecount of the current .tiff
currPage: index of the active frame in the current .tiff

我的最终目标:以在打印预览中显示一系列多帧.tiffs(列表)。

最佳答案

由于以下帖子,我设法解决了这个问题:

Thank you very very much Tezzo

首先创建以下类变量

Private fileCount As Integer = 0 // Index of the current file/Image
Private currPage As Integer = 0 // Current Page in the current file/Image
Private pCount As Integer = 0 // PageCount in the current file/Image
Private currImage As Image // My Current Image

创建一个新的PrintDocument(在某些函数中)并将其分配给PrintPreviewDialog
    Dim vPrintDoc As New PrintDocument
    vPrintDoc.DefaultPageSettings.Landscape = False

    AddHandler vPrintDoc.PrintPage, AddressOf docPrintPage
    AddHandler vPrintDoc.BeginPrint, AddressOf docBeginprint


    Dim i As PrintPreviewDialog = New PrintPreviewDialog
    i.Document = vPrintDoc
    i.ShowDialog()

在方法docBeginPrint中,将classvariables(之前声明)设置为第一个(如果存在)的统计信息
Private Sub docBeginprint(sender As Object, e As PrintEventArgs)

    If fileN.Count > 0 Then
        currPage = 0
        currImage = Image.FromFile(fileN.Item(0))
        pCount = currImage.GetFrameCount(FrameDimension.Page)
    End If

End Sub

'然后在您的docPrintPage中开始打印
Private Sub docPrintPage(sender As Object, e As PrintPageEventArgs)

    currImage.SelectActiveFrame(FrameDimension.Page, currPage) 'Set the Active Frame of your image to that of the following frame that needs to printed.

    Using st As MemoryStream = New MemoryStream() 'We use a memory stream to print Images in order to avoid a bug inside the e.graphics.

        currImage.Save(st, ImageFormat.Bmp)
        Dim bmp As Bitmap = CType(Image.FromStream(st), Bitmap)
        e.Graphics.DrawImage(bmp, 0, 0)
        bmp.Dispose()

    End Using

    currPage += 1 'Current page is printed, increase index with 1

    If currPage < pCount Then 'Are there any further pages in the current image?
        e.HasMorePages = True 'yes continue printing
    Else 'no
        If fileCount = (fileN.Count - 1) Then 'Hase the list anymore files?
            e.HasMorePages = False 'No - stop printing all together
        Else 'yes
            currPage = 0 'Set your index for the current page back to first
            fileCount += 1 'Increase the index of the current file
            currImage = Image.FromFile(fileN.Item(fileCount)) 'Load the next image (Perhaps if-statements is desired to avoid Null-Reference)
            pCount = currImage.GetFrameCount(FrameDimension.Page) 'Load the pagecount of the current image

            e.HasMorePages = True 'continue printing
        End If
    End If
End Sub

我希望这可能对其他人有用。

09-10 03:03
查看更多