管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

PDFSharpでPDFのページ数をカウントしたい(Powershell)

Powershell+PDFSharpでPDFのページ数をカウントしたかったのでやってみたメモ。
PDFSharpはPDFファイルを処理するためのオープンソースの.NETライブラリです。
2020/3/28現在、1.32がstableなんですかね。
http://www.pdfsharp.net/

実行環境

PS C:\Users\hoge> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.18362.628
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.628
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
PS C:\Users\hoge>  

ソース

DLLについてはあらかじめダウンロードして、同階層に配置しておきます。

param(
    [string]$filepath    # 処理対象パス(ディレクトリでもファイル名でも受け付ける)
)

# エラーがあった時点で処理終了
$ErrorActionPreference = "stop"

# DLLファイル名
$dll_name = "PdfSharp.dll"

function script:LoadDll() {
    # DLLはスクリプトと同階層に置くことを想定しているためカレントパスを取得
    $current_path = (Convert-Path .)
    $dll_path = Join-Path $current_path $dll_name
    #DLL読み込み
    [void][Reflection.Assembly]::LoadFile($dll_path)
}

function script:Main($filepath) {
    # 再帰的にファイルを取得
    $files = (Get-ChildItem -Recurse $filepath | Where-Object { $_.Attributes -ne "Directory" })

    foreach ($file in $files) {
        # 拡張子がPDF以外であれば後続処理をスキップ
        if ($file.Extension -ne ".pdf") {
            continue
        }

        $input_pdf = [PdfSharp.Pdf.IO.PdfReader]::Open($file.Fullname, [PdfSharp.Pdf.IO.PdfDocumentOpenMode]::Import);
        $page_count = $input_pdf.PageCount
        write-host $file.Fullname "`t" $page_count
    }
}

LoadDll
Main $filepath

実行例

PS C:\Users\hoge\Documents\powershells\count_pdf_pages> .\count_pdf_pages.ps1 -filepath C:\Users\hoge\Documents\powershells\count_pdf_pages\

C:\Users\hoge\Documents\powershells\count_pdf_pages\sample.pdf    119
PS C:\Users\hoge\Documents\powershells\count_pdf_pages>

参考にしました

PDFSharpでページ数を取得する

http://www.pdfsharp.net/wiki/SplitDocument-sample.ashx