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

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

[アプリ]Pushbulletの代替

Pushbullet使えなくなっちゃったんですよね(だいぶ前に プッシュ通知でPCやモバイルなどにファイルやテキストを共有したりすることができる、Pushbulletというアプリがありました。 私は仕事では状況に応じて デスクトップ(Windows10) Chromebook iPad を使っています。 例えばデスクトップのエディタで書いたテキストを、会議で使うためのiPadに送信したりする時に、このPushbulletは重宝していました。 ただ残念ながら、iOS(iPadOS)版は、2020年に公開停止されてしまいました。 それからはicloud.comのテキストメモやGoogle Keepを使ってみたり、Gmailで自分宛に送ってみたりしていたのですが、同期や転送が遅かったりして、今いち使い勝手に悩んでいました。 そんな中、リモート会議の準備をする時にふと思いついて、あらためて調べ直してみました。