相关文章推荐
时尚的佛珠  ·  ILoggingEvent (The ...·  1 月前    · 
小胡子的牛腩  ·  学术讲座 | ...·  3 月前    · 
不拘小节的菠萝  ·  spring webflux - ...·  1 年前    · 

我使用itextsharp產生了2份PDF,第一份是內容,然後再產生目錄(程式碼如下)

請問要如何直接在程式後半段將兩份合併成一份PDF存檔(目錄在前,內容在後)

 Public Class itsEvents
    Inherits PdfPageEventHelper
    Public Overrides Sub OnOpenDocument(ByVal writer As iTextSharp.text.pdf.PdfWriter, ByVal document As iTextSharp.text.Document)
    End Sub
    Public Overrides Sub OnStartPage(ByVal writer As iTextSharp.text.pdf.PdfWriter, ByVal document As iTextSharp.text.Document)
    End Sub
    Public Overrides Sub OnEndPage(ByVal writer As iTextSharp.text.pdf.PdfWriter, ByVal document As iTextSharp.text.Document)
      Dim bf As BaseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
      Dim cb As PdfContentByte = writer.DirectContent
      cb.BeginText()
      cb.SetFontAndSize(bf, 10) '字型 大小
      cb.SetTextMatrix(290, 20) '位置
      cb.ShowText("- " & writer.PageNumber & " -")
      cb.EndText()
    End Sub
    Public Overrides Sub OnCloseDocument(ByVal writer As iTextSharp.text.pdf.PdfWriter, ByVal document As iTextSharp.text.Document)
    End Sub
End Class
Dim cList As New List(Of cPage)()
Public Class cPage
   Public Name As String
   Public Page As String
End Class
Dim _table As PdfPTable
Dim _cell As PdfPCell
Dim _chunk As iTextSharp.text.Chunk
Dim _phrase As iTextSharp.text.Phrase
Dim _paragraph As iTextSharp.text.Paragraph
Dim _tempPage As Integer = 0
Dim _Doc1 As iTextSharp.text.Document = New iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 20, 20, 50, 50)
Dim _MemoryStream1 As MemoryStream = New MemoryStream()
Dim _pdfWriter1 As PdfWriter = PdfWriter.GetInstance(_Doc1, _MemoryStream1)
Dim _ev As New itsEvents
_pdfWriter1.PageEvent = _ev
_Doc1.Open()
For i As Integer = 1 To 3
  _Doc1.NewPage()
  _table = New PdfPTable(1)
  _table.TotalWidth = 510.0F
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add("Chapter " + i.ToString)
  _table.AddCell(_phrase)
  _Doc1.Add(_table) '加入文件
  Dim _cls As New cPage
  _cls.Name = "Chapter " + i.ToString
  If i = 1 Then
    _cls.Page = 1
    _cls.Page = _tempPage
  End If
  _tempPage = _pdfWriter1.PageNumber() + 1
  cList.Add(_cls)
_Doc1.Close()
Dim _Doc2 As iTextSharp.text.Document = New iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 20, 20, 50, 50)
Dim _MemoryStream2 As MemoryStream = New MemoryStream()
Dim _pdfWriter2 As PdfWriter = PdfWriter.GetInstance(_Doc2, _MemoryStream2)
_Doc2.Open()
_Doc2.NewPage()
_table = New PdfPTable(1)
_table.TotalWidth = 510.0F
_phrase = New iTextSharp.text.Phrase()
_phrase.Add("Content")
_table.AddCell(_phrase)
_Doc2.Add(_table)
_table = New PdfPTable(2)
_table.TotalWidth = 510.0F
_table.SetWidths(New Single(1) {1, 1})
For m As Integer = 0 To cList.Count - 1
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add(cList(m).Name)
  _table.AddCell(_phrase)
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add(cList(m).Page)
  _table.AddCell(_phrase)
