PDF Structure

PDF構成ライブラリ 機能

 PDF StructureはPDF文書を以下のように変換したり、解析したりします。
  • PDFのページを画像に変換
  • 変換される画像はTIFF形式、PNG形式、JPG形式、BMP形式です。
      サンプル
  • PDFのページを画像に印影を追加
  • 角印、丸印、日付印、落款などを追加します。
      サンプル
  • PDFのページコンテンツに文字、画像、図形を追加
  • 文字(字形)でクリップした画像を追加できます。
  • PDFのメタデータ読み出し/メタデータ書き込み
  • PDFの構成オブジェクト(構成部品)を抽出
  • PDFをISO-32000ファイル構造にしたがって解析したオブジェクトを単位として抽出します。
  • PDFに電子署名・タイムスタンプ
  • PDFに電子署名(PAdES)を施します。
    電子署名にはタイムスタンプ(副署)を追加できます。
    タイムスタンプを追加(Document Timestamp)します。
    電子署名やタイムスタンプはIncremental Update(増加更新)として作成されます。
  • Incremental Update(増加更新)出力に対応
  • 変更されたPDFファイルをIncremental Update形式で出力
      サンプル
    Incremental Update形式で格納されたPDFファイルから直前(変更前)のPDFファイルを取り出す。
      サンプル

PDF 電子署名とタイムスタンプおよび検証機能

  • 電子署名
  • タイムスタンプ(Document Timestamp)
  • 署名検証に必要となる情報を抽出
  • 外部から取得した情報を含み以下のような情報を取得できます。
    • 署名の対象領域(ByteRange)
    • 解析された署名データ
    • 検証の基準時刻
    • 証明書パスにあるすべての証明書
    • 各証明書の失効情報(CRL/OCSP)
    • 証明書パス上の失効の有無
    • タイムスタンプ(バイナリおよび解析済みデータ)
    • 検証の基準時刻(署名した時刻・タイムスタンプ時刻・検証時刻)
    • バージョンごとのファイルサイズ
    • 暗号・ハッシュのアルゴリズム
    • など
    検証結果はIncremental Update(増加更新)されたバージョンごとに得られます。
  • PDF文書内のオリジナルデータ取得
  • PDF文書に記載された以下のようなデータをバイナリで取得できます。
    • 署名データ
    • 署名者の証明書
    • 失効情報(CRL/OCSP)
    • など

ダウンロード

試用版を以下よりダウンロードできます。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
以下のライセンスキーを使うと、すべての電子署名検証機能を試用できます。
マニュアル:PDF Structure Security 説明書
無償ダウンロード:PdfStructure.zip
ライセンスキー:"0-0GKR-69318199W043" (試用版)

PDF 署名検証情報抽出 サンプル

 PDF文書に電子署名(タイムスタンプを含む)されていた場合にその署名検証するために必要となる情報を取得します。
アプリケーションではこの情報を基にして署名を検証します。
署名検証のための情報はIncremental Update(増加更新)されたバージョンごとに抽出されます。
C#C/C++Python
using System.Security.Cryptography.X509Certificates;
using PDFTools.PdfStructure;
using PDFTools.PdfStructure.Security;
using PDFTools.PdfStructure.Security.Misc;

// 初期化
using var stc = new Structure("0-0GKR-69318199W043");

// オープン
stc.OpenDoc("input.pdf");

//Securityインターフェース取得
using var sec = stc.GetSecurityInterface();

// 検証結果取得
using var validated = sec.GetValidationResult();

