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