スキップしてメイン コンテンツに移動

iTextSharpでpdfの合成

合成・・・というと、ちょっと表現がおかしいのかもしれません。
例えば

  • 共通のヘッダとするpdf
  • コンテンツpdf
があり、これらをくっつけたい。
イメージとすると
ヘッダpdf

コンテンツpdf(複数ページ)
の、赤の部分にデータがあり、これを合成。
ただし、どちらかをウォーターマーク(透かし)で入れるのは避けたい、という要件です。
これが正しい方法なのかどうかわかりませんが、単に空白ページを作成し、両方のpdfをテンプレートとしてインポートする、とすることで実現できました。
制限としては、これら処理対象のpdfはページサイズや向きが同じでなければならない・・・と思います(未確認)。

ソースコードは以下の通り。
---

Imports iTextSharp.text
Imports iTextSharp.text.pdf

    ''' <summary>
    ''' pdf合成
    ''' </summary>
    ''' <param name="pSrcFilePath">ベースとするpdfファイル(複数ページ化)</param>
    ''' <param name="pTemplateFilePath">埋め込みたい内容が入っているpdfファイル(1ページのみ)</param>
    ''' <param name="pJoinFilePath">合成された結果のファイル</param>
    ''' <remarks></remarks>
    Public Shared Sub JoinPDF(ByVal pSrcFilePath As String, ByVal pTemplateFilePath As String, ByVal pJoinFilePath As String)
        Dim doc As Document = Nothing
        Dim writer As PdfWriter = Nothing
        Dim idx As Integer = 0

        Dim tmpReader As PdfReader = Nothing
        Dim tmpPage As PdfImportedPage = Nothing

        Dim srcReader As PdfReader = Nothing
        Dim srcPage As PdfImportedPage = Nothing

        Dim pcb As PdfContentByte = Nothing

        Try
        'とりあえずA4で設定しておく
            doc = New Document(PageSize.A4)
            
            '合成結果ファイルへのストリームを開く
            writer = PdfWriter.GetInstance(doc, New System.IO.FileStream(pJoinFilePath, IO.FileMode.Create))
            doc.Open()

'埋め込みたい内容が入っているpdfを開いて、pdfImportedPage、PdfContentByteにセットしておく
            tmpReader = New PdfReader(pTemplateFilePath)
            tmpPage = writer.GetImportedPage(tmpReader, 1)
            pcb = writer.DirectContent

'ベースとするpdfファイルを開く
            srcReader = New PdfReader(pSrcFilePath)

'ベースとするpdfファイルの、全ページを対象に1ページずつ処理をする
            For idx = 0 To (srcReader.NumberOfPages - 1)
           
            'ベースとするpdfファイルから1ページ分の情報を取得
                srcPage = writer.GetImportedPage(srcReader, (idx + 1))
                If (idx > 0) Then
                    doc.NewPage()
                End If
                
                pcb = writer.DirectContent
                pcb.AddTemplate(tmpPage, 0, 0)
                pcb.AddTemplate(srcPage, 0, 0)
            Next

        Catch ex As Exception
            Throw ex
        Finally
            If (Not doc Is Nothing) Then
                doc.Close()
                doc = Nothing
            End If
            If (Not srcReader Is Nothing) Then
                srcReader.Close()
                srcReader = Nothing
            End If
            If (Not tmpReader Is Nothing) Then
                tmpReader.Close()
                tmpReader = Nothing
            End If
            If (Not writer Is Nothing) Then
                writer.Close()
                writer = Nothing
            End If
        End Try
    End Sub


---

何箇所かハードコードしていますが、そこは要件に応じて変えてみてください。
動作確認はVisual Studio 2008(.NET Framework 3.5SP1 + iTextSharp)で行っております。
もちろん保証はしませんけどね!

コメント