为什么直接从rdlc/reportviewer打印,打印输出在vb.net中有红色标记

问题描述 投票:0回答:1

我正在尝试直接从 rdlc/报告查看器打印,但打印输出在 vb.net 中有红色标记

代码有问题吗

LocalReportExtensions

请指导我。

谢谢

Public Module LocalReportExtensions
        <Extension()>
        Sub Print(ByVal report As LocalReport, ByVal printerName As String)
            Dim pageSettings = New PageSettings()
            pageSettings.PaperSize = report.GetDefaultPageSettings().PaperSize
            pageSettings.Landscape = report.GetDefaultPageSettings().IsLandscape
            pageSettings.Margins = report.GetDefaultPageSettings().Margins
            Print(report, pageSettings, printerName)
        End Sub
        <Extension()>
        Sub Print(ByVal report As LocalReport, ByVal pageSettings As PageSettings, ByVal printerName As String)
            Dim deviceInfo As String = $"<DeviceInfo>
                    <OutputFormat>EMF</OutputFormat>
                    <PageWidth>{pageSettings.PaperSize.Width * 100}in</PageWidth>
                    <PageHeight>{pageSettings.PaperSize.Height * 100}in</PageHeight>
                    <MarginTop>{pageSettings.Margins.Top * 100}in</MarginTop>
                    <MarginLeft>{pageSettings.Margins.Left * 100}in</MarginLeft>
                    <MarginRight>{pageSettings.Margins.Right * 100}in</MarginRight>
                    <MarginBottom>{pageSettings.Margins.Bottom * 100}in</MarginBottom>
                </DeviceInfo>"


        Dim warnings() As Warning
        Dim streams = New List(Of Stream)()
        Dim currentPageIndex = 0
        report.Render("Image", deviceInfo,
                      Function(name, fileNameExtension, encoding, mimeType, willSeek)
                          Dim stream = New MemoryStream()
                          streams.Add(stream)
                          Return stream
                      End Function, warnings)
        For Each stream As Stream In streams
            stream.Position = 0
        Next
        If streams Is Nothing OrElse streams.Count = 0 Then
            Throw New Exception("Error: no stream to print.")
        End If
        Dim printDocument = New PrintDocument()
        printDocument.DefaultPageSettings = pageSettings
        If Not printDocument.PrinterSettings.IsValid Then
            Throw New Exception("Error: cannot find the default printer.")
        Else
            AddHandler printDocument.PrintPage,
                Sub(sender, e)
                    Dim pageImage As Metafile = New Metafile(streams(currentPageIndex))
                    Dim adjustedRect As Rectangle = New Rectangle(
                        e.PageBounds.Left - CInt(e.PageSettings.HardMarginX),
                        e.PageBounds.Top - CInt(e.PageSettings.HardMarginY),
                        e.PageBounds.Width,
                        e.PageBounds.Height)
                    e.Graphics.FillRectangle(Brushes.White, adjustedRect)
                    e.Graphics.DrawImage(pageImage, adjustedRect)
                    currentPageIndex += 1
                    e.HasMorePages = (currentPageIndex < streams.Count)
                    e.Graphics.DrawRectangle(Pens.Red, adjustedRect)
                End Sub

            AddHandler printDocument.EndPrint,
                Sub(Sender, e)
                    If streams IsNot Nothing Then
                        For Each stream As Stream In streams
                            stream.Close()
                        Next
                        streams = Nothing
                    End If
                End Sub
            printDocument.PrintController = New StandardPrintController()
            printDocument.PrinterSettings.PrinterName = printerName
            printDocument.Print()
        End If
    End Sub
    End Module

以硬拷贝形式输出结果

结果输出为pdf格式

vb.net report rdlc reportviewer
1个回答
0
投票

我的解决方案更改了下面的代码

来自

e.Graphics.DrawRectangle(Pens.Red, adjustedRect)

e.Graphics.DrawRectangle(Pens.White, adjustedRect)
© www.soinside.com 2019 - 2024. All rights reserved.