106 lines
4.1 KiB
VB.net
106 lines
4.1 KiB
VB.net
Imports System
|
|
Imports System.IO
|
|
Imports System.Data
|
|
Imports System.Text
|
|
Imports System.Drawing
|
|
Imports System.Drawing.Imaging
|
|
Imports System.Drawing.Printing
|
|
Imports System.Collections.Generic
|
|
Imports System.Windows.Forms
|
|
Imports Microsoft.Reporting.WinForms
|
|
Public Class ClassPrintReport
|
|
Implements IDisposable
|
|
Private Shared m_currentPageIndex As Integer
|
|
Private Shared m_streams As IList(Of Stream)
|
|
|
|
Private Function LoadSalesData() As DataTable
|
|
' Create a new DataSet and read sales data file
|
|
' data.xml into the first DataTable.
|
|
Dim dataSet As New DataSet()
|
|
dataSet.ReadXml("..\..\data.xml")
|
|
Return dataSet.Tables(0)
|
|
End Function
|
|
|
|
' Routine to provide to the report renderer, in order to
|
|
' save an image for each page of the report.
|
|
Private Shared Function CreateStream(ByVal name As String, ByVal fileNameExtension As String, ByVal encoding As Encoding, ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
|
|
Dim stream As Stream = New MemoryStream()
|
|
m_streams.Add(stream)
|
|
Return stream
|
|
End Function
|
|
|
|
' Export the given report as an EMF (Enhanced Metafile) file.
|
|
Private Shared Sub Export(ByVal report As LocalReport)
|
|
Dim deviceInfo As String = "<DeviceInfo>" & _
|
|
"<OutputFormat>EMF</OutputFormat>" & _
|
|
"<PageWidth>4.1in</PageWidth>" & _
|
|
"<PageHeight>5.8in</PageHeight>" & _
|
|
"<MarginTop>0.2in</MarginTop>" & _
|
|
"<MarginLeft>0.2in</MarginLeft>" & _
|
|
"<MarginRight>0.2in</MarginRight>" & _
|
|
"<MarginBottom>0.2in</MarginBottom>" & _
|
|
"</DeviceInfo>"
|
|
Dim warnings As Warning()
|
|
m_streams = New List(Of Stream)()
|
|
report.Render("Image", deviceInfo, AddressOf CreateStream, warnings)
|
|
For Each stream As Stream In m_streams
|
|
stream.Position = 0
|
|
Next
|
|
End Sub
|
|
|
|
' Handler for PrintPageEvents
|
|
Private Shared Sub PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
|
|
Dim pageImage As New Metafile(m_streams(m_currentPageIndex))
|
|
|
|
' Adjust rectangular area with printer margins.
|
|
Dim adjustedRect As New Rectangle(ev.PageBounds.Left - CInt(ev.PageSettings.HardMarginX), _
|
|
ev.PageBounds.Top - CInt(ev.PageSettings.HardMarginY), _
|
|
ev.PageBounds.Width, _
|
|
ev.PageBounds.Height)
|
|
|
|
' Draw a white background for the report
|
|
ev.Graphics.FillRectangle(Brushes.White, adjustedRect)
|
|
|
|
' Draw the report content
|
|
ev.Graphics.DrawImage(pageImage, adjustedRect)
|
|
|
|
' Prepare for the next page. Make sure we haven't hit the end.
|
|
m_currentPageIndex += 1
|
|
ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
|
|
End Sub
|
|
|
|
Private Shared Sub Print(printerName As String)
|
|
If m_streams Is Nothing OrElse m_streams.Count = 0 Then
|
|
Throw New Exception("Error: no stream to print.")
|
|
End If
|
|
Dim printDoc As New PrintDocument()
|
|
printDoc.PrinterSettings.PrinterName = printerName
|
|
If Not printDoc.PrinterSettings.IsValid Then
|
|
Throw New Exception("Error: cannot find the default printer.")
|
|
Else
|
|
AddHandler printDoc.PrintPage, AddressOf PrintPage
|
|
m_currentPageIndex = 0
|
|
printDoc.Print()
|
|
End If
|
|
End Sub
|
|
|
|
' Create a local report for Report.rdlc, load the data,
|
|
' export the report to an .emf file, and print it.
|
|
Public Shared Sub Run(report As LocalReport)
|
|
'Dim report As New LocalReport()
|
|
'report.ReportPath = "..\..\Report.rdlc"
|
|
'report.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
|
|
Export(report)
|
|
Print("Schaum-Drucker")
|
|
End Sub
|
|
|
|
Public Sub Dispose() Implements IDisposable.Dispose
|
|
If m_streams IsNot Nothing Then
|
|
For Each stream As Stream In m_streams
|
|
stream.Close()
|
|
Next
|
|
m_streams = Nothing
|
|
End If
|
|
End Sub
|
|
End Class
|