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
「ページ向きに合わせてページ追加」のところは、以下のようにする必要がありました。
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