トラスト・ソフトウェア・システム
トラスト・ソフトウェア・システム

PDF Security(複数の電子署名) C#サンプル

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

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

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

機能概要はこちらです。
C++VB6.0 および Java のサンプルを公開しています。
無償評価版(リンク先は英語)はこちらです。 ダウンロード手順
価格見積り

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

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

参照設定

C#プロジェクトでは、以下のように.NET用DLLの参照を設定します。なお、サンプルは、基本的にコンソールアプリケーションです。
  1. C#プロジェクトを新規に作成します。
  2. PDF SecurityライブラリのNETラッパを参照する設定をします。
  3. Visual Studio C#のメインメニューで、「プロジェクト(P)」→「参照の追加(R)...」を選択します。
    以下のようなダイアログが表示されますので、解凍して作成されたフォルダーの「bin」に格納されている.NET用のDLLを指定します。
    PDF Security参照設定
  4. ネイティブのDLLを作成したプロジェクトに追加します。
  5. Visual Studioのソリューション エクスプローラ(左ペーン)で作成したプロジェクトを右クリックします。
    表示されたメニューから「追加(D)」->「既存の項目(G)...」を選択して表示されたダイアログでPDFSecureAPI.dllを追加します。
    もしくは、bin/PDFSecureAPI.dllをプロジェクトの実行ファイルが格納されているフォルダーにコピーします。

PDFに複数の署名を適用する

PDF/A 複数電子署名
PDF/A規格に準拠していて、変更できません。
この文書には、二つの署名が適用されています。
署名前のPDF/A文書署名後のPDF/A文書
 PDF Tools 「PDF Security」電子署名ライブラリ(API)を使って、左のようにPDF/A文書に複数の電子署名を適用します。

ライブラリ(評価版API)は無償でダウンロード(試用)できます、PDF Security ダウンロード手順を参照してください。 単一の署名を適用するには、PDF Security 解説とサンプルを参照してください。 Acrobat Readerでの署名検証方法は、こちらです。

複数署名の手順

 複数の電子署名をPDF文書に適用するには、電子署名の都度PDF文書を作成(書き出し)しなければなりません。そのためPDF Securityには、結果をメモリ上に(ファイルではなく)PDF文書を出力する機能を備えています。 この機能によって、複数の電子署名をより簡単に追加できます。
複数の署名は以下の手順に従って適用します。
1.PDF文書をハンドルするインスタンスを生成し、電子署名を施すPDF文書をファイルから読み込む。
2.電子署名のインスタンスを生成し、署名の詳細を指定する。
3.ファイルから読み込んだPDFのインスタンスに準備した電子署名のインスタンスで電子署名を追加する。
4.PDFのインスタンスをメモリに出力する。
5.ファイルから作成したPDFのインスタンスとは別のPDFインスタンスを生成し、そこにメモリ上のPDFを読み込む。
6.2番目の電子署名のインスタンスを生成し、署名の詳細を指定する。
7.メモリ上のPDFのインスタンスに、2番目の電子署名インスタンスで電子署名を追加する。
8.3つ以上の電子署名を追加する場合は、手順4と同様に電子署名を追加したPDFのインスタンスをメモリ上に出力し、それを読み込んで電子署名の追加を繰り返す。
9.最後の署名が追加されたPDFのインスタンスを、名前を指定してファイルに出力する。
10.ファイルを閉じる。

手順1. PDFインスタンス生成

 PDF文書のインスタンスを生成して、そこにファイルからPDF文書を読み込みます。
using System;
using Pdftools.Pdf;
using Pdftools.PdfSecure;

