PowerShellスクリプトで複数のPDFファイルを結合する方法

目次

導入文章


PowerShellを使用すると、複数のPDFファイルを簡単に結合し、一つのPDFにまとめることができます。手動で行う場合は時間がかかりますが、スクリプトを使うことで効率よく処理を自動化できます。本記事では、PowerShellスクリプトを用いてPDFファイルを結合する手順を具体的に解説します。特に、PDFを複数扱う場面で便利な方法や、実行時の注意点についても触れ、スクリプト初心者でも理解できるように説明します。

PowerShellの基本設定


PowerShellを使用してPDFファイルを操作するためには、まず基本的な設定を行う必要があります。通常、PowerShellはWindowsに標準搭載されていますが、スクリプトでPDFファイルを扱うためには追加のモジュールやツールが必要になる場合があります。ここでは、必要な準備や設定方法について説明します。

PowerShellのバージョン確認


まず、PowerShellのバージョンを確認しましょう。古いバージョンでは一部のコマンドや機能がサポートされていない場合があります。以下のコマンドを実行して、バージョンを確認します。

$PSVersionTable.PSVersion

バージョンが5.0以上であれば、基本的には問題なくスクリプトを実行できます。それ以下の場合は、PowerShellのアップデートを検討しましょう。

実行ポリシーの確認


PowerShellでスクリプトを実行するためには、実行ポリシーを確認し、必要に応じて変更する必要があります。スクリプトの実行ポリシーが制限されている場合、次のようにポリシーを変更します。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

このコマンドにより、インターネットからダウンロードしたスクリプトの実行が許可されます。実行ポリシーを変更する際は、セキュリティに注意を払い、信頼できるソースからのスクリプトのみ実行するようにしましょう。

モジュールのインストール準備


PDFファイルを結合するために、PowerShell専用のモジュールをインストールする必要があります。後述するように、PdfSharpやPdfiumなどがよく使われます。モジュールのインストールには、Install-Moduleコマンドを使用します。

この基本設定を終えることで、次のステップに進んでPDFファイルを操作する準備が整います。

必要なモジュールのインストール


PowerShellでPDFファイルを結合するためには、外部ライブラリやモジュールをインストールする必要があります。ここでは、代表的なPDF操作用のPowerShellモジュールを紹介し、インストール手順を説明します。

PdfSharpモジュール


PdfSharpは、PDFファイルを読み書きするための非常に人気のあるライブラリです。PowerShell用のラッパーが存在し、これを使うことでPDFファイルの結合や分割、内容の変更などを簡単に実行できます。

以下のコマンドを使って、PdfSharpモジュールをインストールします:

Install-Module -Name PdfSharp -Force -Scope CurrentUser

-Forceオプションは、すでにインストールされているバージョンを強制的に上書きするため、最新のバージョンを使用できます。-Scope CurrentUserは、現在のユーザーにのみインストールするオプションです。

Pdfiumモジュール


Pdfiumは、Googleが提供するオープンソースのPDFレンダリングエンジンで、PDFファイルを操作するための軽量なライブラリです。Pdfiumを使うと、PDFのページを簡単に結合できます。

Pdfiumモジュールは、次のコマンドでインストールできます:

Install-Module -Name Pdfium -Force -Scope CurrentUser

このモジュールもPdfSharpと同様に、インストール後すぐに使用可能です。

モジュールのインストール後の確認


インストールが完了したら、次のコマンドを使ってインストールしたモジュールを確認しましょう:

Get-InstalledModule

ここで、PdfSharpやPdfiumがリストに表示されていれば、インストールは成功です。

モジュールのインポート


モジュールをインストールした後は、PowerShellセッションでそれらをインポートする必要があります。以下のコマンドを実行して、必要なモジュールをインポートします:

Import-Module PdfSharp

または、

Import-Module Pdfium

これで、PDFファイルを操作する準備が整いました。次に、実際にPDF結合のスクリプトを作成するステップに進みます。

PowerShellスクリプトの基本構造


PowerShellを使用してPDFファイルを結合するには、まず基本的なスクリプトの構造を理解することが重要です。ここでは、PDF結合スクリプトの流れを簡単に説明し、各部分がどのように連携するかを理解しましょう。