_Doc2.Add(_table)
_Doc2.Close()
'【PDF下載】
Response.Clear()
Response.AddHeader("Content-Disposition", "attachment; filename=Merge.pdf")
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(_MemoryStream2.GetBuffer(), 0, _MemoryStream2.GetBuffer().Length)    
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.Flush()
Response.End()
Dim _cell As PdfPCell
Dim _chunk As iTextSharp.text.Chunk
Dim _phrase As iTextSharp.text.Phrase
Dim _paragraph As iTextSharp.text.Paragraph
Dim _tempPage As Integer = 0
Dim _Doc1 As iTextSharp.text.Document = New iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 20, 20, 50, 50)
Dim _MemoryStream1 As MemoryStream = New MemoryStream()
Dim _pdfWriter1 As PdfWriter = PdfWriter.GetInstance(_Doc1, _MemoryStream1)
Dim _ev As New itsEvents
_pdfWriter1.PageEvent = _ev
_Doc1.Open()
'=================
_Doc1.NewPage()
_table = New PdfPTable(1)
_table.TotalWidth = 510.0F
_phrase = New iTextSharp.text.Phrase()
_phrase.Add("Content")
_table.AddCell(_phrase)
_Doc1.Add(_table)
_table = New PdfPTable(2)
_table.TotalWidth = 510.0F
_table.SetWidths(New Single(1) {1, 1})
For m As Integer = 0 To cList.Count - 1
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add(cList(m).Name)
  _table.AddCell(_phrase)
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add(cList(m).Page)
  _table.AddCell(_phrase)
_Doc1.Add(_table)
'=================
For i As Integer = 1 To 3
  _Doc1.NewPage()
  _table = New PdfPTable(1)
  _table.TotalWidth = 510.0F
  _phrase = New iTextSharp.text.Phrase()
  _phrase.Add("Chapter " + i.ToString)
  _table.AddCell(_phrase)
  _Doc1.Add(_table) '加入文件
  Dim _cls As New cPage
  _cls.Name = "Chapter " + i.ToString
  If i = 1 Then
    _cls.Page = 1
    _cls.Page = _tempPage
  End If
  _tempPage = _pdfWriter1.PageNumber() + 1
  cList.Add(_cls)
_Doc1.Close()
'【PDF下載】
Response.Clear()
Response.AddHeader("Content-Disposition", "attachment; filename=Merge.pdf")
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(_MemoryStream2.GetBuffer(), 0, _MemoryStream2.GetBuffer().Length)    
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.Flush()
Response.End()
                            

後來我用Byte Array,再合併(如下),
但產生的PDF並不是兩份合併的結果,是哪裡錯了呢?

Dim resultChapter() As Byte
Dim resultContent() As Byte

resultChapter = _MemoryStream1.ToArray()
resultContent = _MemoryStream2.ToArray()

Dim mergedPdf(resultChapter.Length + resultContent.Length) As Byte
Array.Copy(resultContent, 0, mergedPdf, 0, resultContent.Length)
Array.Copy(resultChapter, 0, mergedPdf, resultContent.Length + 1, resultChapter.Length)

'【PDF下載】
Response.Clear()
Response.AddHeader("Content-Disposition", "attachment; filename=Merge.pdf")
Response.ContentType = "application/octet-stream"

Response.OutputStream.Write(mergedPdf, 0, mergedPdf.Length)

Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.Flush()
Response.End()

resultContent = _MemoryStream2.ToArray() Dim mergedPdf(resultChapter.Length + resultContent.Length) As Byte Array.Copy(resultContent, 0, mergedPdf, 0, resultContent.Length) Array.Copy(resultChapter, 0, mergedPdf, resultContent.Length + 1, resultChapter.Length) '【PDF下載】 Response.Clear() Response.AddHeader("Content-Disposition", "attachment; filename=Merge.pdf") Response.ContentType = "application/octet-stream" Response.OutputStream.Write(mergedPdf, 0, mergedPdf.Length) Response.OutputStream.Flush() Response.OutputStream.Close() Response.Flush() Response.End()