// 更新されたバージョンごとの署名情報
for (int i = 0; i < v.Length; i++)
{
    Console.WriteLine($"Version[{i}]");
    Console.WriteLine($"\tFileSize(elm): {v[i].FileSize}");
    if (v[i].has_page_elm > 0) Console.WriteLine("\tElement has \"Page Object(s)\"");
    if (v[i].has_resource_elm > 0) Console.WriteLine("\tElement has \"Resources Objext(s)\"");
    if (v[i].has_annotation_elm > 0) Console.WriteLine("\tElement has \"Annotation Objext(s)\"");

    if (v[i].has_DSS > 0) Console.WriteLine("\thas DSS dictionary");
    if (v[i].has_VRI > 0)
    {
        Console.WriteLine("\thas VRI dictionary");
        if (v[i].VRI_Certs.Length > 0) Console.WriteLine($"\t\tnumber of Certs: {v[i].VRI_Certs.Length}");
        if (v[i].VRI_CRLs.Length > 0) Console.WriteLine($"\t\tnumber of CRGs: {v[i].VRI_CRLs.Length}");
        if (v[i].VRI_OCSPs.Length > 0) Console.WriteLine($"\t\tnumber of CRGs: {v[i].VRI_OCSPs.Length}");
    }

    //電子署名
    if (v[i].has_SIG != 0)
    {
        if (v[i].has_SIG > 0) Console.WriteLine("\thas Signature{0}", v[i].has_SIG == 3 ? " w/\"Timestamp\"" : "");
        if (v[i].has_SIG == 1) Console.WriteLine("\tSignature is Timestamp");
        if (v[i].sig_verified > 0)
            Console.WriteLine("\tThe signatute is validate.");
        else
            Console.WriteLine("\tThe signatute is INVALIDATE.");
    }

    //署名時刻
    if (v[i].SigningTime.Ticks > 1)
    {
        Console.Write($"\tSigning Time: {v[i].SigningTime.ToString()} - ");
        switch (v[i].SigningTime_source)
        {
            case SecKindOfSigningTime.SEC_SIGNING_TIME_SYS:
                Console.WriteLine("現在のシステムの時刻");
                break;
            case SecKindOfSigningTime.SEC_SIGNING_TIME_M:
                Console.WriteLine("署名辞書に記載された時刻");
                break;
            case SecKindOfSigningTime.SEC_SIGNING_TIME_SIGN:
                Console.WriteLine("署名メッセージに記載された時刻");
                break;
            case SecKindOfSigningTime.SEC_SIGNING_TIME_TS:
                Console.WriteLine("タイムスタンプの時刻");
                break;
            default:
                Console.WriteLine();
                break;
        }
    }

    //タイムスタンプ
    if (v[i].has_SIG == 1 || v[i].has_SIG == 3)
    {
        Console.WriteLine("\tTimeStamp Information{0}", v[i].has_SIG == 3 ? " (タイムスタンプは副署名)") : "";
        Console.WriteLine($"\t\tTSA PolicyId: {v[i].TstPolicyId}");
        Console.WriteLine($"\t\tHash OID: {v[i].HashOid}");
        Console.WriteLine("\t\tHash Message: {0}", v[i].hash_is_matched_ts > 0 ? "The hash value is matched" : "Invalid hash Value");
        Console.WriteLine(Utility.BinaryToString(v[i].HashMessage, Utility.CryptStringFlag.CRYPT_STRING_HEXASCIIADDR));
        Console.WriteLine("\t\tSerialNumber: {0}", BitConverter.ToString(v[i].TstSn).Replace("-", string.Empty));
        Console.WriteLine($"\t\tGenTime: {v[i].GenTime}");
        Console.WriteLine($"\t\tGenTime(ascii:JST): {v[i].GenTm.ToString()}");
        Console.Write("\t\tAccuracy: ");
        if (v[i].AccuacySec >= 0) Console.Write($" Seconds={v[i].AccuacySec}");
        if (v[i].AccuacyMilli >= 0) Console.Write($" Millis={v[i].AccuacyMilli}");
        if (v[i].AccuacyMicro >= 0) Console.Write($" Micros={v[i].AccuacyMicro}");
        Console.WriteLine();
        Console.WriteLine($"\t\tTSA Name: {v[i].TsaName}");
    }

    //署名データ
    if (v[i].has_SIG != 0)
    {
        Console.WriteLine($"\tSigned File Size: {v[i].SignedFileSize}");
        Console.WriteLine($"\tByteRange: [ {v[i].ByteRange[0]} {v[i].ByteRange[1]} {v[i].ByteRange[2]} {v[i].ByteRange[3]} ]");
        Console.WriteLine($"\tTite: {v[i].Title}");
        Console.WriteLine($"\tName: {v[i].Name}");
        Console.WriteLine($"\tM: {v[i].M}");
        Console.WriteLine($"\tFilter: {v[i].Filter}");
        Console.WriteLine($"\tSubFilter: {v[i].SubFilter}");
        Console.WriteLine($"\tSigner DigestAlgorithm: {v[i].DigestAlgorithm}");

        //ハッシュ値
        switch (v[i].has_SIG)
        {
            case 3:
                Console.WriteLine("\tThe Signature Hash Value is {0}matched.", v[i].hash_is_matched_sign > 0 ? "" : "not ");
                Console.WriteLine("\tThe Timestamp Hash Value is {0}matched.", v[i].hash_is_matched_ts > 0 ? "" : "not ");
                break;
            case 2:
                Console.WriteLine("\tThe Signature Hash Value is {0}matched.", v[i].hash_is_matched_sign > 0 ? "" : "not ");
                break;
            case 1:
                Console.WriteLine("\tThe Timestamp Hash Value is {0}matched.", v[i].hash_is_matched_ts > 0 ? "" : "not ");
                break;
        }

        //署名者証明書
        if (v[i].SignerCert != null)
        {
            Utility.ViewCertificate(v[i].SignerCert);
            Console.WriteLine("\tSigner Certificate Information");
            //発行者
            Console.WriteLine($"\t\tIssuer: {new X500DistinguishedName(v[i].IssuerName).Name}");
            //サブジェクト名
            Console.WriteLine($"\t\tSubject: {new X500DistinguishedName(v[i].SignerCertSubj).Name}");
            //シリアル番号
            Console.WriteLine($"\t\tSerialNumber: {BitConverter.ToString(v[i].SignerCertSn).Replace("-", string.Empty)}");
            //証明書の署名アルゴリズム
            Console.WriteLine($"\t\tSignatuteAlgotithmID: {v[i].SignatureAlgorithmId}");

            //Document Security Store(DSS)に記載された失効情報
            if (v[i].dss_CRLs != null && v[i].dss_CRLs.Length > 0)
            {
                for (int j = 0; j < v[i].dss_CRLs.Length; j++)
                    Utility.ViewCRL(v[i].dss_CRLs[j]);
            }
        }
    }
}

}

