PDFを好きに分割したいなぁ…。と考えることがあり
今回はPowerShellとiTextSharpを使用して作ってみました。
ちなみにオンラインツールでAdobeやilovePDFでPDFカットというのがあるようですね!
コードを紹介する前に
itextsharpはライセンスが複雑になってきたそうで、取り扱いに注意する必要があるみたいです。
pdfsharpというのもあるみたいですね!
iTextSharpのライセンスについてはこちらを参考にしました。
今回は作ってみただけなのでこのままコードを紹介します!
フォルダ構成
フォルダ構成はこちらです。
注意点:事前にnewフォルダに同じPDFファイルがある場合は上書きされます。
■どこかのフォルダ
┣■new … 無くても処理中に生成されます
┣・itextsharp.dll
┣・pdf_split.ps1
┗・分割したいPDFファイル
iTextSharpの準備
こちらのページからバージョンを選択します。
ページ下部の「+ Show more」をクリックするとさらにバージョンが出てきます。
「Download package」からインストールしてください。
ファイルが「itextsharp.???.nupkg」でダウンロードされますが、zipファイルなので解凍してください。
出来ない場合はitextsharp.???.nupkgをitextsharp.???.zipに名前を変更すると右クリックでも解凍できると思います。
※ ???はバージョンです。
「itextsharp.???\lib\itextsharp.dll」ファイルを使用するので、
powershellのファイルが置いてある場所にコピーしてください。
■どこかのフォルダ
┣■new … 無くても処理中に生成されます
┣・itextsharp.dll
┣・pdf_split.ps1
┗・分割したいPDFファイル
■:フォルダ
・:ファイル
コード
以下がpdf_split.ps1のコードになります。
解説はコメントに記載しました。
※ $argsというのは引数が入った配列で$args[0]は第1引数になります。
この後実行する際に出てきます。
# 現在のディレクトリを取得
$currentDir = Get-Location
Set-Location $currentDir
# itextsharp.dllのロード
# 絶対パスを記載してください。
[System.Reflection.Assembly]::LoadFrom("C:\???\itextsharp.dll");
# 分割PDFの生成先フォルダパス
if(-! (Test-Path "./new")) {
New-Item new -ItemType Directory
}
$destFolderPath = Join-Path $currentDir "new"
# inputのPDFパスを設定し、readerを生成
$srcPath = $args[0]
$pdfReader = New-Object iTextSharp.text.pdf.PdfReader($srcPath)
# ファイル名(拡張子なし)
$fileName = [System.IO.Path]::GetFileNameWithoutExtension($srcPath)
# ページ数取得し、ページ単位でfor文を回す
$pages = $pdfReader.NumberOfPages
for($page = 1; $page -le $pages; $page++) {
# 出力する分割PDFのファイルパスを設定
$destPath = Join-Path $destFolderPath ($fileName + "_" + $page + ".pdf")
# ファイル生成に必要なオブジェクトを生成
$fileStream = New-Object System.IO.FileStream($destPath, [System.IO.FileMode]::Create)
$document = New-Object iTextSharp.text.Document($pdfReader.GetPageSize($page))
$pdfWriter = [iTextSharp.text.pdf.PdfWriter]::GetInstance($document, $fileStream)
# PDFファイルをオープンし、新規ページを作成
$document.Open()
$document.NewPage() | Out-Null
# ページを読み込み、先ほど作成した新規ページに読み込んだページを書き込みます。
$readPage = $pdfWriter.GetImportedPage($pdfReader, $page)
$pdfWriter.DirectContent.AddTemplate($readPage, 0, 0)
# reader以外のオブジェクトをクローズ
$document.Close()
$fileStream.Close()
$pdfWriter.Close()
}
# 全てのページの処理が完了後readerをクローズ
$pdfReader.Close()
実行
Windows Powershellを起動します。
実行コマンド
cdコマンドでカレントディレクトリを変更
cd ps1ファイルがあるディレクトリ
pdfファイルの絶対パスを引数にpdf_split.ps1を実行
./pdf_split.ps1 "pdfファイルの絶対パス"
これでnewフォルダに分割pdfができあがります!
フォルダ
補足
.Netがないと動かないかもしれませんので、その場合はインストールをお願いします。