namespace dual
{
    class Program
    {
        static void Main(string[] args)
        {
            //PDF文書のインスタンス生成
            Secure doc = new Secure();
            doc.NoCache = true;

            //入力のPDFファイル
            if (!doc.Open("input.pdf", ""))
            {
                Console.WriteLine("入力ファイル\"input.pdf\"を開けません");
                Environment.Exit(1);
            }
Secure doc = new Secure()PDFSecurity APIを初期化します。
doc.NoCachetrueを設定すると、CRLなどをキャッシュしないようにします。 [省略可]
doc.Open( )ファイル名を指定して、生成したインスタンスにPDF文書を読み込みます。
 (インターネット上のPDFファイルを読み込む場合
第二引数には、PDFを暗号化した際のオーナーまたは、ユーザーパスワードを指定します。

手順2. 電子署名インスタンス生成と詳細指定

 電子署名のインスタンスを生成し、電子証明書や印影その表示位置などを指定します。
//電子署名
PDFRect rect;

//インスタンス生成
Signature sig = new Signature();

//指定フォント
sig.FontName1 = "C:\\Windows\\Fonts\\msgothic.ttc"
sig.FontName2 = "C:\\Windows\\Fonts\\msmincho.ttc"

//電子証明書情報(電子証明書検索情報)
sig.Name = "山田 太郎";

//表示位置
rect.lowerLeftX = 470; rect.lowerLeftY = 600;
rect.upperRightX = 500; rect.upperRightY = 630;
sig.Rect = rect;

//電子署名の背景画像
sig.ImageFileName = "Hanko.png";
sig.PageNo = -1;

//電子署名追加
sig.TimeStampURL = "http://tsa.trustss.jp/";
sig.Name 電子署名する電子証明書のCN(Common Name、所有者名)を指定します。
さらに詳しく証明書を指定する場合や、署名領域の内容を指定する場合は以下のコードを追加します。
sig.Issuer = "CA21-5";
sig.SerialNumber = "10 51";
sig.Reason = "受領済";
sig.Location = "東京";
sig.Issuer電子署名する電子証明書の発行者を指定します。
電子証明書の所有者名だけで証明書が特定できる場合は、この指定は省略できます。しかし、電子証明書をシリアル番号で指定する場合は、所有者の指定が必須です。
sig.SerialNumber電子署名する電子証明書をシリアル番号で指定します。
sig.Reason電子署名の理由を指定します。 [省略可]
sig.Location電子署名の場所を指定します。 [省略可]
sig.Rect 電子署名の領域を左下(x1,Y1)と右上(x2,y2)で指定します。単位はポイント(1ポイント=1/72インチ)です。 [省略可]
A4サイズの場合は、左下(0,0)、右上(595,842)となります。
署名領域に画像を貼り付けずに枠線や背景色を指定する場合は、以下のコードを追加します。
sig.StrokeColor = 10053120;
sig.FillColor = 6724095;

sig.StrokeColor電子署名領域に画像を指定しなかった場合に表示される境界線の色を指定します。 [省略可]
sig.FillColor電子署名領域に画像を指定しなかった場合に、その領域が塗りつぶされる色を指定します。 [省略可]
sig.ImageFileName電子署名の領域に貼り付ける画像を指定します。 [省略可]
sig.PageNo電子署名領域を表示するページを指定します。 [省略可]
-1を指定すると、最終のページに表示されます。また、省略した場合や存在しないページを指定した場合も、最終のページに表示されます。
sig.TimeStampURL指定のタイムスタンプを電子署名と共に埋め込みます。 [省略可]

署名領域に文字列を表示させたくない場合は、以下のコードを追加します。
sig.Text1 = "\t0,0 ";
sig.Text2 = "\t0,0 ";
sig.Text1電子署名領域に表示される署名者の情報を指定する文字列にします。 [省略可]
表示位置と表示する文字列を以下の形式に従って指定します。
<TAB>X位置,Y位置<空白>文字列
sig.Text2電子署名領域に表示される署名者以外の情報を指定する文字列にします。 [省略可]
表示位置と表示する文字列を以下の形式に従って指定します。
<TAB>X位置,Y位置<空白>文字列
注意)指定したタイムスタンプのURLは、テスト用のタイムスタンプを発行するTSAです。このTSAは無償・無登録で自由に使えますが、負荷によってはレスポンスが低下します。

手順3. PDF文書に電子署名を追加

 PDFのインスタンスに電子署名を追加します。
if (!doc.AddSignature(sig))
{
    Console.WriteLine("電子署名できませんでした");
    Environment.Exit(2);
}
doc.AddSignature( )引数に指定した電子署名をPDFに追加します。

手順4. PDFデータをメモリに出力

 電子署名されたPDFデータをメモリ上に出力します。不要になったPDFファイルを閉じます。
//PDFデータをメモリに出力
if (!doc.SaveInMemory(null, null, (PDFPermission)(-1), 0, null, null))
{
    Console.WriteLine("PDFデータをメモリに出力できませんでした");
    Environment.Exit(3);
}
doc.Close();
doc.SaveInMemory( )PDFデータをメモリ上に出力します。以下のとおり引数を指定します。
第一引数ユーザーパスワードを指定します。
""(NULL)を指定すると、既定のパスワードが使われます。
第二引数オーナーパスワードを指定します。
""(NULL)を指定すると、ユーザーパスワードが使われます。
第三引数パーミッション・フラグを指定します。
PDF/A文書に電子署名する場合は、ePermNoEncryptionを指定します。
第四引数暗号化の鍵長を指定します。
第五引数暗号化フィルターを指定します。
第六引数ストリーム暗号化フィルターを指定します。
doc.Close( )読み込み用に開いたPDFファイルを閉じます。

手順5. 新たなPDFインスタンスを生成

 新たなPDFのインスタンスを生成し、メモリ上のPDFを読み込みます。
//メモリ上のPDF文書を読み込む
Secure doc2 = new Secure();
doc2.NoCache = true;
byte[] ps = doc.GetPdf();
if (!doc2.OpenMem(ps, null))
{
    Console.WriteLine("メモリからPDF文書を読み込めませんでした");
    Environment.Exit(4);
}
Secure doc2 = new Secure()新たなPDF文書のインスタンスを生成します。
doc2.NoCacheTrueに設定すると、CRLなどをキャッシュしません。 [省略可]
byte[] ps = doc.GetPdf()メモリに格納されたPDF文書をバイトストリームとして読み込めるようにします。
doc2.OpenMem( )メモリ中のPDF文書を読み込みます。
第一引数doc.GetPdf()で受け取ったバイトストリームを指定します。
第二引数PDFを暗号化した際のオーナーまたは、ユーザーパスワードを指定します。

手順6. 次の電子署名インスタンスを生成

 さらに追加する電子署名のインスタンスを生成し、署名の詳細を設定します。 設定は、手順2と同様です。
//次の電子署名
PDFRect rect2;

//新たなインスタンス生成
Signature sig2 = new Signature();

//指定フォント
sig2.FontName1 = "C:\\Windows\\Fonts\\msgothic.ttc"
sig2.FontName2 = "C:\\Windows\\Fonts\\msmincho.ttc"

//電子証明書情報(電子証明書検索情報)
sig2.Name = "山田 次郎";
sig2.Issuer = "CA21-5";
sig2.SerialNumber = "10 52";

//電子署名表示内容
sig2.Reason = "確認済";
sig2.Location = "東京";

//表示位置
rect2.lowerLeftX = 470; rect2.lowerLeftY = 565;
rect2.upperRightX = 500; rect2.upperRightY = 595;
sig2.Rect = rect2;

//表示色 他
sig2.StrokeColor = 10053120;
sig2.FillColor = 6724095;
sig2.Text1 = "\t0,0 ";
sig2.Text2 = "\t0,0 ";

//電子署名の背景画像
sig2.ImageFileName = "Hanko.png";
sig2.PageNo = -1;

//タイムスタンプ(RFC3161)指定
sig2.TimeStampURL = "http://tsa.trustss.jp/";

手順7. 次の電子署名を追加する

 次の電子署名を追加します。 手順3と同様です。
//次の電子署名を追加
if (!doc2.AddSignature(sig2))
{
    Console.WriteLine("電子署名できませんでした");
    Environment.Exit(5);
}

手順8. さらに電子署名を追加する場合

 さらに電子署名を追加するには、手順4と同様にして結果をメモリに出力します。出力したPDFデータをさらに手順5と同様に別のPDFインスタンスに格納します。 そして、電子署名のインスタンスを準備し(手順6)、PDFデータに署名を追加(手順7)を繰り返します。

手順9. 結果をファイルに出力

 電子署名が追加されたPDFデータをファイルに出力します。
//結果をファイルに出力
if (!doc2.SaveAs("output.pdf", null, null, (PDFPermission.ePermNoEncryption), 0, null, null))
{
    Console.WriteLine("結果を出力できませんでした");
    Environment.Exit(6);
}
第一引数に出力するファイル名を指定します。
第二引数以降は手順4と同様です。

手順10. ファイルを閉じる

 以下のように実施します。
doc2.Close();

サンプル

 複数の電子署名を追加するC#のサンプルは、PDFsecCs.zipです。 このサンプルを実行するには電子証明書が必要です。

ご質問、お問い合わせ

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

(記載の会社名および製品名は、各社の登録商標および商標です。)
PDF製品 C#サンプル
PDF Security
PDF Validator
PDF to PDF/A Converter
PDF to Image Converter
PDF Imager-LP
Image to PDF Converter
PDF Printer
PDF Prep Tool Suite
PDF Optimizer
PDF Command Line Suite
PDF Extract