スクリプトの全体的な流れ


PDF結合のPowerShellスクリプトは、大きく分けて以下のステップで構成されます:

  1. PDFファイルの読み込み:結合するPDFファイルを指定します。
  2. PDFのページを結合:読み込んだ各PDFファイルのページを順番に結合します。
  3. 結合後のPDFを保存:結合した結果を新しいPDFファイルとして保存します。

基本的なスクリプト例


次に、実際にPowerShellスクリプトでPDFを結合する基本的な構造を見ていきましょう。以下のコードは、PdfSharpモジュールを使用した例です:

# 必要なモジュールをインポート
Import-Module PdfSharp

# 結合するPDFファイルのパスを指定
$pdfFiles = @("C:\path\to\file1.pdf", "C:\path\to\file2.pdf")

# 新しいPDFファイルを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

# 各PDFファイルを読み込んでページを追加
foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)
    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

# 結合したPDFを保存
$mergedPdf.Save("C:\path\to\merged_output.pdf")

スクリプトの説明

  • Import-Module PdfSharp: PdfSharpモジュールをインポートし、PDF操作の準備をします。
  • $pdfFiles: 結合するPDFファイルのパスを配列として定義します。この例ではfile1.pdfとfile2.pdfを結合しています。
  • New-Object PdfSharp.Pdf.PdfDocument: 新しい空のPDFドキュメントを作成します。ここに結合後のページを追加していきます。
  • $pdf = [PdfSharp.Pdf.PdfReader]::Open(...): 各PDFファイルを開きます。
  • $mergedPdf.AddPage($page): 各ページを新しいPDFに追加していきます。
  • $mergedPdf.Save(...): 最後に結合したPDFを指定した場所に保存します。

スクリプトの拡張性


この基本的なスクリプトは簡単にカスタマイズできます。たとえば、指定するPDFファイルをフォルダ内のすべてのPDFに変更したり、特定のページ範囲だけを結合したりすることができます。また、スクリプト内でエラーハンドリングを追加して、問題が発生した場合に通知を行うようにすることも可能です。

この基本構造を理解することで、さまざまなPDF結合のニーズに合わせたスクリプトを作成できるようになります。

PDF結合の実装


ここでは、実際に複数のPDFファイルを結合するPowerShellスクリプトの具体例を紹介します。PdfSharpモジュールを使用して、複数のPDFファイルを1つのファイルにまとめる方法を見ていきましょう。

結合するPDFファイルの準備


まず、結合したいPDFファイルが保存されている場所を確認します。この例では、C:\PDFsフォルダ内にあるすべてのPDFファイルを結合します。

# 結合するPDFファイルのパスを指定(フォルダ内のすべてのPDFを対象)
$pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf"

このコマンドは、C:\PDFsフォルダ内にあるすべてのPDFファイルを取得し、$pdfFiles配列に格納します。

PDF結合の実行


次に、これらのPDFファイルを順番に結合していきます。PdfSharpを使用して、各PDFファイルを1ページずつ新しいPDFに追加します。

# 新しい空のPDFを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

# 各PDFファイルを読み込んで結合
foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    # 各ページを新しいPDFに追加
    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

# 結合したPDFを保存
$mergedPdf.Save("C:\PDFs\merged_output.pdf")

スクリプトの詳細説明

  • Get-ChildItem "C:\PDFs" -Filter "*.pdf": 指定したフォルダ内のPDFファイルをすべて取得します。
  • $mergedPdf = New-Object PdfSharp.Pdf.PdfDocument: 新しい空のPDFファイルを作成します。ここに他のPDFのページを追加していきます。
  • $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import): 各PDFファイルを読み込み、$pdfオブジェクトとして保持します。
  • $mergedPdf.AddPage($page): 読み込んだ各ページを、新しく作成したPDFに順番に追加します。
  • $mergedPdf.Save("C:\PDFs\merged_output.pdf"): 最後に、結合したPDFをmerged_output.pdfという名前で保存します。

ファイルの命名規則


