PDF Security(暗号化・電子署名) サンプル・ソースコード

PDF 暗号化・電子署名 概要

PDF Security テクニカル・チャート 「PDF Security」ソフト・ライブラリは、PDF文書への電子署名と暗号化の機能をアプリケーションに追加します。

価格見積り

電子署名タイムスタンプ
PDF Securityは電子署名(PAdES)の様々なタイプを適用します。PDF SecurityはPDF/Aに準拠した電子証明書失効情報(CRLやOCSPのデータ)の埋め込みや、RFC3161タイムスタンプを追加します。
PDF Securityは証明書のルート(CA、中間)証明書や失効情報をチェックすることで電子署名の有効性を検証します。また、タイムスタンプによる検証も行います。
電子署名しないでタイムスタンプだけを埋め込めます。

電子証明書
テスト用の電子証明書を無償で発行します。
以下の無償10日間有効な電子証明書を発行しサンプルコードでPDF Securityを評価してください。
無償電子証明書発行

暗号化・セキュリティ フラグ
PDF文書にはそれが重要な場面で利用される場合、データの不正なアクセスや改竄から保護するために暗号化やセキュリティ(アクセス許可)フラグなどを設定できす。
機能概要

無償評価版(英文)
以下のダウンロード(無償)ではで完全なソースコードライブラリおよびライセンスキーを入手できます。
製品マニュアル: ライブラリコマンドライン

無償評価版のダウンロードとインストール


C#開発環境 C/C++開発環境
1.Zipファイルをダウンロードする場合
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jar SECA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
2.NuGetでインストールする場合
nuget.org から PdfTools.PdfSecurity をインストールします。

  NuGetでのインストール手順

この場合は参照設定などの必要はありません。
評価用ライセンスキーは 以下のソースコードまたは、こちら から取得してください。
C#開発環境 C/C++開発環境
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jar SECA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。

PDF文書を暗号化

PDF文書をパスワードで暗号化するサンプルコードです。
出力文書にユーザーとオーナーパスワードを指定します。 このようにして作成されたPDF文書をオープンするには、ユーザーまたはオーナーのいずれかのパスワードが必要です。
しかし、ユーザーパスワードを指定しないでPDF文書を作成すると、そのPDF文書はパスワードなしで開くことができます。 ただしパスワードなしで開くと、あらかじめ設定された印刷やその他の制限が有効になります。
以下のサンプルでは、暗号化することでその文書を開いたときに「印刷」だけを許可するPDF文書を作成します。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 暗号化を有効にする
PdfSecureSetForceEncryption(pSecure, 1);

