.NET開発でPDFを処理する際、署名済みのPDFに対して内容の編集やレイアウトの調整を行おうとすると、デジタル署名によってファイルが完全にロックされ、操作を行うたびにエラーが発生してしまうことがあります。実は悩む必要はありません。PDFのデジタル署名は、本質的にフォームに埋め込まれた専用コントロールであり、C#の数行のコードで的確に削除することができます。本日は、無料ライブラリFree Spire.PDFを使用してこの処理を実装する方法をご紹介します。
実装の基本ロジック
PDF内のデジタル署名は特殊なフォームフィールドであり、その型はPdfSignatureFieldWidgetです。実行する処理は非常にシンプルです。
- 署名付きPDFドキュメントを読み込む
- すべてのフォームフィールドを走査する
- 署名タイプのフィールドを検索し、直接削除する
- 新規ファイルとして保存する
完全なコード
using Spire.Pdf;
using Spire.Pdf.Widget;
namespace RemoveSignature
{
class Program
{
static void Main(string[] args)
{
// 処理対象のPDFファイルを読み込む
PdfDocument pdf = new PdfDocument("C:\\Users\\Administrator\\Desktop\\Signature.pdf");
// ドキュメント内のフォームフィールドコレクションを取得
PdfFormWidget widgets = pdf.Form as PdfFormWidget;
// 逆順で走査(削除時のインデックスズレを防止)
for (int i = widgets.FieldsWidget.List.Count - 1; i >= 0; i--)
{
PdfFieldWidget widget = widgets.FieldsWidget.List[i] as PdfFieldWidget;
// 現在のフィールドがデジタル署名フィールドか判定
if (widget is PdfSignatureFieldWidget)
{
// 署名を削除
widgets.FieldsWidget.RemoveAt(i);
Console.WriteLine($"{i}番目の署名フィールドを削除しました");
}
}
// 処理結果を保存
pdf.SaveToFile("RemoveSignatures.pdf");
Console.WriteLine("処理が完了しました!");
// リソースを解放
pdf.Close();
}
}
}
重要なポイント
1. なぜ逆順で走査するのか?
List.RemoveAt(i)で要素を削除すると、リスト内の後続のインデックスが前に詰められます。正順で削除すると要素の取りこぼしが発生しやすくなりますが、逆順で処理すると安全に操作できます。
2. 表示・非表示の署名を問わず削除可能
ページ上に表示される署名画像、バックエンドに隠された検証用署名のいずれも、この方法で削除できます。
3. 無料版の制限について
無料版にはPDFのページ数制限がありますが、小規模ファイル、テスト用途、社内ツールでの使用には十分に対応可能です。
実際の効果
注意事項
- 元ファイルのバックアップ:本コードは新規ファイルとして保存するため、元ファイルを上書きすることはなく安全ですが、事前にバックアップを取得することを推奨します。
-
依存ライブラリ:Free Spire.PDFを使用する場合は、NuGetで
FreeSpire.PDFを検索して直接インストールしてください。
PDF署名削除の核心は一言でまとめられます。デジタル署名はPDFフォーム内の専用コントロールであり、コントロールを削除すること=署名を削除することです。
※追記:署名が法的効力を持つ場合、操作前に権限を確認することを推奨します。不要な署名を削除しないよう、自己責任で操作してください 😄