保存される結合後のPDFファイル名は、merged_output.pdfとなっていますが、日付やタイムスタンプを追加してファイル名を一意にすることもできます。例えば、次のようにファイル名を変更できます:

$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outputFile = "C:\PDFs\merged_output_$timestamp.pdf"
$mergedPdf.Save($outputFile)

これにより、毎回異なる名前で保存され、ファイルの上書き防止になります。

まとめ


このスクリプトを実行すると、指定したフォルダ内のPDFファイルが順番に結合され、1つのPDFファイルとして保存されます。複数のPDFファイルを効率的に結合するための基本的な実装方法が理解できたと思います。この方法を応用すれば、ページ順の変更や特定のページだけを結合するなど、さらに複雑な操作にも対応できます。

スクリプト実行の準備


PowerShellスクリプトを実行する前に、いくつかの準備を行う必要があります。ここでは、PDFファイルを結合するスクリプトを問題なく実行するために必要な手順とファイルパスの設定方法を説明します。

ファイルパスの確認


スクリプトを実行する前に、結合したいPDFファイルが正しいフォルダに保存されていることを確認します。例えば、C:\PDFsフォルダ内にfile1.pdf、file2.pdfなどのPDFファイルを保存しておきます。

# 例: フォルダ内にあるPDFファイルを対象とする場合
$pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf"

このように、ファイルパスが正しいことを確認しましょう。Get-ChildItemコマンドで指定したパス内のPDFファイルを取得し、後で結合処理に利用します。

PowerShellスクリプトの保存


次に、作成したPowerShellスクリプトを保存します。例えば、以下のようにスクリプトをmerge-pdf.ps1という名前で保存します:

  1. PowerShell ISE(または任意のエディタ)を開きます。
  2. スクリプトを入力します。
  3. merge-pdf.ps1という名前で保存します。
# スクリプト内容(先に示した内容と同じ)
$pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf"
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)
    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outputFile = "C:\PDFs\merged_output_$timestamp.pdf"
$mergedPdf.Save($outputFile)

スクリプトの保存場所と実行権限


スクリプトファイルは任意の場所に保存できますが、わかりやすい場所に保存しておくと後で実行しやすくなります。例えば、C:\Scripts\merge-pdf.ps1に保存するのが一般的です。

また、実行ポリシーによっては、スクリプトが実行できない場合があります。スクリプトを実行する前に、以下のコマンドを実行して、実行ポリシーを確認し、必要に応じて変更します:

# 実行ポリシーの確認
Get-ExecutionPolicy

# 実行ポリシーを変更(必要に応じて)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

RemoteSigned設定にすることで、ローカルで作成したスクリプトは実行可能になります。セキュリティには十分注意しましょう。

PDFファイルの確認


スクリプトを実行する前に、結合したいPDFファイルが正しいフォルダにあり、アクセスできる状態か確認します。アクセスできない場合、ファイルパスに誤りがあるか、ファイルがロックされている可能性があります。

# フォルダ内のPDFファイルを確認
Get-ChildItem "C:\PDFs" -Filter "*.pdf"

ファイルが正しく表示されることを確認してください。

スクリプトの実行


準備が整ったら、PowerShellを開き、先程保存したスクリプトを実行します。スクリプトを実行するには、以下のようにPowerShellでスクリプトのパスを指定します:

# スクリプトの実行
& "C:\Scripts\merge-pdf.ps1"

これで、指定したフォルダ内のPDFファイルが結合され、指定した場所に新しいPDFファイルが生成されます。

実行結果の確認


スクリプトが正常に実行されると、指定した保存先に結合されたPDFが生成されます。例えば、C:\PDFs\merged_output_20230101_120000.pdfのような名前で保存されます。生成されたPDFファイルを開き、結合された内容が正しいことを確認します。

これで、スクリプトの実行準備が整い、PDFファイルの結合が自動化できます。

エラーハンドリングとトラブルシューティング


PowerShellスクリプトでPDFを結合する際には、いくつかのエラーが発生することがあります。エラーが発生した場合でも、適切なエラーハンドリングを行うことで、スクリプトが途中で止まらずにエラーを通知し、問題を特定しやすくなります。ここでは、PowerShellスクリプトでのエラーハンドリングの方法と、よくあるトラブルシューティングの手順を紹介します。

