WindowsのコマンドラインでPDFを処理するには
- コマンドライン対応のアプリケーションを使用する。(pdftk.exe)
- PowerShellでPDFを操作できるライブラリを使用する。(iTextSharp)
の2つがあります。
どちらでも操作感や機能に差はなく、自動化をする上では障壁とならないと思いますが、今回はPowerShellでPDFの処理ができるライブラリを使用した方法を紹介します。
iTextSharpのインストール
iTextSharpは以下のURLからダウンロードできます。
iTextSharp, a .NET PDF library | SourceForge.net
https://sourceforge.net/projects/itextsharp/
ファイルの中身は色々と入っておりますが、今回は基本的な操作のみということで、"itextsharp-dll-core"のみ使用します。
itextsharp-dll-coreを展開してフォルダをCドライブ直下にコピーしました。置く場所はどこでも良いですが、中のDLLファイルはPowerShellのスクリプトから読み込みます。
DLL読み込みのエラー
Windowsのバージョンによって挙動が違うのか、Windows10ではDLLを置いただけではスクリプト実行時に以下のようなエラーが発生しました。
"1" 個の引数を指定して "LoadFrom" を呼び出し中に例外が発生しました: "ファイルまたはアセンブリ 'file:///C:\itextsharp-dll-core\itextsharp.dll'、またはその依存関係の 1 つが読み込めませんでした。操作はサポートされません。 (HRE
SULT からの例外:0x80131515)"
発生場所 C:\Users\usuikanae\Documents\PowerShell Practice\pdf_control\joint_pdf.ps1:2 文字:1
+ [System.Reflection.Assembly]::LoadFrom("C:\itextsharp-dll-core\itexts ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : FileLoadException
どうもインターネットからダウンロードした得体の知れないDLLはあらかじめOSが利用できないようにブロックしているようです。プロパティからブロックの解除を行う必要があります。
PDFの結合するスクリプトのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#itextsharp.dllのロード [System.Reflection.Assembly]::LoadFrom("C:\itextsharp-dll-core\itextsharp.dll"); #現在のディレクトリを取得 $currentDir = Get-Location Set-Location $currentDir #出力用の新しいPDFを現在のディレクトリに作成 $newPdfPath = Join-Path $currentDir "new.pdf" $fileStream = New-Object System.IO.FileStream($newPdfPath, [System.IO.FileMode]::OpenOrCreate); $newPdf = New-Object iTextSharp.text.pdf.PdfCopyFields($fileStream); #引数のpdf書類を取得 foreach($file in $args) { #引数に現在のディレクトリを結合 $filePath = Convert-Path $file #結合するPDFを読み込む $pdf = New-Object iTextSharp.text.pdf.PdfReader($filePath); #新しいPDFファイルに既存のPDFを追加 $newPdf.AddDocument($pdf); } #newPdfのClose $newPdf.Close(); #fileStreamのClose $fileStream.Close(); |
実行時に引数として結合したいPDFファイルを全て指定すると全て結合されたPDFファイルが生成される。