iTextSharpを使ってPDF分割アプリケーションを作成する

iTextSharpはiTextをC#に移植したオープンソースのライブラリです。
.netアプリケーションでPDF操作が必要な場合、iTextSharpを利用する事で簡単にPDF操作が出来るようになります。

iTextSharpを利用して複数ページで構成されたPDFファイルを複数の単一ページに分解してPDFファイルとして保存するアプリケーションを作ってみました。

[ダウンロードが見つかりません]

iTextSharpを日本語で利用する上で、以下のリファレンスを参照すると非常に勉強になります。
iTextSharp クラスライブラリリファレンス

以下、vb.netのソースコードです。

Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Module Module1

    Sub Main()
        'コマンドラインを配列で取得する
        Dim cmds As String() = System.Environment.GetCommandLineArgs()

        If cmds.Length > 1 Then
            For i = 1 To cmds.Length - 1
                Dim Path As String = cmds(i)

                'ファイルが存在する場合、処理を実行する。
                If File.Exists(Path) Then
                    Dim sParentName As String = System.IO.Path.GetDirectoryName(Path)
                    Dim sFileName As String = System.IO.Path.GetFileNameWithoutExtension(Path)
                    Dim sExtension As String = System.IO.Path.GetExtension(Path)

                    Call SplitPDF(sParentName, sFileName, sExtension)
                End If
            Next
        Else
            Console.WriteLine("引数にPDFファイルを指定するか、ファイルをドラッグ&ドロップしてください。")
        End If
    End Sub


    ''' <summary>
    ''' PDFファイルを単一ページPDFに分割する
    ''' </summary>
    ''' <param name="sParentName">親ディレクトリ名</param>
    ''' <param name="sFileName">ファイル名</param>
    ''' <param name="sExtension">拡張子</param>
    Sub SplitPDF(ByVal sParentName As String, ByVal sFileName As String, ByVal sExtension As String)

        Try
            ' リーダー作成
            Dim reader As PdfReader = New PdfReader(sParentName & "\" & sFileName & sExtension)

            'ページ数の取得
            Dim iStartPageNumber As Integer = 1
            Dim iEndPageNumber As Integer = reader.NumberOfPages()

            Console.WriteLine("指定されたPDFファイルから{0}ページ見つかりました。", iEndPageNumber)

            For i As Integer = iStartPageNumber To iEndPageNumber

                'ドキュメントを作成
                Dim doc As Document = New Document()

                '分割後のPDFを保存するディレクトリ名
                Dim sSaveFolerName As String = sParentName & "\" & sFileName

                'フォルダが存在しなかった場合、新規作成する
                If Not File.Exists(sSaveFolerName) Then
                    System.IO.Directory.CreateDirectory(sSaveFolerName)
                End If

                ' 出力ファイルを開く
                Console.WriteLine("{0}を書き出しています。", sFileName & "_" & i & sExtension)
                Dim writer As PdfWriter = PdfWriter.GetInstance(doc, New FileStream(sSaveFolerName & "\" & sFileName & "_" & i & sExtension, FileMode.Create))

                ' ドキュメントオープン
                doc.Open()

                ' ContentByte作成
                Dim cb As PdfContentByte = writer.DirectContent

                doc.SetPageSize(reader.GetPageSizeWithRotation(1))
                doc.NewPage()

                ' ページサイズ設定
                doc.SetPageSize(reader.GetPageSizeWithRotation(i))
                ' ページ作成
                doc.NewPage()
                ' ページ取得
                Dim page As PdfImportedPage = writer.GetImportedPage(reader, i)
                ' ページ向きに合わせてページ追加
                Dim iRotation As Integer = reader.GetPageRotation(i)
                If iRotation = 90 OrElse iRotation = 270 Then
                    cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height)
                Else
                    cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0)
                End If

                ' コミットする
                doc.Close()

            Next

        Catch ex As Exception
            Console.WriteLine(ex.Source)
            Console.WriteLine(ex.Message)
        End Try

    End Sub
End Module

1 Comment

トリサラ

「ページ向きに合わせてページ追加」のところは、以下のようにする必要がありました。
180度または270度回転したPDFをページ分割したときに、元通りの回転状態が保持されるようになります。
Dim iRotation As Integer = reader.GetPageRotation(i)
Dim pageWidth As Integer = reader.GetPageSizeWithRotation(i).Width
Dim pageHeight As Integer = reader.GetPageSizeWithRotation(i).Height
If iRotation = 0 Then
cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0)
ElseIf iRotation = 90 Then
cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, pageHeight)
ElseIf iRotation = 180 Then
cb.AddTemplate(page, -1.0F, 0, 0, -1.0F, pageWidth, pageHeight)
ElseIf iRotation = 270 Then
cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, pageWidth, 0)
End If

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です