PDF Structure
PDF構成ライブラリ 機能
PDF StructureはPDF文書を以下のように変換したり、解析したりします。
- PDFのページを画像に変換
- PDFのページを画像に印影を追加
- PDFのページコンテンツに文字、画像、図形を追加
- PDFのメタデータ読み出し/メタデータ書き込み
- PDFの構成オブジェクト(構成部品)を抽出
- PDFに電子署名・タイムスタンプ
- Incremental Update(増加更新)出力に対応
変換される画像はTIFF形式、PNG形式、JPG形式、BMP形式です。
サンプル
サンプル
角印、丸印、日付印、落款などを追加します。
サンプル
サンプル
文字(字形)でクリップした画像を追加できます。
PDFに電子署名(PAdES)を施します。
電子署名にはタイムスタンプ(副署)を追加できます。
タイムスタンプを追加(Document Timestamp)します。
電子署名やタイムスタンプはIncremental Update(増加更新)として作成されます。
電子署名にはタイムスタンプ(副署)を追加できます。
タイムスタンプを追加(Document Timestamp)します。
電子署名やタイムスタンプはIncremental Update(増加更新)として作成されます。
PDF 電子署名とタイムスタンプおよび検証機能
- 電子署名
- タイムスタンプ(Document Timestamp)
- 署名検証に必要となる情報を抽出
- 署名の対象領域(ByteRange)
- 解析された署名データ
- 検証の基準時刻
- 証明書パスにあるすべての証明書
- 各証明書の失効情報(CRL/OCSP)
- 証明書パス上の失効の有無
- タイムスタンプ(バイナリおよび解析済みデータ)
- 検証の基準時刻(署名した時刻・タイムスタンプ時刻・検証時刻)
- バージョンごとのファイルサイズ
- 暗号・ハッシュのアルゴリズム
- PDF文書内のオリジナルデータ取得
- 署名データ
- 署名者の証明書
- 失効情報(CRL/OCSP)
外部から取得した情報を含み以下のような情報を取得できます。
など
PDF文書に記載された以下のようなデータをバイナリで取得できます。
など
ダウンロード
試用版を以下よりダウンロードできます。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
以下のライセンスキーを使うと、すべての電子署名検証機能を試用できます。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
以下のライセンスキーを使うと、すべての電子署名検証機能を試用できます。
マニュアル: | PDF Structure Security 説明書 |
---|---|
無償ダウンロード: | PdfStructure.zip |
ライセンスキー: | "0-03W2-021180K4R188" (試用版) |
PDF 電子署名 サンプル
既存のPDF文書に電子署名(LTV; Long Term Validation)を施します。
タイムスタンプ局(Timestamp Authoriry)を指定すると副署としてタイムスタンプが追加されます。
電子証明書を指定せずタイムスタンプ局を指定した場合はDocument Timestampになります。
同時にスタンプの追加やメタデータへの追加・変更が可能です。
タイムスタンプ局(Timestamp Authoriry)を指定すると副署としてタイムスタンプが追加されます。
電子証明書を指定せずタイムスタンプ局を指定した場合はDocument Timestampになります。
同時にスタンプの追加やメタデータへの追加・変更が可能です。
C# | C/C++ | Python |
using PDFTools.PdfStructure; using PDFTools.PdfStructure.Constants; // 初期化 using var stc = new Structure("0-03W2-021180K4R188"); // オープン 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-03W2-021180K4R188"); // オープン 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(増加更新)されたバージョンごとに抽出されます。
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-03W2-021180K4R188"); // オープン 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ファイルのメタデータを読み出すことで、目的のファイルを容易に検索できます。
この情報記載によりPDFファイルのメタデータを読み出すことで、目的のファイルを容易に検索できます。
C# | C/C++ | Python |
無償ダウンロード
以下よりダウンロードしてください。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
試用版ライセンスキーを使うと、すべての電子署名検証機能を試用できます。
ダウンロードしますと「使用許諾契約書」に同意したものとみなします。
試用版ライセンスキーを使うと、すべての電子署名検証機能を試用できます。
マニュアル: | PDF Structure Security 説明書 |
---|---|
無償ダウンロード: | PdfStructure.zip |
ライセンスキー: | "0-03W2-021180K4R188" (試用版) |