2016-12-04 2 views
3

Я печатаю отчет 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
+0

Exotic код, трудно увидеть проблема, которую он пытается решить. Единственное, что выпрыгивает, это перегрузка LocalReport.Render(), которую вы используете. Сейчас это «простой», который не указывает аргумент PageCountMode, который принимает другие перегрузки.Он использует параметр PageCountMode.Estimate. Очевидно, что у вас есть веская причина использовать параметр PageCountMode.Actual. –

+1

@HansPassant Этот код от MSDN. Я дал ему ссылку. Если вы знаете другой способ, пожалуйста, предоставьте это. – Hadi

ответ

0

Дав много попыток, это выглядит как пустая страница памяти размером поток 408, так чтобы исключить пустую страницу, мы можем использовать код при условии

Dim var = m_streams.Where(Function(X) X.Length <= 408).ToList 

For Each ms As MemoryStream In var 
    m_streams.Remove(ms) 
Next 
0

Вы можете попробовать изменить ширину отчета, во много раз больше ширины сделать дополнительные белые страницы.

+1

Размеры отчета - это размеры бумаги формата А4. это то, что мне нужно – Hadi

+1

@Hadi Размеры отчета не A4: A4 - 8,27 на 11,69 дюйма. –

+0

@AndrewMorton Я попробую. Thx – Hadi

0

Когда вы создаете отчет .RDLC, у вас есть лишнее свободное пространство? См. Изображение для примера. Белое пространство выделено желтым цветом. Эта область будет всегда печатается и выглядит пустым.

Если вы это сделаете, попробуйте сократить пробел, чтобы окружить только вашу таблицу/матрицу. Наведите указатель мыши на черную рамку и перетащите границу, пока она не окружает только ваш стол. Это должно устранить лишние страницы.

enter image description here

+1

В дизайнере отчетов у меня нет белых пробелов. Он отображается во время печати – Hadi