Я печатаю отчет RDLC
, используя класс, написанный с помощью Vb.net
.Устранение локального отчета дополнительные пустые страницы
Я преобразовал отчет RDLC
в список MemoryStream
и распечатал его с помощью объекта PrintDocument
. Я использовал этот MSDN Article в качестве справки.
Это мой код:
Private m_currentPageIndex As Integer
Private m_streams As IList(Of Stream)
Dim m_report As LocalReport
Public Sub New(ByVal v_report As LocalReport)
m_report = v_report
End Sub
' Routine to provide to the report renderer, in order to
' save an image for each page of the report.
Public 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.
Public Sub Export(ByVal report As LocalReport)
Dim deviceInfo As String = "<DeviceInfo>" &
"<OutputFormat>EMF</OutputFormat>" &
"<PageWidth>8.5in</PageWidth>" &
"<PageHeight>11in</PageHeight>" &
"<MarginTop>0.25in</MarginTop>" &
"<MarginLeft>0.25in</MarginLeft>" &
"<MarginRight>0.25in</MarginRight>" &
"<MarginBottom>0.25in</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
Public 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
Public Sub Print()
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()
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 Sub Run()
Export(m_report)
Print()
End Sub
Проблема заключается в том, что этот код печатает 3 дополнительных пустых страниц.
Я попытался установить ConsumeContainerWhiteSpaces = True
и это не фиксированная моя проблема
При отладке я обнаружил, что длина blankpage MemoryStream
является 408
так я пытался фильтровать memorystreams используя следующий код Print
Sub
Dim var = m_streams.Where(Function(X) X.Length <= 408).ToList
For Each ms As MemoryStream In var
m_streams.Remove(ms)
Next
и он устраняет пустые страницы. Но я не могу предположить, что я могу использовать этот запрос, который можно использовать для других случаев? любое предложение
Примечание:
- Я принимаю ответы в
C#
- кодекса предусматривает от MSDN статьи связаны выше
Update 1:
- Я попытался минимизировать ширину страницы, но по-прежнему имеют те же проблемы
- печатается отчет без использования
ReportViewer
Exotic код, трудно увидеть проблема, которую он пытается решить. Единственное, что выпрыгивает, это перегрузка LocalReport.Render(), которую вы используете. Сейчас это «простой», который не указывает аргумент PageCountMode, который принимает другие перегрузки.Он использует параметр PageCountMode.Estimate. Очевидно, что у вас есть веская причина использовать параметр PageCountMode.Actual. –
@HansPassant Этот код от MSDN. Я дал ему ссылку. Если вы знаете другой способ, пожалуйста, предоставьте это. – Hadi