基本的なエラーハンドリングの仕組み


PowerShellでは、try-catchブロックを使ってエラーハンドリングを行うことができます。これにより、エラーが発生した場合にエラーメッセージを表示したり、エラーの内容をログとして記録することができます。

try {
    # 結合するPDFファイルを読み込む
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    # 結合処理
    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
} catch {
    Write-Host "エラーが発生しました: $_"
    # エラーログを保存することも可能
    Add-Content -Path "C:\error_log.txt" -Value "$(Get-Date) - エラー: $_"
}

tryブロック内のコードが正常に実行されれば、そのまま処理が進みます。しかし、何らかの理由でエラーが発生した場合、catchブロックが実行され、エラーメッセージが表示されます。また、エラーメッセージをログファイルに保存することもできます。

よくあるエラーとその対処法

  1. ファイルパスのエラー
    • エラー内容: 指定されたPDFファイルが存在しない、またはアクセスできない場合、FileNotFoundExceptionが発生します。
    • 対処法: ファイルパスを確認し、正しいパスを指定しているか、アクセス権限が正しいかを確認します。ファイル名やフォルダ名にスペースが含まれている場合は、引用符(" ")で囲むことを忘れずに。
    $pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf"
  2. PdfSharpモジュールのエラー
    • エラー内容: PdfSharpモジュールが正しくインストールされていない場合や、PdfReaderオブジェクトが存在しない場合、エラーが発生します。
    • 対処法: 必要なモジュールがインストールされているかを確認します。必要に応じてモジュールを再インストールします。
    Install-Module -Name PdfSharp -Force -Scope CurrentUser
  3. PDF読み込みエラー
    • エラー内容: 開こうとしているPDFファイルが壊れている場合、読み込み時にエラーが発生することがあります。
    • 対処法: PDFファイルが正常であることを確認します。壊れたPDFファイルを開くとエラーが発生するため、別のPDFファイルを使用するか、PDFファイルの修復ツールを使用して修復します。
  4. ファイル保存エラー
    • エラー内容: 保存先のフォルダにアクセス権限がない場合、ファイル保存時にエラーが発生することがあります。
    • 対処法: 保存先フォルダのパスを確認し、必要なアクセス権限を付与します。また、ファイル名に特殊文字や空白が含まれていないかを確認します。
    $outputFile = "C:\PDFs\merged_output_$timestamp.pdf"
  5. 実行ポリシーエラー
    • エラー内容: スクリプトが実行できない場合、PowerShellの実行ポリシーが制限されていることがあります。
    • 対処法: 実行ポリシーを確認し、必要に応じて変更します。
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

エラーの詳細情報を表示する


エラーが発生した際に、詳細なエラーメッセージを表示することで、問題を特定しやすくなります。$Error変数を使用して、エラーの詳細情報を取得することができます。

try {
    # 結合処理など
} catch {
    Write-Host "エラーが発生しました: $_"
    Write-Host "エラーの詳細: $($Error[0].ToString())"
}

これにより、エラーメッセージだけでなく、エラーコードや追加情報も表示されるため、より正確に問題を特定することができます。

まとめ


PowerShellスクリプトを使ってPDF結合を行う際に発生する可能性のあるエラーについて学びました。try-catchを使ったエラーハンドリングを行うことで、エラーが発生した際にもスクリプトが適切に処理を停止し、エラーメッセージやログを出力することができます。これにより、スクリプトの実行時に発生する問題を迅速に解決できるようになります。

スクリプトの最適化とパフォーマンス向上


複数のPDFファイルを結合するPowerShellスクリプトでは、結合するPDFファイルの数やファイルサイズによってパフォーマンスに影響が出ることがあります。ここでは、スクリプトの最適化方法や、処理速度を向上させるための手法について解説します。

1. 必要なPDFファイルだけを読み込む


大量のPDFファイルを結合する場合、すべてのファイルを一度に読み込むとメモリ使用量が増加し、処理速度が遅くなることがあります。必要なPDFファイルのみを選別して結合処理を行うことで、無駄な処理を避け、パフォーマンスを向上させることができます。

