PDF Security(暗号化・電子署名) サンプル・ソースコード
PDF 暗号化・電子署名 概要
「PDF Security」ソフト・ライブラリは、PDF文書への電子署名と暗号化の機能をアプリケーションに追加します。
価格見積り
PDF Securityは証明書のルート(CA、中間)証明書や失効情報をチェックすることで電子署名の有効性を検証します。また、タイムスタンプによる検証も行います。
電子署名しないでタイムスタンプだけを埋め込めます。
以下の無償10日間有効な電子証明書を発行しサンプルコードでPDF Securityを評価してください。
無償電子証明書発行
価格見積り
電子署名・タイムスタンプ
PDF Securityは電子署名(PAdES)の様々なタイプを適用します。PDF SecurityはPDF/Aに準拠した電子証明書失効情報(CRLやOCSPのデータ)の埋め込みや、RFC3161タイムスタンプを追加します。PDF Securityは証明書のルート(CA、中間)証明書や失効情報をチェックすることで電子署名の有効性を検証します。また、タイムスタンプによる検証も行います。
電子署名しないでタイムスタンプだけを埋め込めます。
電子証明書
テスト用の電子証明書を無償で発行します。以下の無償10日間有効な電子証明書を発行しサンプルコードでPDF Securityを評価してください。
無償電子証明書発行
暗号化・セキュリティ フラグ
PDF文書にはそれが重要な場面で利用される場合、データの不正なアクセスや改竄から保護するために暗号化やセキュリティ(アクセス許可)フラグなどを設定できす。無償評価版のダウンロードとインストール
C#開発環境 | C/C++開発環境 |
1.Zipファイルをダウンロードする場合
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
bin | ライブラリやライセンスマネージャーなど |
doc | 使用説明書やjavadocなど |
include | C/C++用のヘッダー(.h)ファイル |
jar | SECA.jar(Javaのラッパー) |
lib | C/C++用のlibファイル |
samples | 各種開発言語のサンプル |
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
2.NuGetでインストールする場合
nuget.org から PdfTools.PdfSecurity をインストールします。
NuGetでのインストール手順
この場合は参照設定などの必要はありません。
評価用ライセンスキーは 以下のソースコードまたは、こちら から取得してください。
NuGetでのインストール手順
この場合は参照設定などの必要はありません。
評価用ライセンスキーは 以下のソースコードまたは、こちら から取得してください。
C#開発環境 | C/C++開発環境 |
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
サンプルの実行前に参照設定などを行ってください。
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
ファイルをダウンロードしてから適当なフォルダーに解凍してください。
以下のようなフォルダーができあがりますので、適宜ご利用ください。
bin | ライブラリやライセンスマネージャーなど |
doc | 使用説明書やjavadocなど |
include | C/C++用のヘッダー(.h)ファイル |
jar | SECA.jar(Javaのラッパー) |
lib | C/C++用のlibファイル |
samples | 各種開発言語のサンプル |
無償評価版と共にダウンロードしたライセンスキーを bin/LicenseManager.exeを使って登録してください。
PDF文書を暗号化
PDF文書をパスワードで暗号化するサンプルコードです。
出力文書にユーザーとオーナーパスワードを指定します。 このようにして作成されたPDF文書をオープンするには、ユーザーまたはオーナーのいずれかのパスワードが必要です。
しかし、ユーザーパスワードを指定しないで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("終了"));
PdfSecureCreateObject | セキュアオブジェクトを生成 |
PdfSecureOpen | 暗号化するPDFをオープン 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:PDFを開くためのパスワード |
PdfSecureSetForceEncryption | PDFを格納する際に暗号化を実施する指定 第一引数:セキュアオブジェクト 第二引数:1(True)で暗号化 |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数:許可フラグ 第六引数:暗号化の鍵長 第七引数:暗号化フィルター 第八引数:暗号化フィルター |
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を開くためのパスワード |
ForceEncryption | PDFを格納する際に暗号化を実施する指定 第一引数:1(True)で暗号化 |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数:許可フラグ 第五引数:暗号化の鍵長 第六引数:暗号化フィルター 第七引数:暗号化フィルター |
Close | セキュアオブジェクト終了 |
PDFファイルを復号
パスワードで暗号化された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を開くためのパスワード |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:"" 第四引数:"" 第五引数: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を開くためのパスワード |
SaveAs | PDFをファイルに格納 第引数:暗号化オブジェクト 第一引数:ファイルパス名 第二引数:"" 第三引数:"" 第四引数:PDFPermission.ePermNoEncryption(暗号化しない) 第五引数:0 第六引数:"" 第七引数:"" |
Close | セキュアオブジェクト終了 |
PDF文書に電子署名(Windows Cryptgraphic Provider)
PDF文書に電子電子署名するサンプルです。
電子証明書はWindows Cryptgraphic Providerから取得し、必要な暗号アルゴリズムを取得します。 サンプルでは、Common Name(CN)で電子証明書を選択します。
電子証明書は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 |
PdfSecureAddSignature | PDFに電子署名を追加 第一引数:セキュアオブジェクト 第二引数:電子署名オブジェクト |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数: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)を指定 |
AddSignature | PDFに電子署名を追加 第一引数:電子署名オブジェクト |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数:PDFPermission.ePermNoEncryption(暗号化しない) 第五引数:0 第六引数:"" 第七引数:"" |
EndSession | セキュアセッションを終了 |
Close | セキュアオブジェクト終了 |
PDF文書に電子署名(PKCS#11)
PDF文書に電子署名するサンプルです。
電子証明書はPKCS#11 Providerから取得し、必要な暗号アルゴリズムを取得します。 サンプルでは、Common Name(CN)で電子証明書を選択します。
電子証明書は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 |
PdfSecureAddSignature | PDFに電子署名を追加 第一引数:セキュアオブジェクト 第二引数:電子署名オブジェクト |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数: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)を指定 |
AddSignature | PDFに電子署名を追加 第一引数:電子署名オブジェクト |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数: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 | 可視署名の境界ボックス 第一引数:署名オブジェクト 第二引数:境界ボックス |
PdfSecureAddSignature | PDFに電子署名を追加 第一引数:セキュアオブジェクト 第二引数:電子署名オブジェクト |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数: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 | 可視署名の境界ボックスを指定 |
AddSignature | PDFに電子署名を追加 第一引数:電子署名オブジェクト |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数: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 | セキュアオブジェクトを生成 |
PdfSecureOpen | PDFファイルをオープン 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:PDFを開くためのパスワード |
PdfSignatureCreateObject | 電子署名オブジェクトを生成 |
PdfSignatureSetTimeStampURL | タイムスタンプURL設定 第一引数:電子署名オブジェクト 第二引数:タイムスタンプURL |
PdfSecureAddTimeStampSignature | タイムスタンプを追加 第一引数:セキュアオブジェクト 第二引数:電子署名オブジェクト |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数: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 | セキュアオブジェクト |
Open | PDFファイルをオープン 第一引数:ファイルパス名 第二引数:PDFを開くためのパスワード |
Signature | 電子署名オブジェクト |
TimeStampURL | タイムスタンプURLを設定 |
AddTimeStampSignature | タイムスタンプを追加 第一引数:電子署名オブジェクト |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数: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 | セキュアオブジェクトを生成 |
PdfSecureOpen | PDFファイルをオープン 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:PDFを開くためのパスワード |
PdfSignatureCreateObject | 電子署名オブジェクトを生成 |
PdfSignatureSetProvider | PKCS#11プロバイダーを指定 第一引数:電子署名オブジェクト 第二引数:セキュアプロバイダ "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定 |
PdfSignatureSetTimeStampURL | タイムスタンプURL設定 第一引数:電子署名オブジェクト 第二引数:タイムスタンプURL |
PdfSecureAddTimeStampSignature | タイムスタンプを追加 第一引数:セキュアオブジェクト 第二引数:電子署名オブジェクト |
PdfSecureSaveAs | PDFをファイルに格納 第一引数:セキュアオブジェクト 第二引数:ファイルパス名 第三引数:ユーザーパスワード 第四引数:オーナーパスワード 第五引数: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 | セキュアオブジェクト |
Open | PDFファイルをオープン 第一引数:ファイルパス名 第二引数:PDFを開くためのパスワード |
Signature | 電子署名オブジェクト |
TimeStampURL | タイムスタンプURLを設定 |
Provider | PKCS#11プロバイダーを指定 第一引数:セキュアプロバイダ "Dllパス;SlotId;Pin(パスフレーズ)"形式でPKCS#11を指定 |
AddTimeStampSignature | タイムスタンプを追加 第一引数:電子署名オブジェクト |
SaveAs | PDFをファイルに格納 第一引数:ファイルパス名 第二引数:ユーザーパスワード 第三引数:オーナーパスワード 第四引数: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)が含まれます。
既存の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プロバイダを使って証明書にアクセスし、必要な暗号化アルゴリズムを取得します。
署名が無効な場合はその原因を報告します。さらに、最後の署名された後に文書が変更されていないことを確認します。
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データで指定します。
透かしの位置指定とそのデザイン(表示内容)は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("終了");