0

I am trying to copy ssrs report to pdf in memory but i am getting error message when i open pdf 'file not in right format' . I am using asp.net and iTextSharp.

I want to copy ssrs to new pdf (rptpdf) file in memory and then open existing pdf and copy images to second page of that (rptpdf) pdf.

For testing purpose i am trying to see if i can copy ssrs to pdf.

       Dim doc As New iTextSharp.text.Document()
       Dim content As Byte()
      Try
        Using myMemoryStream As New MemoryStream()

            Dim writer As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, myMemoryStream)
            doc.Open()


            Dim cb As iTextSharp.text.pdf.PdfContentByte = writer.DirectContent
            Dim page As iTextSharp.text.pdf.PdfImportedPage
            '--- bytes = rptViewer.ServerReport.Render("PDF", "", "", "", "", Nothing, Nothing)
            Dim b() As Byte = ReportRender.GetReport()

            Dim reader2 As New iTextSharp.text.pdf.PdfReader(b)

            Dim pages As Integer = reader2.NumberOfPages

            For i As Integer = 1 To pages
                doc.SetPageSize(iTextSharp.text.PageSize.LETTER)
                doc.NewPage()
                page = writer.GetImportedPage(reader2, i)
                cb.AddTemplate(page, 0, 0)
            Next

            doc.Close()
            reader2.Close()
            writer.Close()


            content = myMemoryStream.ToArray()
            myMemoryStream.Close()
        End Using



        Response.ContentType = "application/pdf"
        Response.AddHeader("content-disposition", "attachment;filename=" & "hello" & ".pdf")
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Response.Write(content)

UPDATED

I have managed to copy reportviewer report byte to memory stream but at add pdf file (line "writer.AddPage(page)") i get error 'object not reference '

           Using myMemoryStream As New MemoryStream()


        Dim rptpdfwriter As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, myMemoryStream)

        If rptpdfwriter Is Nothing Then
            Return
        End If

        doc.Open()

        Dim cb As iTextSharp.text.pdf.PdfContentByte = rptpdfwriter.DirectContent
        Dim page2 As iTextSharp.text.pdf.PdfImportedPage
        '--- bytes = rptViewer.ServerReport.Render("PDF", "", "", "", "", Nothing, Nothing)
        Dim b() As Byte = ReportRender.GetReport()

        Dim reader2 As New iTextSharp.text.pdf.PdfReader(b)

        Dim pages2 As Integer = reader2.NumberOfPages

        For i As Integer = 1 To pages2
            doc.SetPageSize(iTextSharp.text.PageSize.A4.Rotate)
            doc.NewPage()
            page2 = rptpdfwriter.GetImportedPage(reader2, i)
            cb.AddTemplate(page2, 0, 0)
        Next


        reader2.Close()



        For Each item As Expenses In expenses
            Select Case item.Ext.ToLower
                Case ".pdf"
                    Dim writer As New iTextSharp.text.pdf.PdfCopy(doc, myMemoryStream)
                    Dim reader As New iTextSharp.text.pdf.PdfReader(Server.MapPath("/docs/expenses/" + item.ExpenseID.ToString + item.Ext))
                    reader.ConsolidateNamedDestinations()

                    For i As Integer = 1 To reader.NumberOfPages
                        Dim page As iTextSharp.text.pdf.PdfImportedPage = writer.GetImportedPage(reader, i)
                        writer.AddPage(page)
                    Next

                    Dim form As iTextSharp.text.pdf.PRAcroForm = reader.AcroForm
                    If form IsNot Nothing Then
                        writer.CopyAcroForm(reader)
                    End If

                    reader.Close()

                Case ".jpg"
                    Dim pdfWriter As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, myMemoryStream)
                    Dim jpg As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(Server.MapPath("/docs/expenses/" + item.ExpenseID.ToString + item.Ext))

                    If Not doc.IsOpen Then doc.Open()
                    doc.Add(jpg)
                Case Else
                    Exit Sub

            End Select


        Next



        doc.Close()

        Content = myMemoryStream.ToArray()

        myMemoryStream.Flush()
        myMemoryStream.Dispose()

        Response.ContentType = "application/pdf"
        Response.AppendHeader("Content-Disposition", "attachment; filename=LeftCorneraaa.pdf")
        Response.BinaryWrite(Content)

    End Using
user1263981
  • 2,953
  • 8
  • 57
  • 98
  • 1
    Try using `Response.BinaryWrite` instead of `Response.Write` – gotmilk13531 Sep 09 '15 at 17:31
  • pls check my updated code. – user1263981 Sep 09 '15 at 18:53
  • You are making a PDF from SSRS, right? If so, regardless of byte array, memory stream, file stream whatever, a PDF is a PDF, so you don't need iText do anything to that. Is your ultimate goal just to append some [images to an existing PDF](http://stackoverflow.com/a/583837/231316)? – Chris Haas Sep 09 '15 at 21:04
  • yes i need to append some images to ssrs pdf. I can write ssrs pdf to disk and then read it to new pdf and then merge few other existing image to that pdf. SSRS report shows visit expenses calculation, requirements are to download all expenses in one pdf. Expenses are saved in jpg, pdf, and tif format on disk so i will merge all of them to one pdf and include the ssrs report. – user1263981 Sep 10 '15 at 10:20

0 Answers0