Skip to main content

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

Comments

Popular posts / 人気の投稿

ひかりTVのUSB HDDは主電源から再起動しないとだめかもしれない

つい最近、我が家はNTTのひかりTVを導入したのですが、そこで視聴している番組を録画できるようにしようと、USB接続型のHDDを購入しました。
購入したHDDはI-O DATAのHDCR-U1.0というもの。ひかりTVの対応HDD一覧に出てました。

で、早速箱から取り付け。といってもUSBケーブルを差すだけで自動的に認識されます・・・と書いてあるが、認識されない!
「USB HDDが認識されていません」という表示がされるばかり。
リモコンを使ってSTBを再起動してもだめ。
HDDの方は、接続先のSTBに連動して電源のOn/Offが行われているので、少なくとも認識してる模様。つまりケーブルも問題なし。

あーもうここにきてトラブルかよーと思った矢先、嫁がやってきてSTBをいじる。

すると「HDDを初期化しますか?」の表示。

ええー何やったのさ! と思ったら、単に主電源を入れ直しただけとのこと。
私はリモコンで電源のOn/Offを行なっていたのですが、どうもこれは電源ではなくスタンバイだったようです。たぶん。
PCでのプラグ&プレイに慣れてしまった自分にとって「そうだったかー」と妙に納得してしまいました。

というわけで、ひかりTVにUSB HDDを接続しようとしてうまくいかない方は主電源の入れ直しも試してみてください。
ちなみにSTBの機種は三菱のM-IPS200というものでした。

Visual Studioのセットアッププロジェクトで必須コンポーネントをアプリケーションと同じ場所からインストールする場合の設定

つい最近、開発用のPCを変更した時に「あぁこれメモっておけば良かった」と思ったことがあったので。
Visual Studio 2008でアプリのインストーラを作る(セットアッププロジェクト)がありました。
この際、以下の通り注意しなければならない要件がありました。

.NET Framework 3.5などを使うアプリをインストールするインストール対象PCは.NET Frameworkもネット環境もない
つまりアプリと同時に.NET Framework 3.5もインストールする必要があります。
この場合Visual Studioのセットアッププロジェクト内の「プロジェクトのプロパティ」の「必須コンポーネント」のところにある「アプリケーションと同じ場所から必須コンポーネントをダウンロードする」というオプションをチェックすれば良いだけなんですが、デフォルト環境のVisual Studioの場合

「エラー 7 必須コンポーネントのインストール場所が、'コンポーネントの開発元の Web サイト' に設定されていません。項目 [コンポーネント名] のファイル [ファイル名] がディスクに見つかりません。詳細については、ヘルプを参照してください。...
というエラーが出てしまいます。


で、この解決方法。Microsoftのサイトに掲載されています。
http://connect.microsoft.com/VisualStudioJapan/feedback/details/388475/visual-studio-sp1-net-framework-3-5sp1

[S] --- 上記urlを一部引用
この問題を解決する方法としましては、Visual Studio 2008 SP1 の Readme で説明されている手順に従って、.NET Framework 3.5 用の Samesite オプションを有効にすることです。 この解決方法は、Readme の 2.3.1.1 に記載されており、オンラインの Readme は、こちらで見つけることができます: http://download.microsoft.com/download/A/2/8/A2807F78-C861-4B66-9B31-9205C3F22252/VS2008SP1Readme.htm

(翻訳者注: 日…

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

ふと思い立ってマキシマムザホルモンの「絶望ビリー」のPVに登場する人たちを調べてみました。
・・・といっても下記の二組(というか一組と一人)は不明なままです。

【不明な人たち】
・アコギの二人組
・フェンスを叩いて叫んでいるマッチョな人
・アナウンサー
・クイズ番組の回答者(一人は亮君だけど)

【判明した出演者】
・ビジュアル系のバンド・・・PARFAIT (複数のサイトで確認。たぶん合ってる)
・アイドル系の女の子・・・辰巳 奈都子
・ヒップホップ系の二人組・・・アンディとジョージ☆(というらしい。真偽不明)
・ギターを弾いて歌っている女性・・・KIKUTHE SWEET TRIPというバンドのvo/g)

というわけで、全員はわかりませんでした。
個人的にはKIKUという人のギターの弾き方が気になっていたので、名前がわかって良かったですw