# 必要なPDFファイルだけを選別(例えば、更新日が新しいファイルのみを対象)
$pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf" | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) }

上記のように、Where-Objectを使って、特定の条件に合致するPDFファイルのみを対象に処理を行うことで、無駄なファイルの処理を省くことができます。

2. メモリ使用量の削減


複数のPDFを結合する際、大きなPDFを繰り返し読み込むとメモリ消費が増えます。スクリプトを最適化してメモリ使用量を削減する方法として、逐次的にページを処理する方法があります。以下のように、ページを1ページずつ追加していくことで、メモリ使用量を抑えつつ処理を行えます。

# 新しいPDFドキュメントを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

この方法では、すべてのページを一度にメモリ上に読み込まず、1ページずつ処理を行います。これにより、メモリの消費を抑えることができます。

3. 並列処理の活用


複数のPDFファイルを結合する場合、特に大きなPDFファイルを扱っているときには、処理速度が遅くなることがあります。PowerShellでは、ForEach-Object -Parallelを使って並列処理を行うことで、処理を高速化することができます。これにより、複数のPDFを同時に結合して処理時間を短縮できます。

# PowerShell 7 以降で並列処理を活用する例
$pdfFiles | ForEach-Object -Parallel {
    param ($file)

    $mergedPdf = New-Object PdfSharp.Pdf.PdfDocument
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }

    $outputFile = "C:\PDFs\merged_output_$(Get-Date -Format 'yyyyMMdd_HHmmss').pdf"
    $mergedPdf.Save($outputFile)
} -ArgumentList $_

-Parallelを使って各PDFファイルを並列に処理することで、複数のPDFの結合処理を並行して行うことができ、全体の処理時間を大幅に短縮できます。

4. 一時ファイルの使用


結合処理を行う際に、必要以上に大きなメモリを消費しないように、処理中のファイルを一時ファイルとしてディスクに保存することを検討できます。これにより、メモリ消費を減らし、スクリプトがシステムのパフォーマンスに与える影響を最小限に抑えます。

# 一時ファイルを使用して処理を行う
$tempPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $tempPdf.AddPage($page)
    }

    # 一時ファイルに保存
    $tempFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "temp_$(Get-Date -Format 'yyyyMMdd_HHmmss').pdf")
    $tempPdf.Save($tempFile)

    # 結合処理後、一時ファイルを削除
    Remove-Item $tempFile
}

一時ファイルをディスクに保存することで、メモリ使用量が増えすぎることを防ぎ、システムリソースを適切に管理できます。

5. ファイルの圧縮


結合後のPDFファイルが大きくなりすぎると、保存や転送時に問題が生じることがあります。このような場合、PdfSharpだけでなく、Ghostscriptなどを使って、PDFファイルの圧縮を行うことも効果的です。圧縮を行うことで、ファイルサイズを小さくして効率的に処理することができます。

# Ghostscriptを使ってPDFファイルを圧縮
Start-Process "gswin64c.exe" -ArgumentList "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=C:\PDFs\compressed_output.pdf C:\PDFs\merged_output.pdf"

Ghostscriptを使うことで、PDFの解像度や画像を圧縮して、ファイルサイズを削減することが可能です。

まとめ


PowerShellスクリプトを最適化するためには、必要なPDFファイルのみを処理対象とし、メモリ消費を抑える方法や並列処理を活用することが重要です。また、一時ファイルを使用して処理することで、メモリ使用量を最小限に抑えつつ、効率的にPDFファイルを結合することができます。さらに、生成されたPDFファイルの圧縮を行うことで、ファイルサイズを削減し、保存や転送の際の負担を軽減できます。これらの手法を活用することで、パフォーマンスの向上と処理効率の改善が図れます。

応用例: 複数のPDFファイルを結合してカスタマイズする


PowerShellスクリプトを使用してPDFファイルを結合する際、単に複数のPDFを1つにまとめるだけでなく、さらにカスタマイズした処理を追加することも可能です。例えば、結合したPDFの特定のページを削除したり、特定の順番でファイルを結合することができます。ここでは、カスタマイズされたPDF結合スクリプトのいくつかの応用例を紹介します。

