以编程方式将RDLC报告另存为PDF

时间:2009-10-30 20:42:23

标签: vb.net pdf export rdlc

我有一份报告,我需要多次运行并另存为PDF。我目前正在以编程方式生成报告,但希望保存报告,而无需用户每次都手动选择保存选项。

我用来将单个报告呈现为PDF的代码是:

    Dim warnings As Microsoft.Reporting.WebForms.Warning() = Nothing

    Dim streamids As String() = Nothing

    Dim mimeType As String = Nothing

    Dim encoding As String = Nothing

    Dim extension As String = Nothing

    Dim deviceInfo As String

    Dim bytes As Byte()

    Dim lr As New Microsoft.Reporting.WebForms.LocalReport

    deviceInfo = "<DeviceInfo><SimplePageHeaders>True</SimplePageHeaders></DeviceInfo>"

    bytes = ReportViewer1.LocalReport.Render("PDF", deviceInfo, mimeType, encoding, extension, streamids, warnings)

    Response.ClearContent()

    Response.ClearHeaders()

    Response.ContentType = "application/pdf"

    Response.BinaryWrite(bytes)

    Response.Flush()

    Response.Close()

我想我可以在循环中运行它并且每次都保存PDF。

3 个答案:

答案 0 :(得分:6)

你在这里有什么问题?它不起作用吗?

这是我们在2005年所做的事情的一个例子。我们定义了一个名为rptViewer1的控件,它可以根据您的需要显示或不显示。 strFormat应包含“PDF”和strNomFicher的完整路径。

顺便说一句,变量名称和函数都是法语,但无论如何都会有效:)


    Public Sub CreerFichierRapport(ByVal strNomFichier As String, ByVal strFormat As String)
        Dim bytes() As Byte
        Dim strDeviceInfo As String = ""
        Dim strMimeType As String = ""
        Dim strEncoding As String = ""
        Dim strExtension As String = ""
        Dim strStreams() As String
        Dim warnings() As Warning
        Dim oFileStream As FileStream
        _stream = New List(Of Stream)
        Try
            bytes = rptViewer1.LocalReport.Render(strFormat, strDeviceInfo, strMimeType, strEncoding, strExtension, strStreams, warnings)

            oFileStream = New FileStream(strNomFichier, FileMode.Create)
            oFileStream.Write(bytes, 0, bytes.Length)
            _stream.Add(oFileStream)
        Finally
            If Not IsNothing(oFileStream) Then
                oFileStream.Close()
                oFileStream.Dispose()
            End If
        End Try
    End Sub

答案 1 :(得分:5)

大卫的回答对我很有帮助。我想我会发布这个代码的简化和(略)翻译版本,因为原文包含一些法语,还有一些不相关的参考文献:

Imports Microsoft.Reporting.WebForms
Imports System.IO

Public Class RenderToPDF
    Public Sub Save(ByVal viewer As ReportViewer, ByVal savePath As String)
        Dim Bytes() As Byte = viewer.LocalReport.Render("PDF", "", Nothing, Nothing, Nothing, Nothing, Nothing)

        Using Stream As New FileStream(savePath, FileMode.Create)
            Stream.Write(Bytes, 0, Bytes.Length)
        End Using
    End Sub
End Class

答案 2 :(得分:0)

dt = c.ds.Tables["vt5"];
            ReportViewer1.Visible = true;
            ReportViewer1.LocalReport.ReportPath = "InvoiceSGST.rdlc";
            ReportViewer1.LocalReport.DataSources.Clear();
            ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Invoice", dt));
            ReportDataSource rds = new ReportDataSource("Invoice", dt);

            this.ReportViewer1.LocalReport.EnableExternalImages = true;
            ReportViewer1.LocalReport.Refresh();

            // Variables
            Warning[] warnings;
            string[] streamIds;
            string mimeType = string.Empty;
            string encoding = string.Empty;
            string extension = string.Empty;

            ReportViewer viewer = new ReportViewer();
            viewer.ProcessingMode = ProcessingMode.Local;
            viewer.LocalReport.ReportPath = "InvoiceSGST.rdlc";
            viewer.LocalReport.DataSources.Add(rds); // Add datasource here
            viewer.LocalReport.EnableExternalImages = true;
            byte[] bytes = viewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
            if (bytes != null)
            {
                Response.ContentType = "application/pdf";
                Response.AddHeader("content-length", bytes.Length.ToString());
                Response.BinaryWrite(bytes);


                string strFilePath = @"C:\Temp\";
                string strFileName = "Blah.PDF";
                string filename = Path.Combine(strFilePath, strFileName);
                using (FileStream fs = new FileStream(filename, FileMode.Create))
                {
                    fs.Write(bytes, 0, bytes.Length);
                }
            }