PowerShellからPDFsharpを使ってPDFのプロパティ値を編集する

 Windowsの一般的な環境にあるPowerShell 5.1で、最小の手間でPDFファイルのタイトルやキーワードなどのプロパティ値を編集するスクリプトPDFsharpを使って実現しました。
 最初、PowerShellからPDFを作成編集するDLLとしてiTextSharpが情報として豊富だったのですが、最新版のiText 7のバージョン8系をダウンロードしたところDLLファイルが複数に分かれていて、この時点で手動での導入がめんどうです。ということで一般的なバージョン5系列、iTextSharpに戻って使ってみました。こちらはitextsharp.dllひとつあれば使えそうとの触れ込み。ちなみにバージョン5系列は開発が終わって、今後はセキュリティ関連のメンテナンスのみとのことです。
 それでPowerShellで使ってみようと

Add-Type -Path "C:\bat\itextsharp.dll"

と実行すると以下のエラーが出ます。

Add-Type : 要求された型のうち 1 つまたは複数を読み込めませんでした。詳細については、LoaderExceptions プロパティを取得してください。

 このメッセージで検索すると、こちらのページが見つかりました。参考にさせてもらってエラーが出たあとに

$error[0].Exception.GetBaseException().LoaderExceptions

を入力すると

ファイルまたはアセンブリ 'BouncyCastle.Crypto, Version=1.8.9.0, Culture=neutral, PublicKeyToken=0e99375e54769942'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

とのこと。どうやらiTextSharpでも他のDLLが必要とのことです。BouncyCastle.Cryptoのバージョン1.8.9ですがこちらから入手可能なものの、さらにファイルが必要になってきたので結局、iTextSharpはここであきらめです。
 ほかにC#で使えるPDF向けの拡張ですがPDFsharpがあります。現在.NET 6向けのバージョン6系が開発中で、その前の1.50系が安定版としていちばん使われている感じですね。うちもこのバージョンの現在の最新版1.50.5147をダウンロード。こちらのDLLファイルはPdfSharp.dllとなります。
 ホームページや例題の内容が更新されていないようで古い感じはあるんですが、サンプルやネット上の情報をもとにPDFのプロパティ編集は以下のようにして可能となりました。

Add-Type -Path "C:\bat\PdfSharp.dll"
$edit_pdf = "C:\tmp\edit.pdf"
$pdf = [PdfSharp.Pdf.IO.PdfReader]::Open($edit_pdf, [PdfSharp.Pdf.IO.PdfDocumentOpenMode]::Modify)
$pdf.Info.Title = "タイトル"
$pdf.Info.Author = "作成者"
$pdf.Info.Subject = "サブタイトル"
$pdf.Info.Creator = "アプリケーション"
$pdf.Info.Elements.SetValue("/CreationDate" , [PdfSharp.Pdf.PdfString]::new((Get-Date).ToString("yyyyMMddHHmmsszzz").Replace(":","'")))
$pdf.Info.Elements.SetValue("/ModDate" , [PdfSharp.Pdf.PdfString]::new((Get-Date).ToString("yyyyMMddHHmmsszzz").Replace(":","'")))
$pdf.Save($edit_pdf)

 TitleやAuthorはそのまま日本語文字列を入力していますが、Windows上のAcrobatで文字化けせずに表示されました。CreationDateとModDateはもとのPDFファイルになかったためか、Elements.SetValue()をもちいて[PdfSharp.Pdf.PdfString]::new()のかたちで入力しています。
 そうそう日時の書式も独特で、20231025204015+09'00、のようになります。タイムゾーンの+09'00の'が:じゃないのでPowerShellの指定書式でそのものがなく、zzzで出力して:を'にreplaseしてます。
 さいごにSave()で保存して終了です。この例では同じファイルに上書き保存していますが異なるファイル名で別名保存してもだいじょうぶです。
 とりあえずこんな感じでPowerShellスクリプトでPDFファイルのプロパティ値を編集可能となりました。ネット上の先人の方々には感謝です。