合成・・・というと、ちょっと表現がおかしいのかもしれません。
例えば
''' <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
---
例えば
- 共通のヘッダとするpdf
- コンテンツpdf
があり、これらをくっつけたい。
イメージとすると
ヘッダpdf |
コンテンツpdf(複数ページ) |
の、赤の部分にデータがあり、これを合成。
ただし、どちらかをウォーターマーク(透かし)で入れるのは避けたい、という要件です。
制限としては、これら処理対象のpdfはページサイズや向きが同じでなければならない・・・と思います(未確認)。
ソースコードは以下の通り。
---
---
Imports iTextSharp.text
Imports iTextSharp.text.pdf
''' <summary>
''' pdf合成
''' </summary>
''' <param name="pSrcFilePath">ベースとするpdfファイル(複数ページ化)</param>Imports iTextSharp.text.pdf
''' <summary>
''' pdf合成
''' </summary>
''' <param name="pTemplateFilePath">埋め込みたい内容が入っているpdfファイル(1ページのみ)</param>
''' <param name="pJoinFilePath">合成された結果のファイル</param>
'''
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)で行っております。
もちろん保証はしませんけどね!
コメント