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-032E-683H5EW76R5R" (試用版)

PDF 電子署名 サンプル

  既存のPDF文書に電子署名(LTV; Long Term Validation)を施します。
タイムスタンプ局(Timestamp Authoriry)を指定すると副署としてタイムスタンプが追加されます。
電子証明書を指定せずタイムスタンプ局を指定した場合はDocument Timestampになります。

同時にスタンプの追加やメタデータへの追加・変更が可能です。
C#C/C++Python
using PDFTools.PdfStructure;
using PDFTools.PdfStructure.Constants;

// 初期化
using var stc = new Structure("0-032E-683H5EW76R5R");

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

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

//証明書指定
int R = sec.SetSignerCertificate(kCERT_Subject.CommonName, "commnName_of_a_cert", kCERT_Subject.Country, "JP");

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

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

//電子署名を実施しSecurityインターフェースを終了
sec.SignCloseInterface();

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

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

// 初期化
using var stc = new Structure("0-032E-683H5EW76R5R");

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

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

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

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

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

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

 PDF文書に電子署名(タイムスタンプを含む)されていた場合にその署名検証するために必要となる情報を取得します。
SecurityインターフェースでGetHierarchyInformation()をコールするだけで必要な情報を取得できます。
通常のアプリケーションではこの情報を基にしてPDF文書の信頼性を確認します。
署名の検証はGetHierarchyInformation()で実施済みなので、適切な情報を選択して利用できます。
信頼性確認のための情報は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-032E-683H5EW76R5R");

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

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

// 検証結果取得
DocumentHierarchyInfo[] v = sec.GetHierarchyInformation();

// 更新されたバージョンごとの署名情報
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文書に検索用の情報(取引日、取引先、取引金額など)を記載してからタイムスタンプ(LTV,Document Timestamp)を施します。
この情報記載によりPDFファイルのメタデータを読み出すことで、目的のファイルを容易に検索できます。
C# C/C++ Python

無償ダウンロード

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

ご質問、お問い合わせ

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

PDF Toolsライト

PDF 構文解説

(ISO32000-1より)

PDF Tools製品概要