Menggabungkan Crystal Report Document dalam pdf dengan iTextSharp

Ketika saya mempunyai beberapa report yang ingin digabungkan agar keluar dalam bentuk satu pdf yang sama, saya menggunakan iTextSharp untuk membantu menggabungkan documentnya. iTextSharp bisa di dapat dari : http://itextsharp.sourceforge.net

Berikut sepenggal code yang saya buat pada modul saya :

Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Imports System.IO
Imports system.IO.FileMode
Imports System.IO.FileStream

Imports iTextSharp.text
Imports iTextSharp.text.pdf

Partial Class pages_report_Print_Report
    Inherits System.Web.UI.Page

    Private ClsObjRptAnnualPolicy As New ObjRptAnnual()
    Dim clsObjPrint As New ObjPrint
    Dim gclDBClass As GreatlinkClass.DBClass
    Dim MyReportDocument(12) As ReportDocument
    Dim SubReportDocument As ReportDocument
    Dim strSql As String
    Dim ds As DataSet, dsd As DataSet

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Call PrintPV()
    End Sub

    Sub PrintPV()
        'MENGAMBIL PARAMETER DARI PAGE SEBELUMNYA DALAM BENTUK ARRAY
        Dim strPolicyNo As String = Request.QueryString("PolicyNo")
        Dim strTransType As String = Request.QueryString("TransType")
        Dim strTransNo As String = Request.QueryString("TransNo")
        Dim strTransDate As String = Request.QueryString("TransDate")
        Dim ArrPolicyNo() As String = Split(strPolicyNo, ",")
        Dim ArrTransNo() As String = Split(strTransNo, ",")
        Dim ArrTransDate() As String = Split(strTransDate, ",")

        Dim oStream As New MemoryStream
        Dim oStream2 As New MemoryStream
        Dim i, j As Integer

        'MELAKUKAN PERULANGAN UNTUK MEMBUAT REPORT DOCUMENT
        For i = 0 To ArrPolicyNo.Length - 2
            Dim MyTable As DataTable
            Dim DetailTable As DataTable
            If (strTransType = "WD") Then
                MyTable = clsObjPrint.Get_GeneralHeaderStatement(ArrPolicyNo(i))
                DetailTable = clsObjPrint.Get_DetailWithdrawal(ArrPolicyNo(i), strTransType, ArrTransNo(i), ArrTransDate(i))
                MyReportDocument(i) = New ReportDocument()
                MyReportDocument(i).Load(Server.MapPath("CR_Withdrawal.rpt"))
                MyReportDocument(i).SetDataSource(MyTable)
                MyReportDocument(i).Subreports.Item("CR_detailwd.rpt").SetDataSource(DetailTable)
                MyReportDocument(i).Subreports.Item("CR_detailWd.rpt").SetDataSource(DetailTable)
            ElseIf (strTransType = "SU") Then
                MyTable = clsObjPrint.Get_GeneralHeaderStatement(ArrPolicyNo(i))
                DetailTable = clsObjPrint.Get_DetailWithdrawal(ArrPolicyNo(i), strTransType, ArrTransNo(i), ArrTransDate(i))
                MyReportDocument(i) = New ReportDocument()
                MyReportDocument(i).Load(Server.MapPath("CR_Surrender.rpt"))
                MyReportDocument(i).SetDataSource(MyTable)
                MyReportDocument(i).Subreports.Item("CR_detailSuu.rpt").SetDataSource(DetailTable)
                MyReportDocument(i).Subreports.Item("CR_detailSu.rpt").SetDataSource(DetailTable)
            End If
        Next

        'JIKA REPORT DOCUMENT TERISI HANYA SATU, MAKA DIEXPORT LANGSUNG KE PDF AGAR LEBIH CEPAT
        If i = 1 Then
            oStream = MyReportDocument(0).ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)
            Response.ContentType = "application/pdf"
            Try
                Response.BinaryWrite(oStream.ToArray())
                clsObjPrint.add_reprint(ArrPolicyNo(0), strTransType, ArrTransNo(0), ArrTransDate(0))
                Response.End()
            Catch err As Exception
                Response.Write("< BR > asdf")
                Response.Write(err.Message.ToString)
            End Try

            'JIKA REPORT DOCUMENT TERISI LEBIH DARI MAKA DIGABUNGKAN MENGGUNAKAN ITEXTSHARP KEMUDIAN DIEXPORT KE PDF
        Else
            Dim mymemorystream As New MemoryStream
            Dim reader As iTextSharp.text.pdf.PdfReader
            Dim NumberofPages As Integer
            Dim curPageNo As Integer
            Dim doc As New iTextSharp.text.Document
            Dim writer As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, oStream)
            doc.Open()
            Dim page As iTextSharp.text.pdf.PdfImportedPage
            Dim rotation As Integer
            Dim cb As iTextSharp.text.pdf.PdfContentByte = writer.DirectContent

            'PERULANGAN UNTUK MENGAMBIL SETIAP REPORT DOCUMENT
            For j = 0 To i - 1
                mymemorystream = New MemoryStream
                mymemorystream = MyReportDocument(j).ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)

                Dim length As Long = mymemorystream.Length
                Dim rptContent(length) As Byte

                mymemorystream.Read(rptContent, 0, Convert.ToInt32(length))
                reader = New iTextSharp.text.pdf.PdfReader(rptContent)
                NumberofPages = reader.NumberOfPages
                curPageNo = 0

                'PERULANGAN UNTUK MENGGABUNGKAN PDF DENGAN ITEXTSHARP
                Do While (curPageNo < NumberofPages)
                    curPageNo += 1
                    doc.SetPageSize(PageSize.LETTER)
                    doc.NewPage()
                    page = writer.GetImportedPage(reader, curPageNo)
                    rotation = reader.GetPageRotation(curPageNo)

                    If (rotation = 90) Or (rotation = 270) Then
                        cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(curPageNo).Height)
                    Else
                        cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0)
                    End If
                Loop
                'DATA DIINSERT KE HIS_STATEMENT SEBAGAI HISTORY BAHWA SUDAH PERNAH DI PRINT
                clsObjPrint.add_reprint(ArrPolicyNo(j), strTransType, ArrTransNo(j), ArrTransDate(j))
            Next

            mymemorystream.Close()
            Response.Buffer = True
            Response.ContentType = "application/pdf"
            Response.AddHeader("Content-Disposition", "inline")

            If oStream Is Nothing Then
                Response.Write("No Data is available for output")
            Else
                doc.Close()
                Response.BinaryWrite(oStream.GetBuffer())
                Response.End()
            End If
        End If

        For j = 0 To i - 1
            MyReportDocument(j).Close()
            MyReportDocument(j).Dispose()
        Next
        oStream.Close()
        crPV.Dispose()
        'JANGAN LUPA UNTUK CLOSE SEMUA DOCUMENT, MEMORY STREAM DAN REPORT DOCUMENT
    End Sub
End Class

Leave a Comment