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

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)で行っております。
もちろん保証はしませんけどね!

コメント

このブログの人気の投稿

【VS2019】ある日急にデザイナーがエラーを吐いた時の対処メモ

仕事でVisual Studio 2019 Communityを使う時があるのですが、ある時、前日まで普通に使えていたプロジェクトのうち、フォームのデザイナがエラーを起こしてしまいました。 --- データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。 このファイルのデザイナーに、デザインできるクラスがないため、デザイナーを表示できませんでした。 --- こんなメッセージが。 結論から言うと直ったのですが、この現象への対処法を調べましたのでまとめます。

今更ながらマキシマムザホルモン「絶望ビリー」出演者が誰なのか調べてみた

ふと思い立ってマキシマムザホルモンの「絶望ビリー」のPVに登場する人たちを調べてみました。 ・・・といっても下記の二組(というか一組と一人)は不明なままです。 【不明な人たち】 ・アコギの二人組 ・フェンスを叩いて叫んでいるマッチョな人 ・アナウンサー ・クイズ番組の回答者(一人は亮君だけど) 【判明した出演者】 ・ビジュアル系のバンド・・・ PARFAIT (複数のサイトで確認。たぶん合ってる) ・アイドル系の女の子・・・ 辰巳 奈都子 ・ヒップホップ系の二人組・・・アンディとジョージ☆(というらしい。真偽不明) ・ギターを弾いて歌っている女性・・・ KIKU ( THE SWEET TRIP というバンドのvo/g) というわけで、全員はわかりませんでした。 個人的にはKIKUという人のギターの弾き方が気になっていたので、名前がわかって良かったですw

シーランド公国の爵位をとってみた

ほとんど出落ちみたいな話ですけどね・・。 ネット上ではフツーに情報としてありますが、 シーランド公国 という(自称)国家の爵位を取ってみました。