// ファイルを暗号化
if (!PdfSecureSaveAs(pSecure, szOutputPath, szUserPassword, szOwnerPassword,
        ePermDigitalPrint | ePermPrint, 128, _T("V2"), _T("V2")))
{
    _tprintf(_T("暗号化ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpen暗号化するPDFをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSecureSetForceEncryptionPDFを格納する際に暗号化を実施する指定
 第一引数:セキュアオブジェクト
 第二引数:1(True)で暗号化
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:許可フラグ
 第六引数:暗号化の鍵長
 第七引数:暗号化フィルター
 第八引数:暗号化フィルター
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} オープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // 暗号化を有効にする
    secure.ForceEncryption = true;

    // ファイルを暗号化
    if (!secure.SaveAs(outputPath, userPassword, ownerPassword,
            PDFPermission.ePermDigitalPrint | PDFPermission.ePermPrint, 128, "V2", "V2"))
        throw new Exception(String.Format("暗号化ファイル {0} を作成できません。 " + 
            "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));

    // 後始末
    secure.Close();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
Open暗号化するPDFをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
ForceEncryptionPDFを格納する際に暗号化を実施する指定
 第一引数:1(True)で暗号化
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:許可フラグ
 第五引数:暗号化の鍵長
 第六引数:暗号化フィルター
 第七引数:暗号化フィルター
Closeセキュアオブジェクト終了

PDFファイルを復号

パスワードで暗号化されたPDFファイルを復号するサンプルコードです。
復号するためには、パスワードを指定してファイルをオープンします。その後にパスワードを指定せずに新たなPDFファイルを作成すると、全ての制約が無いものとなります。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをパスワードを使ってオープン
if (!PdfSecureOpen(pSecure, szInputPath, szPassword))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 復号したファイルを暗号化せずに格納
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("出力ファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpen復号するPDFをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:""
 第四引数:""
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:0
 第七引数:""
 第八引数:""
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをパスワードを使ってオープン
    if (!secure.Open(inputPath, password))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // 復号したファイルを暗号化せずに格納
    if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
        throw new Exception(String.Format("出力ファイル {0} を作成できません。 {1} (エラーコード: 0x{2:x}).",
            outputPath, secure.ErrorMessage, secure.ErrorCode));

    // 後始末
    secure.Close();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
Open復号するPDFをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
SaveAsPDFをファイルに格納
 第引数:暗号化オブジェクト
 第一引数:ファイルパス名
 第二引数:""
 第三引数:""
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:0
 第六引数:""
 第七引数:""
Closeセキュアオブジェクト終了

PDF文書に電子署名(Windows Cryptgraphic Provider)

PDF文書に電子電子署名するサンプルです。
電子証明書はWindows Cryptgraphic Providerから取得し、必要な暗号アルゴリズムを取得します。 サンプルでは、Common Name(CN)で電子証明書を選択します。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// Windows Cryptographic Providerを使ってセッションを開始
if (!PdfSecureBeginSession(pSecure, _T("")))
{
    _tprintf(_T("Windows Cryptographic Providerに接続できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pSignature = PdfSignatureCreateObject();

//証明書を選択して、電子署名する
PdfSignatureSetName(pSignature, szCertificate);
PdfSecureAddSignature(pSecure, pSignature);

// 署名されたPDF文書を作成
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("署名されたファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureEndSession(pSecure);
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpen電子署名するPDFをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSecureBeginSessionセキュアセッションを開始
 第一引数:セキュアオブジェクト
 第二引数:セキュアプロバイダ
  ""の場合は既定のプロバイダが使用される
  既定のプロバイダは"Microsoft Base Cryptographic Provider v1.0"
PdfSignatureCreateObject電子署名オブジェクトを生成
PdfSignatureSetName証明書を選択するためにCN(Common Name)を指定
 第一引数:電子署名オブジェクト
 第二引数:電子証明書のCommon Name
PdfSecureAddSignaturePDFに電子署名を追加
 第一引数:セキュアオブジェクト
 第二引数:電子署名オブジェクト
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:0
 第七引数:""
 第八引数:""
PdfSecureEndSessionセキュアセッションを終了
 第一引数:セキュアオブジェクト
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // Windows Cryptographic Providerを使ってセッションを開始
    if (!secure.BeginSession(""))
        throw new Exception(String.Format("Windows Cryptographic Providerに接続できません。 " + 
            "{0} (エラーコード: 0x{1:x}).", secure.ErrorMessage, secure.ErrorCode));

    // 署名オブジェクトを生成
    using (Signature signature = new Signature())
    {
        //電子証明書を選択し、電子署名する
        signature.Name = certificate;
        secure.AddSignature(signature);

        // 署名されたPDF文書を出力
        if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
            throw new Exception(String.Format("署名されたファイル {0} を作成できません。 " +
                "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));
    }

    // 後始末
    secure.EndSession();
    secure.Close();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
Open電子署名するPDFをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
BeginSessionセキュアセッションを開始
 第一引数:セキュアプロバイダ
  ""の場合は既定のプロバイダが使用される
  既定のプロバイダは"Microsoft Base Cryptographic Provider v1.0"
Signature電子署名オブジェクト
Name証明書を選択するためにCN(Common Name)を指定
AddSignaturePDFに電子署名を追加
 第一引数:電子署名オブジェクト
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:0
 第六引数:""
 第七引数:""
EndSessionセキュアセッションを終了
Closeセキュアオブジェクト終了

PDF文書に電子署名(PKCS#11)

PDF文書に電子署名するサンプルです。
電子証明書はPKCS#11 Providerから取得し、必要な暗号アルゴリズムを取得します。 サンプルでは、Common Name(CN)で電子証明書を選択します。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// PKCS#11を使ったセッションを開始
//   セッションは"DllPath;SlotId;Pin"形式で指定します。
if (!PdfSecureBeginSession(pSecure, "****ここに指定を記載****"))
{
    _tprintf(_T("PKCS#11に接続できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pSignature = PdfSignatureCreateObject();

//電子証明書を選択し、電子署名する
PdfSignatureSetName(pSignature, szCertificate);
PdfSecureAddSignature(pSecure, pSignature);

// 署名されたPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("署名されたファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureEndSession(pSecure);
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpen電子署名するPDFをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSecureBeginSessionセキュアセッションを開始
 第一引数:セキュアオブジェクト
 第二引数:セキュアプロバイダ
  "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定
PdfSignatureCreateObject電子署名オブジェクトを生成
PdfSignatureSetName証明書を選択するためにCN(Common Name)を指定
 第一引数:電子署名オブジェクト
 第二引数:電子証明書のCommon Name
PdfSecureAddSignaturePDFに電子署名を追加
 第一引数:セキュアオブジェクト
 第二引数:電子署名オブジェクト
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:0
 第七引数:""
 第八引数:""
PdfSecureEndSessionセキュアセッションを終了
 第一引数:セキュアオブジェクト
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // PKCS#11を使ったセッションを開始
    //   セッションは"DllPath;SlotId;Pin"形式で指定します。
    if (!secure.BeginSession("****ここに指定を記載****")) 
        throw new Exception(String.Format("KCS#11に接続できません。 {0} (エラーコード: 0x{1:x}).",
            secure.ErrorMessage, secure.ErrorCode));

    // 署名オブジェクトを生成
    using (Signature signature = new Signature())
    {
        //電子証明書を選択し、電子署名する
        signature.Name = certificate;
        secure.AddSignature(signature);

        // 署名されたPDF文書を出力
        if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
            throw new Exception(String.Format("署名されたファイル {0} を作成できません。 " +
                "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));
    }

    // 後始末
    secure.Close();
    secure.EndSession();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
Open電子署名するPDFをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
BeginSessionセキュアセッションを開始
 第一引数:セキュアプロバイダ
  "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定
Signature電子署名オブジェクト
Name証明書を選択するためにCN(Common Name)を指定
AddSignaturePDFに電子署名を追加
 第一引数:電子署名オブジェクト
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:0
 第六引数:""
 第七引数:""
EndSessionセキュアセッションを終了
Closeセキュアオブジェクト終了

PDF文書に可視(外観のある)電子署名

PDF文書の指定ページに可視(視覚的外観のある)電子署名するサンプルです。
サンプルでは外観としての氏名、署名理由、画像(スタンプや印影)などを指定します。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// Windows Cryptographic Providerを使ってセッションを開始
//    (PKCS#11でも同様です。)
if (!PdfSecureBeginSession(pSecure, _T("")))
{
    _tprintf(_T("Cryptographic Providerに接続できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pSignature = PdfSignatureCreateObject();

// ローカルマシンの現在時刻を取得
// (厳格なタイムスタンプは「タイムスタンプ」を追加するサンプルを参照してください。)
time(&iTime);
szCurrentTime = localtime(&iTime);
_tcsftime(szTimeBuffer, 26, _T("%d.%m.%Y %H:%M:%S"), szCurrentTime);

PdfSignatureSetName(pSignature, szCertificate);   // 署名者
PdfSignatureSetReason(pSignature, szReason);      // 署名理由
_stprintf(szCerBuff, _T("\t10,47 %s"), szCertificate);
PdfSignatureSetText1(pSignature, szCerBuff);
_stprintf(szTextBuffer, _T("\n Reason: %s \n Date: %s"), PdfSignatureGetReason(pSignature), szTimeBuffer);
PdfSignatureSetText2(pSignature, szTextBuffer);
PdfSignatureSetFontSize1(pSignature, 10);
PdfSignatureSetFontSize2(pSignature, 6);
PdfSignatureSetImageFileName(pSignature, "DigitalSignature.jpg");  // 署名画像(印影など)
PdfSignatureSetPageNo(pSignature, 1);   // 可視署名を表示するページ
PdfSignatureSetRect(pSignature, &rect); // 可視部分の境界ボックス

// 指定された署名をPDF文書に追加
PdfSecureAddSignature(pSecure, pSignature);

// 署名されたPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("署名されたファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureEndSession(pSecure);
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpen電子署名するPDFをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSecureBeginSessionセキュアセッションを開始
 第一引数:セキュアオブジェクト
 第二引数:セキュアプロバイダ
  ""の場合は既定のプロバイダが使用される
  既定のプロバイダは"Microsoft Base Cryptographic Provider v1.0"
PdfSignatureCreateObject電子署名オブジェクトを生成
PdfSignatureSetName証明書を選択するためにCN(Common Name)を指定
 第一引数:電子署名オブジェクト
 第二引数:電子証明書のCommon Name
PdfSignatureSetReason署名理由を指定
 第一引数:署名オブジェクト
 第二引数:署名理由文字列
PdfSignatureSetText1
PdfSignatureSetText2
自由な文字列を指定
 第一引数:署名オブジェクト
 第二引数:自由な文字列
PdfSignatureSetFontSize1
PdfSignatureSetFontSize2
自由な文字列のフォントサイズを指定
 第一引数:署名オブジェクト
 第二引数:フォントサイズ[ポイント]
PdfSignatureSetImageFileName画像を指定
 第一引数:署名オブジェクト
 第二引数:画像データファイルパス名
PdfSignatureSetPageNo可視署名を追加するページ
 第一引数:署名オブジェクト
 第二引数:PDFのページ番号
PdfSignatureSetRect可視署名の境界ボックス
 第一引数:署名オブジェクト
 第二引数:境界ボックス
PdfSecureAddSignaturePDFに電子署名を追加
 第一引数:セキュアオブジェクト
 第二引数:電子署名オブジェクト
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:0
 第七引数:""
 第八引数:""
PdfSecureEndSessionセキュアセッションを終了
 第一引数:セキュアオブジェクト
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // Windows Cryptographic Providerを使ったセッションを開始
    if (!secure.BeginSession(""))
        throw new Exception(String.Format("Windows Cryptographic Providerに接続できません。 " + 
            "{0} (エラーコード: 0x{1:x}).", secure.ErrorMessage, secure.ErrorCode));

    // 署名オブジェクトを生成
    using (Signature signature = new Signature())
    {
        signature.Name = certificate;  // 署名者
        signature.Reason = reason;     // 署名理由
        signature.Text1 = "\t10,47 " + signature.Name;
        // 時刻はローカルマシンのものを使用
        // (厳格なタイムスタンプは「タイムスタンプ」を追加するサンプルを参照してください。)
        signature.Text2 = "\n Reason: " + signature.Reason + "\n Date: " + DateTime.Now;
        signature.FontSize1 = 10;
        signature.FontSize2 = 6;
        signature.ImageFileName = "DigitalSignature.jpg";  // 署名画像(印影など)
        signature.PageNo = 1;  // 可視署名を表示するページ
        signature.Rect = new PDFRect(10.0f, 10.0f, 145.0f, 86.0f);  // 可視部分の境界ボックス

        // 署名を追加
        secure.AddSignature(signature);

        // 署名されたPDF文書を出力
        if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
            throw new Exception(String.Format("署名されたファイル {0} を作成できません。 " + 
                "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));
    }

    // 後始末
    secure.Close();
    secure.EndSession();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
Open電子署名するPDFをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
BeginSessionセキュアセッションを開始
 第一引数:セキュアプロバイダ
  ""の場合は既定のプロバイダが使用される
  既定のプロバイダは"Microsoft Base Cryptographic Provider v1.0"
Signature電子署名オブジェクト
Name証明書を選択するためにCN(Common Name)を指定
Reason署名理由文字列を指定
Text1
Text2
自由な文字列を指定
FontSize1
FontSize2
自由な文字列のフォントサイズ[ポイント]を指定
ImageFileName画像データファイルパス名を指定
PageNo可視署名を追加するPDFのページ番号を指定
Rect可視署名の境界ボックスを指定
AddSignaturePDFに電子署名を追加
 第一引数:電子署名オブジェクト
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:0
 第六引数:""
 第七引数:""
EndSessionセキュアセッションを終了
Closeセキュアオブジェクト終了

タイムスタンプをPDF文書に追加(Windows Cryptographic Provider)

WindowsnのCryptographic Providerを使ってPDF文書にタイムスタンプを追加するサンプルです。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"), szInputPath,
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pTimeStamp = PdfSignatureCreateObject();

// タイムスタンプ設定
PdfSignatureSetTimeStampURL(pTimeStamp, _T("http://tsa.swisssign.net"));
PdfSecureAddTimeStampSignature(pSecure, pTimeStamp);

// タイムスタンプが追加されたPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("タイムスタンプが追加されたファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"), szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpenPDFファイルをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSignatureCreateObject電子署名オブジェクトを生成
PdfSignatureSetTimeStampURLタイムスタンプURL設定
 第一引数:電子署名オブジェクト
 第二引数:タイムスタンプURL
PdfSecureAddTimeStampSignatureタイムスタンプを追加
 第一引数:セキュアオブジェクト
 第二引数:電子署名オブジェクト
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:暗号化の鍵長
 第七引数:暗号化フィルター
 第八引数:暗号化フィルター
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // タイムスタンプ設定
    using (Signature timeStamp = new Signature())
    {
        timeStamp.TimeStampURL = "http://tsa.swisssign.net";
        secure.AddTimeStampSignature(timeStamp);
    }

    // タイムスタンプが追加されたPDF文書を出力
    if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
        throw new Exception(String.Format("タイムスタンプが追加されたファイル {0} を作成できません。 " + 
            "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));

    // 後始末
    secure.Close();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
OpenPDFファイルをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
Signature電子署名オブジェクト
TimeStampURLタイムスタンプURLを設定
AddTimeStampSignatureタイムスタンプを追加
 第一引数:電子署名オブジェクト
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:暗号化の鍵長
 第六引数:暗号化フィルター
 第七引数:暗号化フィルター
Close終了

タイムスタンプをPDF文書に追加(PKCS#11)

PKCS#11を使ってPDF文書にタイムスタンプを追加するサンプルです。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pTimeStamp = PdfSignatureCreateObject();

// タイムスタンプ設定
// PKCS#11でのセッションを開始
// PKCS#11へのアクセスを"PathToDll;SlotId;Pin"形式で指定します。
PdfSignatureSetProvider(pTimeStamp, _T("****ここに指定を記載****"));
PdfSignatureSetTimeStampURL(pTimeStamp, _T("http://tsa.swisssign.net"));
PdfSecureAddTimeStampSignature(pSecure, pTimeStamp);

// タイムスタンプが追加されたPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("タイムスタンプが追加されたファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);

_tprintf(_T("終了"));
PdfSecureCreateObjectセキュアオブジェクトを生成
PdfSecureOpenPDFファイルをオープン
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:PDFを開くためのパスワード
PdfSignatureCreateObject電子署名オブジェクトを生成
PdfSignatureSetProviderPKCS#11プロバイダーを指定
 第一引数:電子署名オブジェクト
 第二引数:セキュアプロバイダ
  "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定
PdfSignatureSetTimeStampURLタイムスタンプURL設定
 第一引数:電子署名オブジェクト
 第二引数:タイムスタンプURL
PdfSecureAddTimeStampSignatureタイムスタンプを追加
 第一引数:セキュアオブジェクト
 第二引数:電子署名オブジェクト
PdfSecureSaveAsPDFをファイルに格納
 第一引数:セキュアオブジェクト
 第二引数:ファイルパス名
 第三引数:ユーザーパスワード
 第四引数:オーナーパスワード
 第五引数:ePermNoEncryption(暗号化しない)
 第六引数:暗号化の鍵長
 第七引数:暗号化フィルター
 第八引数:暗号化フィルター
PdfSecureClose終了
 第一引数:セキュアオブジェクト

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // タイムスタンプ設定
    using (Signature timeStamp = new Signature())
    {
        // PKCS#11セッションを開始
        // PKCS#11へのアクセスを"PathToDll;SlotId;Pin"形式で指定します。
        timeStamp.Provider = "****ここに指定を記載****";
        timeStamp.TimeStampURL = "http://tsa.swisssign.net";
        secure.AddTimeStampSignature(timeStamp);
    }

    // タイムスタンプが追加されたPDF文書を出力
    if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
        throw new Exception(String.Format("タイムスタンプが追加されたファイル {0} を作成できません。 " + 
            "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));

    // 後始末
    secure.Close();
}
Console.WriteLine("終了");
Secureセキュアオブジェクト
OpenPDFファイルをオープン
 第一引数:ファイルパス名
 第二引数:PDFを開くためのパスワード
Signature電子署名オブジェクト
TimeStampURLタイムスタンプURLを設定
ProviderPKCS#11プロバイダーを指定
 第一引数:セキュアプロバイダ
  "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定
AddTimeStampSignatureタイムスタンプを追加
 第一引数:電子署名オブジェクト
SaveAsPDFをファイルに格納
 第一引数:ファイルパス名
 第二引数:ユーザーパスワード
 第三引数:オーナーパスワード
 第四引数:PDFPermission.ePermNoEncryption(暗号化しない)
 第五引数:暗号化の鍵長
 第六引数:暗号化フィルター
 第七引数:暗号化フィルター
Close終了

PDF文書に署名PAdES-B-T電子署名する

PDF文書にタイムスタンプ付PAdES標準(PAdES-B-T)電子署名するサンプルです。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// PKCS#11 または Windows Cryptographic Provider でセッションを開始
// PKCS#11を利用する場合は "PathToDll;SloId;Pin" 形式で指定します。
if (!PdfSecureBeginSession(pSecure, "****ここに指定を記載****"))
{
    _tprintf(_T("指定されたセッションを開始できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 署名オブジェクトを生成
pSignature = PdfSignatureCreateObject();

// 電子証明とタイムスタンプを指定
PdfSignatureSetName(pSignature, szCertificate);
PdfSignatureSetSubFilter(pSignature, _T("ETSI.CAdES.detached"));
PdfSignatureSetTimeStampURL(pSignature, _T("http://tsa.swisssign.net"));
PdfSecureAddSignature(pSecure, pSignature);

// PAdES-B-T準拠の電子署名されたPDFファイルを出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("PAdES-B-T電子署名されたファイル %s を出力できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
PdfSecureClose(pSecure);
PdfSecureEndSession(pSecure);

_tprintf(_T("終了"));

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // PKCS#11 または Windows Cryptographic Provider でセッションを開始
    // PKCS#11を利用する場合は "PathToDll;SloId;Pin" 形式で指定します。
    if (!secure.BeginSession("****ここに指定を記載****")) 
        throw new Exception(String.Format("指定されたセッションを開始できません。 " +
            "{0} (エラーコード: 0x{1:x}).", secure.ErrorMessage, secure.ErrorCode));

    // 署名オブジェクトを生成
    using (Signature signature = new Signature())
    {
        // 電子証明とタイムスタンプを指定
        signature.Name = certificate;
        signature.SubFilter = "ETSI.CAdES.detached";
        signature.TimeStampURL = "http://tsa.swisssign.net";
        secure.AddSignature(signature);

        // PAdES-B-T準拠の電子署名されたPDFファイルを出力
        if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
            throw new Exception(String.Format("PAdES-B-T電子署名されたファイル {0} を出力できません。 " + 
                "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));
    }

    // 後始末
    secure.Close();
    secure.EndSession();
}
Console.WriteLine("終了");

PDF文書に長期署名PAdES-B-LTA

PAdES-B-T署名されたPDF文書をPAdES-B-LTA署名された文書に更新 または、
既存のPAdES-B-LTA署名されたPDF文書の有効期間を更新するサンプルです。
プロバイダ(Windows Cryptographic ProviderまたはPKCS#11)が利用可能な場合に、PDF文書に施された全署名の検証情報が追加され、さらに新しいタイムスタンプが追加されます。
検証情報には署名された全電子証明書の信頼チェーンと失効データ(OCSPまたはCRL)が含まれます。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// PKCS#11 または Windows Cryptographic Provider でセッションを開始
// PKCS#11を利用する場合は "PathToDll;SloId;Pin" 形式で指定します。
if (!PdfSecureBeginSession(pSecure, "****ここに指定を記載****"))
{
    _tprintf(_T("指定されたセッションを開始できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// PDF文書に含まれるすべての電子署名の検証情報を追加
for (int i = 0; i < PdfSecureGetSignatureCount(pSecure); i++)
{
    pSignature = PdfSecureGetSignature(pSecure, i);
    if (PdfSignatureGetHasSignature(pSignature) && !PdfSecureAddValidationInformation(pSecure, pSignature))
    {
        _tprintf(_T("検証情報を'%s'に追加できません。: %s\n"),
            PdfSignatureGetName(pSignature), PdfSecureGetErrorMessage(pSecure));
        iReturnValue = 1;
        goto cleanup;
    }
    PdfSignatureDestroyObject(pSignature);
}

// 署名オブジェクトを生成
pTimeStamp = PdfSignatureCreateObject();

// タイムスタンプ設定
PdfSignatureSetTimeStampURL(pTimeStamp, _T("http://tsa.swisssign.net"));
PdfSecureAddTimeStampSignature(pSecure, pTimeStamp);

// PAdES-B-LTA準拠のPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("PAdES-B-LTA準拠のファイル %s を出力できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);
PdfSecureEndSession(pSecure);

_tprintf(_T("終了"));

C# C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // PKCS#11 または Windows Cryptographic Provider でセッションを開始
    // PKCS#11を利用する場合は "PathToDll;SloId;Pin" 形式で指定します。
    if (!secure.BeginSession("****ここに指定を記載****"))
        throw new Exception(String.Format("指定されたセッションを開始できません。" + 
            " {0} (エラーコード: 0x{1:x}).", secure.ErrorMessage, secure.ErrorCode));

    // PDF文書に含まれるすべての電子署名の検証情報を追加
    for (int i = 0; i < secure.SignatureCount; i++)
    {
        using (Signature signature = secure.GetSignature(i))
        {
            if (signature.HasSignature && !secure.AddValidationInformation(signature))
                throw new Exception("Error adding validation information to \"" + signature.Name + 
                    "\": " + secure.ErrorMessage);
        }
    }

    // タイムスタンプ設定
    using (Signature timeStamp = new Signature())
    {
        timeStamp.TimeStampURL = "http://tsa.swisssign.net";
        secure.AddTimeStampSignature(timeStamp);
    }

    // PAdES-B-LTA準拠のPDF文書を出力
    if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
        throw new Exception(String.Format("PAdES-B-LTA準拠のファイル {0}を出力できません。 " + 
            "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));

    // 後始末
    secure.Close();
    secure.EndSession();
}
Console.WriteLine("終了");

PDF文書の署名検証

PDF文書に施された全ての電子署名の有効性を検証するサンプルです。
Cryptプロバイダを使って証明書にアクセスし、必要な暗号化アルゴリズムを取得します。
署名が無効な場合はその原因を報告します。さらに、最後の署名された後に文書が変更されていないことを確認します。

C# C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// Windows Cryptographic Providerセッションを開始
if (!PdfSecureBeginSession(pSecure, _T("")))
{
    _tprintf(_T("Cryptographic Providerに接続できません。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 全ての署名で繰り返す
int iLatestSignedRevision = -1;
for (int iSigNo = 0; iSigNo < PdfSecureGetSignatureCount(pSecure); iSigNo++)
{
    pSignature = PdfSecureGetSignature(pSecure, iSigNo);

    _tprintf(_T("  %d: "), iSigNo + 1);

    if (PdfSignatureGetHasSignature(pSignature))
    {
        // 署名検証
        bool bOk = PdfSecureValidateSignature(pSecure, pSignature);

        // 検証結果
        switch (PdfSecureGetErrorCode(pSecure))
        {
        case SIG_VAL_W_ISSUERCERT:
        case SIG_VAL_W_TSP:
        case SIG_VAL_W_TSPCERT:
        case SIG_VAL_W_NOTRUSTCHAIN:
        case SIG_VAL_W_PADES:
            bOk = false;
            break;
        }

        _tcscpy(szIssuer, PdfSignatureGetIssuer(pSignature));
        _tprintf(_T("署名者:\"%s\"、 発行者:\"%s\"、 日付:%s - "),
            PdfSignatureGetName(pSignature), szIssuer, PdfSignatureGetDate(pSignature));

        if (bOk)
        {
            // 有効な署名
            _tprintf(_T("有効\n"));
        }
        else
        {
            // 無効な署名
            _tprintf(_T("%s\n"), PdfSecureGetErrorMessage(pSecure));
        }

        if (PdfSignatureGetRevision(pSignature) > iLatestSignedRevision)
            iLatestSignedRevision = PdfSignatureGetRevision(pSignature);
    }
    else
    {
        // フィールドに署名が無い
        _tprintf(_T("フィールド \"%s\" に署名がありません。\n"), PdfSignatureGetFieldName(pSignature));
    }
}
PdfSignatureDestroyObject(pSignature);

// 最後の署名の後に変更が無いかを確認.
if (iLatestSignedRevision != -1 && iLatestSignedRevision < PdfSecureGetRevisionCount(pSecure))
{
    _tprintf(_T("PDF文書は最後の署名の後に変更されました。\n"));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);
PdfSecureEndSession(pSecure);

_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // Windows Cryptographic Providerセッションを開始
    if (!secure.BeginSession(""))
        throw new Exception(String.Format("Windows Cryptographic Providerに接続できません。 " + 
            "{0} (エラーコード: 0x{1:x}).", secure.ErrorMessage, secure.ErrorCode));

    // 全ての署名で繰り返す
    int latestSignedRevision = -1;
    for (int sigNo = 0; sigNo < secure.SignatureCount; sigNo++)
    {
        using (Signature signature = secure.GetSignature(sigNo))
        {
            Console.Write("  {0}: ", sigNo + 1);
            if (signature.HasSignature)
            {
                // 署名検証
                bool ok = secure.ValidateSignature(signature);

                // 検証結果
                switch (secure.ErrorCode)
                {
                    case PDFErrorCode.SIG_VAL_W_ISSUERCERT:
                    case PDFErrorCode.SIG_VAL_W_TSP:
                    case PDFErrorCode.SIG_VAL_W_TSPCERT:
                    case PDFErrorCode.SIG_VAL_W_NOTRUSTCHAIN:
                    case PDFErrorCode.SIG_VAL_W_PADES:
                        ok = false;
                        break;
                }

                Console.Write("署名者:\"{0}\"、 発行者:\"{1}\"、 日付:{2} - ", signature.Name, 
                    signature.Issuer, signature.Date);
                if (ok)
                {
                    // 有効な署名
                    Console.WriteLine("有効");
                }
                else
                {
                    // 無効な署名
                    Console.WriteLine(secure.ErrorMessage);
                }

                if (signature.Revision > latestSignedRevision)
                    latestSignedRevision = signature.Revision;
            }
            else
            {
                // フィールドに署名が無い
                Console.WriteLine("フィールド \"{0}\" に署名はありません。", signature.FieldName);
            }
        }
    }

    // 最後の署名の後に変更が無いかを確認
    if (latestSignedRevision != -1 && latestSignedRevision < secure.RevisionCount - 1)
        Console.WriteLine("PDF文書は最後の署名の後に変更されました。");

    // 後始末
    secure.Close();
    secure.EndSession();
}
Console.WriteLine("終了");

PDF文書に透かし(Watermark)を追加

PDF文書の各ページのサイズに応じて透かし(Watermark)を拡大・縮小して追加するサンプルです。
透かしの位置指定とそのデザイン(表示内容)はXMLデータで指定します。

C#C/C++ ダウンロード
// Secureオブジェクト生成
pSecure = PdfSecureCreateObject();

// 入力ファイルをオープン
if (!PdfSecureOpen(pSecure, szInputPath, _T("")))
{
    _tprintf(_T("入力ファイル %s をオープンできません。 %s (エラーコード: 0x%08x).\n"),
        szInputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 透かし(watermark)スタンプを指定するためのXMLデータ
pXmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" \
    "<pdfstamp xmlns=\"http://www.pdf-tools.com/pdfstamp/\">\n" \
    "  <stamp page=\"all\" size=\"595 842\" align=\"center middle\" " \
    "  scale=\"relToA4\" autoorientation=\"true\" type=\"foreground\">\n" \
    "   <rotate angle=\"55\" origin=\"298 421\">\n" \
    "     <text mode=\"stroke\" align=\"center middle\" position=\"298 421\"\n" \
    "       font=\"Arial,Bold\" size=\"60\"\n" \
    "       text=\"WATERMARK TEXT\"/>\n" \
    "   </rotate>\n" \
    "  </stamp>\n" \
    "</pdfstamp>\n";

// 透かし(watermark)を設定
if (!PdfSecureAddStampsMem(pSecure, (void*) pXmlString, strlen(pXmlString)))
{
    _tprintf(_T("透かしデータを追加できませんでした。 %s (エラーコード: 0x%08x).\n"),
        PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 透かし(watermark)が追加されたPDF文書を出力
if (!PdfSecureSaveAs(pSecure, szOutputPath, _T(""), _T(""), ePermNoEncryption, 0, _T(""), _T("")))
{
    _tprintf(_T("透かしが追加追加されたPDFファイル %s を作成できません。 %s (エラーコード: 0x%08x).\n"),
        szOutputPath, PdfSecureGetErrorMessage(pSecure), PdfSecureGetErrorCode(pSecure));
    iReturnValue = 1;
    goto cleanup;
}

// 後始末
cleanup:
PdfSecureClose(pSecure);

_tprintf(_T("終了"));

C#C/C++ ダウンロード
// Secureオブジェクト生成
using (Secure secure = new Secure())
{
    // 入力ファイルをオープン
    if (!secure.Open(inputPath, ""))
        throw new Exception(String.Format("入力ファイル {0} をオープンできません。 " + 
            "{1} (エラーコード: 0x{2:x}).", inputPath, secure.ErrorMessage, secure.ErrorCode));

    // 透かし(watermark)スタンプを指定するためのXMLデータ
    string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                       "<pdfstamp xmlns=\"http://www.pdf-tools.com/pdfstamp/\">\n" +
                       "  <stamp page=\"all\" size=\"595 842\" align=\"center middle\" " +
                       "  scale=\"relToA4\" autoorientation=\"true\" type=\"foreground\">\n" +
                       "   <rotate angle=\"55\" origin=\"298 421\">\n" +
                       "     <text mode=\"stroke\" align=\"center middle\" position=\"298 421\"\n" +
                       "       font=\"Arial,Bold\" size=\"60\"\n" +
                       "       text=\"WATERMARK TEXT\"/>\n" +
                       "   </rotate>\n" +
                       "  </stamp>\n" +
                       "</pdfstamp>\n";

    byte[] watermark = Encoding.UTF8.GetBytes(xmlString);

    // 透かし(watermark)を設定
    if (!secure.AddStampsMem(watermark))
        throw new Exception(String.Format("透かしデータを追加できませんでした。 {0} (エラーコード: 0x{1:x}).",
            secure.ErrorMessage, secure.ErrorCode));

    // 透かし(watermark)が追加されたPDF文書を出力
    if (!secure.SaveAs(outputPath, "", "", PDFPermission.ePermNoEncryption, 0, "", ""))
        throw new Exception(String.Format("透かしが追加追加されたPDFファイル {0} を作成できません。 " + 
            "{1} (エラーコード: 0x{2:x}).", outputPath, secure.ErrorMessage, secure.ErrorCode));
}
Console.WriteLine("終了");

ご質問、お問い合わせ

メールで support@TrustSS.co.jp 宛てにお送りください。
または、質問のページからお送りいただくようお願いします。ご要望も承っております。

PDF-Tools サンプル

PDF Toolsとは

PDF/Aとは