1. 特定ページを削除する


場合によっては、PDFファイルを結合する際に特定のページを削除したいことがあります。PowerShellとPdfSharpを使って、結合するPDFファイルから特定のページを削除する方法を紹介します。

# 新しいPDFドキュメントを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    # 例えば、最初のページを削除
    for ($i = 1; $i -lt $pdf.Pages.Count; $i++) {
        $mergedPdf.AddPage($pdf.Pages[$i])
    }
}

# 結合したPDFを保存
$mergedPdf.Save("C:\PDFs\merged_output_with_deleted_pages.pdf")

この例では、結合するPDFファイルの最初のページを削除し、それ以降のページのみを新しいPDFドキュメントに追加しています。特定のページ(例えば、奇数ページや偶数ページ)を削除したい場合にも、条件を変更して柔軟に対応できます。

2. ファイルの順番を変更して結合する


PDFファイルを結合する際、順番を変更したい場合もあります。たとえば、ファイル名や作成日時に基づいて結合順を決定することができます。以下のスクリプトでは、PDFファイルを作成日順に並べ替えてから結合しています。

# 作成日時で並べ替え
$pdfFiles = Get-ChildItem "C:\PDFs" -Filter "*.pdf" | Sort-Object LastWriteTime

# 新しいPDFドキュメントを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

# 結合したPDFを保存
$mergedPdf.Save("C:\PDFs\merged_sorted_output.pdf")

このスクリプトでは、Sort-Objectコマンドレットを使って、ファイルの作成日(LastWriteTime)に基づいてPDFファイルを並べ替えています。これにより、指定した順番でPDFファイルを結合することができます。

3. PDFファイルにカスタムメタデータを追加する


PDFファイルにカスタムメタデータ(タイトル、著者、作成日など)を追加することも可能です。以下の例では、結合後のPDFファイルにカスタムタイトルと著者情報を追加しています。

# 新しいPDFドキュメントを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

# メタデータの追加
$mergedPdf.Info.Title = "カスタムタイトル"
$mergedPdf.Info.Author = "作成者名"
$mergedPdf.Info.Subject = "結合されたPDFドキュメント"

# 結合したPDFを保存
$mergedPdf.Save("C:\PDFs\merged_with_metadata.pdf")

このスクリプトでは、結合後のPDFドキュメントにTitle、Author、Subjectのメタデータを設定しています。これにより、PDFファイルを後で検索しやすくすることができます。

4. PDFファイルにページ番号を追加する


PDFにページ番号を追加することも可能です。PdfSharpを使用して、ページの下部にページ番号を追加する方法を紹介します。

# 新しいPDFドキュメントを作成
$mergedPdf = New-Object PdfSharp.Pdf.PdfDocument

foreach ($file in $pdfFiles) {
    $pdf = [PdfSharp.Pdf.PdfReader]::Open($file.FullName, [PdfSharp.Pdf.PdfDocumentOpenMode]::Import)

    foreach ($page in $pdf.Pages) {
        $mergedPdf.AddPage($page)
    }
}

# ページ番号を追加
$pageIndex = 1
foreach ($page in $mergedPdf.Pages) {
    $gfx = [PdfSharp.Drawing.XGraphics]::FromPdfPage($page)
    $font = New-Object PdfSharp.Drawing.XFont("Arial", 12)
    $gfx.DrawString("Page $pageIndex", $font, [PdfSharp.Drawing.XBrushes]::Black, 500, 800)
    $pageIndex++
}

# 結合したPDFを保存
$mergedPdf.Save("C:\PDFs\merged_with_page_numbers.pdf")

このスクリプトでは、結合後のPDFにページ番号を追加しています。ページ番号はPDFの下部に表示され、各ページに番号を付けることができます。

まとめ


PowerShellを使用してPDFを結合する際には、基本的な結合処理に加え、特定のページの削除や結合順の変更、カスタムメタデータの追加、ページ番号の挿入など、さまざまなカスタマイズが可能です。これらの技術を組み合わせることで、ユーザーの要件に合わせた柔軟なPDF結合ができるようになります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次