PDF Security 署名 C++サンプル

PDF Securityは、PDF文書への電子署名と暗号化の機能をアプリケーションに追加します。

電子署名・タイムスタンプ

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

暗号化・セキュリティ フラグ

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

無償評価版インストール

ライブラリ(評価版API)は無償でダウンロード(試用)できます。
ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができあがりますので、適宜ご利用ください。
binライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jarSECA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
サンプルの実行前に、bin/PdfSecureAPI.dllをサンプル実行イメージと同じフォルダーにコピーしてください。また、無償評価版と共にダウンロードしたライセンスキーはbin/LicenseManager.exeを使って登録してください。

電子署名 C++サンプル

PDF Securityでは印影が追加された電子署名やタイムスタンプを施すことができます。さらに背景の署名者や理由の文字を非表示にできます。 複数の電子署名を適用できますので、こちらを参照してください。

なお、PDF to PDF/A Converterでは、PDFからPDF/Aへの変換と同時にPDF/A文書へ電子署名やタイムスタンプを追加できます。

PDFへの電子署名

PDF文書に指定の電子証明書で電子署名します。

C++ソースコード

#include <stdio.h>
#include "pdfsecureapi_c.h"
#include "pdfsecuritydecl.h"

int main()
{
    PdfSecureInitialize();

    // インスタンス生成
    TPdfSecure*    pDocument;
    pDocument = PdfSecureCreateObject();

    // PDF文書を開く
    if(!PdfSecureOpen(pDocument, "Receipt2a.pdf", "")){
        printf("Error opening PDF file %s.\n", "Receipt2a.pdf");
        printf("Error 0x%X\n", PdfSecureGetErrorCode(pDocument));
        return 1;
    }

    // 署名追加       
    TPdfSignature*    pSignature;
    TPDFRect          rect;
    int               x,y, w,h;

    pSignature  = PdfSignatureCreateObject();

    PdfSignatureSetFontName1A (pSignature, "C:\\Windows\\Fonts\\msgothic.ttc");
    PdfSignatureSetFontName2A (pSignature, "C:\\Windows\\Fonts\\msmincho.ttc");
    PdfSignatureSetName(pSignature, "山田 太郎");
    PdfSignatureSetIssuer(pSignature, "CA21-5");
    PdfSignatureSetSerialNumber(pSignature, "15 A3");
    PdfSignatureSetReason(pSignature, "受領済");
    PdfSignatureSetLocation(pSignature, "東京");
    x=470, y=590, w=h=30;
    rect.m_fRect[0]=(float)x, rect.m_fRect[1]=(float)y, rect.m_fRect[2]=(float)(x+w), rect.m_fRect[3]=(float)(y+h);
    PdfSignatureSetRect(pSignature, &rect);

    if(!PdfSecureAddSignature(pDocument, pSignature)){
        printf("Error setting signature.\n");
        printf("Error 0x%X\n", PdfSecureGetErrorCode(pDocument));
        return 2;
    }
    
    if(!PdfSecureSaveAs(pDocument, "Receipt2pi.pdf", "", "", ePermNoEncryption, 0, "None", "None")){
        printf("Error creating output file %s.\n", "Receipt2pi");
        printf("Error 0x%X\n", PdfSecureGetErrorCode(pDocument));
        return 2;
    }

    // 後始末
    PdfSecureClose(pDocument);
    PdfSignatureDestroyObject(pSignature);
    PdfSecureDestroyObject(pDocument);
    PdfSecureUnInitialize();

    return 0;
}

PdfSecureCreateObject

PDF文書を扱うインスタンスを生成

PdfSecureOpen

署名を追加するPDF文書を開く
インターネット上のPDF文書も開けます。

PdfSignatureCreateObject

電子署名を施すためのインスタンスを生成

PdfSignatureSetFontName1

署名領域1のフォントを指定
フォントファイル名を指定します。日本語を表示させるには、日本語フォントを指定しなければなりません。

PdfSignatureSetFontName2

署名領域2のフォントを指定
フォントファイル名を指定します。日本語を表示させるには、日本語フォントを指定しなければなりません。

PdfSignatureSetName

署名者の名前(CN:CommonName)を指定
電子証明書がこの名称で検索されます。なお、証明書を発行者とシリアル番号で指定する場合は、署名者としてPDFに挿入されるのみとなります。そのため、この場合は任意の名称を指定できます。

PdfSignatureSetIssuer

