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

PDF Security(暗号化・電子署名)

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文書がパスワードなしで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("終了"));
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("終了");

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("終了"));
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("終了");

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:
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));

    // 署名オブジェクトを生成
    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("終了");

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:
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を使ったセッションを開始
    //   セッションは"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("終了");

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:
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));

    // 署名オブジェクトを生成
    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("終了");

タイムスタンプを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("終了"));
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("終了");

タイムスタンプを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"));
PdfSecureAddSignature(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("終了"));
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("終了");

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とは