PDF 電子署名 サンプル

  既存のPDF文書に電子署名を施します。
副署としてタイムスタンプを追加することができます。
同時にスタンプの追加やメタデータへの追加・変更ができます。
C#C/C++Python
using PDFTools.PdfStructure;

// 初期化
using var stc = new Structure("0-0GKR-69318199W043");

// オープン
stc.OpenDoc("input.pdf");

//Securityインターフェース取得
var sec = stc.GetSecurityInterface();

// 検証結果取得(省略可)
//  オープンしたPDFファイルに署名やタイムスタンプがある場合
//  その検証結果を取得できます
var validated = sec.GetHierarcyInformation();
//  署名検証の結果が有効な場合に署名処理を実施します。

//証明書指定
sec.SignerCertificate = "CN=MyCommonName";

//タイムスタンプ局指定(省略可)
sec.TimeStamp = "http://tsa.trustss.jp/";

//出力ファイル指定
sec.SetOutputFileName("out.pdf");

//電子署名と格納(Securityインターフェース終了)
sec.SignAndCloseInterface();

PDF タイムスタンプのサンプル

 既存のPDF文書にタイムスタンプ(LTV,Document Timestamp)を施します。
同時にスタンプの追加やメタデータへの追加・変更ができます。
C#C/C++Python
using PDFTools.PdfStructure;

// 初期化
using var stc = new Structure("0-0GKR-69318199W043");

// オープン
stc.OpenDoc("input.pdf");

//Securityインターフェース取得
var sec = stc.GetSecurityInterface();

//検証結果取得(省略可)
//  オープンしたPDFファイルに署名やタイムスタンプがある場合
//  その検証結果を取得できます
var validated = sec.GetHierarcyInformation();

//タイムスタンプ局指定
sec.TimeStamp = "http://tsa.trustss.jp/";

//出力ファイル指定
sec.SetOutputFileName("out.pdf");

//電子署名と格納(Securityインターフェース終了)
sec.SignAndSave();

PDF メタデータに検索用の情報記載後にタイムスタンプする

 既存のPDF文書に検索用の情報(取引日、取引先、取引金額など)を記載してからタイムスタンプ(LTV,Document Timestamp)を施します。
この情報記載によりPDFファイルのメタデータを読み出すことで、目的のファイルを容易に検索できます。
C#C/C++Python

無償ダウンロード

以下よりダウンロードしてください。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
試用版ライセンスキーを使うと、すべての電子署名検証機能を試用できます。
マニュアル:PDF Structure Security 説明書
無償ダウンロード:PdfStructure.zip
ライセンスキー:"0-0GKR-69318199W043" (試用版)

ご質問、お問い合わせ

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

PDF Toolsライト

PDF 構文解説

(ISO32000-1より)

PDF Tools製品概要