署名に使う電子証明書の発行者(Issuer)を指定
電子証明書をシリアル番号で指定する場合は必須です。電子証明書を名前(CN:CommonName)で指定する場合は必要ありませんが、同じ名前の電子証明書がある場合は、発行者を指定して希望の証明書が選択されるようにします。

PdfSignatureSetSerialNumber

署名に使う電子証明書のシリアル番号を指定
電子証明書をシリアル番号で指定する場合は、必須です。

PdfSignatureSetReason

署名の「理由」を指定

PdfSignatureSetLocation

署名の「場所」を指定

PdfSignatureSetRect

署名の領域を指定
署名する領域を指定します。

PdfSecureAddSignature

指定の署名をPDFインスタンスに追加
このメソッドを実行することで、指定した署名(第二引数に指定したもの)がPDFに追加されます。

PdfSecureSaveAs

署名したPDFインスタンス(データ)をファイルに出力
以下の値を指定します。
第二引数結果を格納するPDFファイル名
第三引数出力PDFデータのユーザーパスワード
指定しない場合は、空の文字列(又は、NULL)を指定します。
第四引数出力PDFデータのオーナーパスワード
空の文字列を指定すると、ユーザーパスワードが使われます。
第五引数パーミッション フラグ
規定値は、ePermNoEncryptionです。そのためPDFデータを暗号化する場合は、指定しなければなりません。なお、データがPDF/Aの場合は、暗号化を指定できません。
第六引数暗号化の鍵長
規定値は、128です。
第七引数暗号化のフィルター
規定値は、"V2"です。
第八引数ストリーム暗号化のフィルター
規定値は、"V2"です。

PdfSecureClose

開いているPDF文書を閉じる

PdfSignatureDestroyObject

署名のインスタンスを開放

PdfSecureDestroyObject

PDFデータのインスタンスを開放

PdfSecureUnInitialize

PDF Securityを終了

Web上のファイルを指定する

入力のPDFファイルを以下の形式で指定すると、Web上のPDFファイルを直接利用できます。
http://[username:password@]domain[:port][/resource]
"username"と"password"は基本認証(Basic Authentication)のユーザー名とパスワードです。
利用例:
// PDF文書を開く
if(!PdfSecureOpen(pDocument, "http://www.pdf-tools.trustss.jp/data/Receipt2a.pdf", ""))
{
 ...
}

電子署名領域への印影追加

印影を追加する場合は、印影の画像ファイルを指定してから電子署名を実施します。
以下のコードをPdfSecureAddSignature( )を実行する前に追加します。
PdfSignatureSetImageFileNameA(pSignature, "Hanko.png");
第二引数に印影画像ファイル名を指定します。

タイムスタンプ追加

タイムスタンプを追加する場合は、タイムスタンプのURLを署名インスタンスに指定してから、電子署名を実施します。以下のコードをPdfSecureAddSignature( )の前に実行します。
PdfSignatureSetTimeStampURLA(pSignature, "http://ca21.trustss.jp/tsa/");
タイムスタンプ局(TSA)のURLをしています。
指定したタイムスタンプのURLは、テスト用のタイムスタンプを発行するTSAです。このTSAは無償・無登録で自由に使えます。

署名領域の名前や時刻などを非表示にする

名前や時刻などを削除するには、電子署名を実施する前にその部分を空白の文字列に置き換えます。以下のコードをPdfSecureAddSignature( )を実行する前に追加します。
PdfSignatureSetText1(pSignature, "\t0,0 ");
PdfSignatureSetText2(pSignature, "\t0,0 ");
PdfSignatureSetText1で署名者情報を、PdfSignatureSetText2で理由や署名場所及び署名時刻の文字をNULLにします。 指定の文字を表示させる場合は、以下の形式を使います。
<TABコード><署名領域内のX座標>,<署名領域内のY座標><SPコード><表示する文字列>

PDF文書に複数の署名を追加する

複数の署名をPDFに追加するためには、まず署名を指定したPDFのインスタンスをメモリ上に出力します。次にそのメモリ上のPDFから新たなPDFインスタンスを作成し、追加する電子証明書を指定します。 さらに署名が必要であれば、メモリへの出力→PDFインスタンス作成→署名指定を繰り返します。
最後に、PDFインスタンスを指定のファイル名で出力することで複数の署名が追加されたPDF文書ファイルが生成されます。
詳細は、PDFに複数の署名を適用するを参照してください。

PDFファイル

サンプル・コード

C++のサンプルコードはこちらです。このサンプルを実行するには電子証明書が必要です。

その他の情報

PDF/Aについて
PDFの構文解説