— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

Copyright © 2016 NTT DATA INTRAMART CORPORATION

↑Top

1

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

目次
改訂情報
はじめに
本書の目的
対象読者
本書の構成
APIリストAPIリストについて
JavaEE開発モデル
スクリプト開発モデル
プログラミング
動作概念
エラー処理について
APIの種類と性質
プログラム開発における注意点
体験版ライセンスにおける注意点
チュートリアル
前提条件
用語解説
準備
JSPプログラムの作成
プログラム実行ステータスコードステータスコード一覧
サポート2

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

改訂情報
変更年月日

変更内容

2016-08-01

初版

2018-12-01

第2版 下記を追加・変更しました。
表記のゆれを訂正しました。

2019-04-01

第3版 下記を追加・変更しました。
トラブルシューティングを本書から独立させました。

2020-04-01

第4版 下記を追加・変更しました。
Windows 7 / Windows Server 2008 の記述を削除しました。
「 はじめに 」の トラブルシューティングに関する記載を削除しました。

2020-08-01

第5版 下記を追加・変更しました。
「 サポート 」の内容を見直しました。
「 ステータスコード 」の記載を追加・変更しました。
見出しを「エラーコード」から「ステータスコード」へ変更しました。
目次を「エラーコード一覧」から「ステータスコード一覧」へ変更しました。
ステータスコード一覧にステータスコード -125 の記載を追加しました。

2021-08-01

第6版 下記を追加・変更しました。
「 ステータスコード一覧 」へ注意を追加しました。

2023-10-01

第7版 下記を追加・変更しました。
「 APIリストについて 」のAPIリストの所在を変更「 前提条件 」のチュートリアルについての記述、および、前提条件についての記
述を変更「 環境 」を削除「 準備 」を追加「 サンプルプログラムの場所 」を削除
「 JSPプログラムの作成 」のサンプルプログラムを変更、作成手順の記述を変更、指定する情報についてコラムを変更、および、保存時の文字コードについて注意を追加「 サンプルプログラム 」のサンプルプログラムを変更

2024-10-01

第8版 下記を追加・変更しました。
「 JSPプログラムの作成 」のサンプルプログラムを変更、および、タイムスタンプ
局のポリシーに関するコラムを追加「 サンプルプログラム 」のサンプルプログラムを変更「 ステータスコード一覧 」を見直し、記述を変更

3

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

はじめに
目次
本書の目的
対象読者
本書の構成

本書の目的
本書では、 IM-PDFTimeStamper for Accel Platform を利用する場合の基本的な方法や注意点等について説明します。

対象読者
本書は、開発をスムーズに開始するための手引書です。
したがって、実際に IM-PDFTimeStamper for Accel Platform を利用したアプリケーションを開発するプログラマの方が対象です。
以下のいずれかを理解していることが必須です。
JavaEE開発モデル （ Java ）スクリプト開発モデル （ サーバサイドJavaScript ）また、本書は、以下に列挙する技術に関する知識を有することを前提として構成されています。
これらの技術に関して不明な点がある場合、本ドキュメントの内容を正しく理解することが困難になることがありますので、予めご了承ください。
なお、前提知識となる技術に関しては、一般の専門書籍等を参照してください。
Javaプログラミング言語
Java Servlet および JSP
オペレーティングシステム
ネットワーク

本書の構成
APIリスト
利用できるAPIについて説明します。

プログラミング
プログラム開発の際の注意点や、プログラムの方法などを説明します。

チュートリアル
本製品のAPI を利用して実際にプログラムを作成する過程を学びます。

ステータスコード4

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
エラー発生時に返されるエラーコードを説明します。

サポート
製品サポートおよび技術情報の公開について説明します。

5

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

APIリスト目次
APIリストについて
JavaEE開発モデル
スクリプト開発モデル

APIリストについて
IM-PDFTimeStamper for Accel Platform には、 JavaEE開発モデル 用のAPI が用意されています。
スクリプト開発モデル で開発をする場合は、スクリプト開発モデル のソースコード内でJavaのクラスを呼び出してく
ださい。
IM-PDFTimeStamper for Accel Platform のAPIリストは、次の通りです。
IM-PDFTimeStamper for Accel Platform API ドキュメント

JavaEE開発モデル
IM-PDFTimeStamper for Accel Platform は、JavaEE開発モデル で利用可能なJava-API（クラス）を用意しています。

スクリプト開発モデル
IM-PDFTimeStamper for Accel Platform は、JavaEE開発モデル で利用可能なJava-API（クラス）を用意しています。
そのため、 スクリプト開発モデル で IM-PDFTimeStamper for Accel Platform を利用する場合は、スクリプト開発
モデル のソースコード内でJavaのクラスを呼んでください。
スクリプト開発モデル 内でのJavaのクラスの呼び出し方法については、intra-mart 付属のマニュアルを参照ください。

6

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

プログラミング
目次
動作概念
エラー処理について
APIの種類と性質
プログラム開発における注意点
体験版ライセンスにおける注意点

動作概念
通常の JavaEE開発モデル スクリプト開発モデル プログラムは、ApplicationRuntime で実行されます。
IM-PDFTimeStamper for Accel Platform で提供されるAPI も、そのほとんどはApplicationRuntime で動作します。
以下の方法でタイムスタンプ処理が実行できます。詳しくは、APIリストを参照してください。
No. メソッド

説明

1void generate ()PDFに対して文書タイムスタンプを付与します。

2void generateLtv()

PDFに対して延長タイムスタンプを付与します。

3void getPdfDocument()

PDFの情報を取得します。

4

int validate()

PDFのタイムスタンプを検証します。

エラー処理について
各タイムスタンプ処理でエラーが発生した場合、例外がスローされます。
例外からは下記の情報が取得可能です。詳しくは、APIリストを参照してください。
エラーコード
エラーメッセージ

APIの種類と性質
IM-PDFTimeStamper for Accel Platform は、JavaEE開発モデル で利用可能なJava-API（クラス）を用意しています。
そのため、 スクリプト開発モデル で IM-PDFTimeStamper for Accel Platform を利用する場合は、スクリプト開発
モデル のソースコード内でJavaのクラスを呼んでください。
スクリプト開発モデル 内でのJavaのクラスの呼び出し方法については、intra-mart 付属のマニュアルを参照してくだ
さい。

プログラム開発における注意点
IM-PDFTimeStamper for Accel Platform が提供するAPIでファイルのパスを指定する際には、AppRuntimeからアクセス可能なパスを指定してください。
処理するPDFファイルのサイズによっては、ネットワーク、APIのレスポンス、PDFファイルの処理が完全に終了する
タイミングが大きく異なる場合があります。

7

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
特にサイズの大きいPDFファイルを処理する場合は、十分な時間が経過した後にPDF ファイルにアクセスするようにしてください。

体験版ライセンスにおける注意点
試用版ライセンスでご利用のお客様は、60日間の試用期間が終了するとAPIが自動的に利用できない状態となります。
その場合は、正規の製品ライセンスを購入いただき、アンインストール後に再インストールしてください。
アンインストール・再インストールの方法は、インストールマニュアルをご確認ください。

8

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

チュートリアル
目次
前提条件
用語解説
準備
JSPプログラムの作成
プログラム実行
準備
プログラム実行確認
サンプルプログラム

前提条件
本項では、 IM-PDFTimeStamper for Accel Platform での開発の導入として、APIを利用したPDFファイルへのタイ
ムスタンプ付与処理を作成することによって、 IM-PDFTimeStamper for Accel Platform での開発の流れを体験します。
本項のチュートリアルを開始するにあたっての前提条件は、次の通りです。
intra-mart Accel Platform 、および、 IM-PDFTimeStamper for Accel Platform が正しくセットアップされていること
セイコーソリューションズ株式会社のセイコータイムスタンプサービスの契約が完了していること
ここでは、 JavaEE開発モデル の開発の流れを説明します。

用語解説
Resin をインストールしたディレクトリを %RESIN_HOME% と略します。
Apache HTTP Server をインストールしたディレクトリを %APACHE_HOME% と略します。
Storage として使用するディレクトリを %PUBLIC_STORAGE_PATH% と略します。
Webサーバ利用時の静的コンテンツを配置するディレクトリを %WEB_PATH% と略します。

準備
タイムスタンプを付与するPDFファイルを「 in.pdf 」のファイル名で作成し、 intra-mart Accel Platform サーバの
< C:/temp >ディレクトリに配置してください。

JSPプログラムの作成
テキストエディタを使用してJSPファイルを作成します。
Resin の場合、< %RESIN_HOME%/webapps/warファイルと同名のディレクトリ/ >の配下に、「
PdfTimeStampSample.jsp 」の名前でファイルを作成し、次のソースを実装します。

9

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

10— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

<%@ page language="java" contentType="text/html; charset=UTF-8" %><%@ page import="yss.iothe.pdftimestamp.PdfTimeStampException" %><%@ page import="yss.iothe.pdftimestamp.PdfTimeStampFactory" %><%@ page import="yss.iothe.pdftimestamp.PdfTimeStampService" %><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.HASH_ALGORITHM" %><%@ page
import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_128_ACCESSBILITY" %><%@ page
import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_128_CHANGE" %><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_128_COPY"%><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_128_PRINT"%><%@ page
import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_40_ADDNOTE" %><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_40_COPY"%><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_40_EDIT"%><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.PDF_SECURITY_40_PRINT"%><%@ page import="yss.iothe.pdftimestamp.com.PdfTimeStampConst.POLICY" %><%@ page import="yss.iothe.pdftimestamp.info.PdfDocument" %><%@ page import="yss.iothe.pdftimestamp.info.PdfTimeStamp" %><%@ page import="yss.iothe.pdftimestamp.info.PdfTimeStampToken" %><%@ page import="java.util.Date" %><%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %><%!
/*** PDFタイムスタンプインスタンス生成* URLが未指定であればスタンドアロン環境、* URLが指定されていれば分散環境として処理を行う。
* URLは下記の形式で指定する。
*「http://{IPアドレスおよびポート番号}/pdftimestamp/webapi/timestamp」*/
private static PdfTimeStampService service =PdfTimeStampFactory.createPdfTimeStampService();/*private static PdfTimeStampService service = PdfTimeStampFactory.createPdfTimeStampService("http://xxxxxxxx:xxxx/pdftimestamp/webapi/timestamp", 30, 600);*//****************************************** 処理ファイル設定*****************************************//* 処理対象PDFファイルパス */private static final String inputpdfpath = "C:/temp/in.pdf";/* 処理対象PDF権限パスワード */private static final String inputpdfpasswd = "security";/* 処理結果PDF出力先ファイルパス1 */
private static final String outpdfpath1 = "C:/temp/out.1.pdf";/* 処理結果PDF出力先ファイルパス2 */private static final String outpdfpath2 = "C:/temp/out.2.pdf";/****************************************** タイムスタンプトークン取得設定*****************************************/

11

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

*****************************************//* ハッシュアルゴリズム */private static final HASH_ALGORITHM alg = HASH_ALGORITHM.SHA512;/* ポリシー */private static final POLICY policy = POLICY.TYPEA3;/****************************************** タイムスタンプ局の設定*****************************************//* タイムスタンプ局の接続先のURL */private static final String tsaurl = "https://pades01.seiko-cybertime.jp/basic/Timestamp";/* タイムスタンプ局接続時の接続ID */private static final String tsauser = "xxxxxxxx@xxxx.xx.xx";/* タイムスタンプ局接続時のパスワード */private static final String tsapasswd = "xxxxxxxx";/****************************************** セキュリティ設定*****************************************//* 処理結果PDFファイルに付与する参照パスワード */private static final String openpasswd = "open";/* 処理結果PDFファイルに付与するセキュリティパスワード */private static final String secpasswd = "security";/****************************************** 処理結果PDFファイルに付与する* RC4 40bitセキュリティ設定*****************************************//* 印刷許可 */private static final PDF_SECURITY_40_PRINT security40_print =PDF_SECURITY_40_PRINT.DISABLE;/* 編集許可 */private static final PDF_SECURITY_40_EDIT security40_edit = PDF_SECURITY_40_EDIT.ENABLE;/* コピー許可 */private static final PDF_SECURITY_40_COPY security40_copy =PDF_SECURITY_40_COPY.DISABLE;/* 注釈追記許可 */private static final PDF_SECURITY_40_ADDNOTE security40_addnote =PDF_SECURITY_40_ADDNOTE.DISABLE;/****************************************** 処理結果PDFファイルに付与する* RC4 1280bitセキュリティ設定*****************************************//* 印刷許可 */private static final PDF_SECURITY_128_PRINT security128_print =PDF_SECURITY_128_PRINT.ENABLE;/* アクセス許可 */private static final PDF_SECURITY_128_ACCESSBILITY security128_access =PDF_SECURITY_128_ACCESSBILITY.ENABLE;/* 印刷許可 */private static final PDF_SECURITY_128_COPY security128_copy =PDF_SECURITY_128_COPY.ENABLE;12

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183

PDF_SECURITY_128_COPY.ENABLE;/* 文書変更許可 */private static final PDF_SECURITY_128_CHANGE security128_change =PDF_SECURITY_128_CHANGE.ENABLE;%><imui:head><title>IM-PDFTimeStamper-チュートリアル-JavaEE開発モデル-TimeStamp</title></imui:head><div class="imui-title"><h1>IM-PDFTimeStamper チュートリアル JavaEE開発モデル TimeStamp</h1></div><div class="imui-form-container"><div class="imui-chapter-title"><h2>実行結果</h2></div><form><table class="imui-table"><tbody><tr><th class="wd-225px">文書タイムスタンプ付与</th><td><%= addTimestamp() %></td></tr></tbody></table><table class="imui-table"><tbody><tr><th class="wd-225px">延長タイムスタンプ付与</th><td><%= extendTimestamp() %></td></tr></tbody></table><table class="imui-table"><tbody><tr><th class="wd-225px">PDF文書のタイムスタンプ検証(validate)</th><td><%= validateTimestamp() %></td></tr></tbody></table><table class="imui-table"><tbody><tr><th class="wd-225px">PDF文書のタイムスタンプ検証(validateTs)</th><td><%= validateTsTimestamp() %></td></tr></tbody></table><table class="imui-table"><tbody><tr><th class="wd-225px">PDF文書の情報取得</th><td><%= getInfo() %></td></tr></tbody></table></form></div><%!
/**

13

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244

/**
* 文書タイムスタンプの付与*/
String addTimestamp() {StringBuffer resultBuffer = new StringBuffer(200);/* PDF情報 */PdfDocument docinfo;
try {/****************************************** 実行準備*****************************************//* 文書タイムスタンプを付与するPDFファイルのパス、及び権限パスワードを設定 */service.setInputPdf(inputpdfpath, inputpdfpasswd);/* 処理結果PDF出力先パスを設定 */service.setOutputPdf(outpdfpath1);/* タイムスタンプトークン取得用のハッシュアルゴリズムを設定 */service.setHashAlgorithm(alg);/* タイムスタンプトークン取得用のポリシーを設定 */service.setPolicy(policy);/* タイムスタンプ局の接続先のURLを設定 */service.setTsaUrl(tsaurl);/* タイムスタンプ局接続時の接続ID、パスワードを設定 */service.setTsaUser(tsauser, tsapasswd);/* 出力PDFのセキュリティ設定(40/128のどちらかを指定) *//*service.setSecurity40(openpasswd, secpasswd,
security40_print, security40_edit,
security40_copy, security40_addnote);*/service.setSecurity128(openpasswd, secpasswd,
security128_print, security128_access,security128_copy, security128_change);/****************************************** 実行*****************************************//* PDFに対し文書タイムスタンプを付与 */service.generate();resultBuffer.append("文書タイムスタンプ付与：SUCCESS<br>");/****************************************** 実行*****************************************//* PDFおよびタイムスタンプ情報の取得 */docinfo = service.getPdfDocument();/****************************************** 取得情報出力：PDFドキュメント情報*****************************************//* ファイルサイズの取得 */long fileSize = docinfo.getContentSize();
resultBuffer.append("ファイルサイズ：" + fileSize + " Bytes<br>");14

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305

resultBuffer.append("ファイルサイズ：" + fileSize + " Bytes<br>");/* ページ数の取得 */int pageNum = docinfo.getNumberOfPages();resultBuffer.append("ページ数：" + pageNum + " Pages<br>");/* ページサイズ(幅)の取得 */double paperWidth = docinfo.getPaperWidth();resultBuffer.append("ページ幅：" + paperWidth + " pts<br>");/* ページサイズ(高さ)の取得 */double paperHeight = docinfo.getPaperHeight();
resultBuffer.append("ページ高：" + paperHeight + " pts<br>");/* 解像度取得 */int resolution = docinfo.getResolution();resultBuffer.append("解像度：" + resolution + " dpi<br>");/* 階調取得 */int gradation = docinfo.getGradation();resultBuffer.append("階調：" + gradation + "<br>");/* 最新のタイムスタンプ情報の取得 */// PdfTimeStamp timeStamp = docinfo.getLatestTimeStamp();/* タイムスタンプリストの取得 */PdfTimeStamp[] timeStampList = docinfo.getTimeStamps();resultBuffer.append("タイムスタンプリスト：" + timeStampList.length + "<br>");/* VRI付きタイムスタンプリストの取得 */PdfTimeStamp[] vriTimeStampList = docinfo.getTimeStampsWithVRI();
if (vriTimeStampList != null) {resultBuffer.append("VRI付きタイムスタンプリスト：" + vriTimeStampList.length + "<br>");}/* VRI付きでないタイムスタンプリストの取得 */PdfTimeStamp[] notVriTimeStampList = docinfo.getTimeStampsWithNotVRI();
if (notVriTimeStampList != null) {resultBuffer.append("VRI付きでないタイムスタンプリスト：" + notVriTimeStampList.length + "<br>");}/****************************************** 取得情報出力：タイムスタンプ情報*****************************************/for (int i = 0; i < timeStampList.length; i++) {resultBuffer.append("【TimeStamp[" + i + "]】<br>");/* ハッシュアルゴリズムの取得 */HASH_ALGORITHM hashAlgorithm = timeStampList[i].getHashAlgorithm();
resultBuffer.append(" ハッシュアルゴリズム：" + hashAlgorithm + "<br>");/* 有効期限の取得 */Date expirationDate = timeStampList[i].getTimeStampExpirationDate();resultBuffer.append(" 有効期限：" + expirationDate + "<br>");/* タイムスタンプ生成日時の取得 */Date createDate = timeStampList[i].getCreationDate();resultBuffer.append(" タイムスタンプ生成日時：" + createDate + "<br>");15

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366

/* 検証結果の取得 */int validateResult = timeStampList[i].getValidateResult();
resultBuffer.append(" 検証結果：" + validateResult + "<br>");/* 署名Vriが付加されているかの取得 */boolean vriFlg = timeStampList[i].getVriFlg();
resultBuffer.append(" 署名VRIの付加：" + vriFlg + "<br>");/* タイムスタンプ情報の取得 */PdfTimeStampToken token = timeStampList[i].getTimeStampToken();/****************************************** 取得情報出力：タイムスタンプトークン*****************************************//* タイムスタンプデータ値の取得 */byte[] tokenData = token.getData();resultBuffer.append(" タイムスタンプデータ値：" + tokenData + "<br>");/* 登録時のタイムスタンプハッシュ値の取得 */byte[] registerDigest = token.getRegisterDigest();resultBuffer.append(" 登録時のタイムスタンプハッシュ値：" + registerDigest + "<br>");/* 検証時のタイムスタンプハッシュ値の取得 */byte[] digest = token.getDigest();resultBuffer.append(" 検証時のタイムスタンプハッシュ値：" + digest + "<br>");}} catch (PdfTimeStampException e) {resultBuffer.append("文書タイムスタンプ付与：ERROR <br>");resultBuffer.append("ステータス：" + e.getCode() + "<br>メッセージ："+ e.getMessage() + "<br>");}
finally {}return resultBuffer.toString();}/*** 延長タイムスタンプの付与*/
String extendTimestamp() {StringBuffer resultBuffer = new StringBuffer(200);/* PDF情報 */PdfDocument docinfo;
try {/****************************************** 実行準備*****************************************//* 延長タイムスタンプを付与するPDFファイルのパス、及び権限パスワードを設定 */service.setInputPdf(outpdfpath1, inputpdfpasswd);/* 処理結果PDF出力先パスを設定 */service.setOutputPdf(outpdfpath2);/* タイムスタンプトークン取得用のハッシュアルゴリズムを設定 */service.setHashAlgorithm(alg);16

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426

/* タイムスタンプトークン取得用のポリシーを設定 */service.setPolicy(policy);/* タイムスタンプ局の接続先のURLを設定 */service.setTsaUrl(tsaurl);/* タイムスタンプ局接続時の接続ID、パスワードを設定 */service.setTsaUser(tsauser, tsapasswd);/****************************************** 実行*****************************************//* PDFに対し文書タイムスタンプを付与 */service.generateLtv();/****************************************** 実行結果出力*****************************************/
resultBuffer.append("延長タイムスタンプ付与：SUCCESS<br>");/****************************************** 実行*****************************************//* PDFおよびタイムスタンプ情報の取得 */docinfo = service.getPdfDocument();/****************************************** 取得情報出力：PDFドキュメント情報*****************************************//* ファイルサイズの取得 */long fileSize = docinfo.getContentSize();
resultBuffer.append("ファイルサイズ：" + fileSize + " Bytes<br>");/* ページ数の取得 */int pageNum = docinfo.getNumberOfPages();resultBuffer.append("ページ数：" + pageNum + " Pages<br>");/* ページサイズ(幅)の取得 */double paperWidth = docinfo.getPaperWidth();resultBuffer.append("ページ幅：" + paperWidth + " pts<br>");/* ページサイズ(高さ)の取得 */double paperHeight = docinfo.getPaperHeight();
resultBuffer.append("ページ高：" + paperHeight + " pts<br>");/* 解像度取得 */int resolution = docinfo.getResolution();resultBuffer.append("解像度：" + resolution + " dpi<br>");/* 階調取得 */int gradation = docinfo.getGradation();resultBuffer.append("階調：" + gradation + "<br>");/* 最新のタイムスタンプ情報の取得 */// PdfTimeStamp timeStamp = docinfo.getLatestTimeStamp();/* タイムスタンプリストの取得 */PdfTimeStamp[] timeStampList = docinfo.getTimeStamps();resultBuffer.append("タイムスタンプリスト：" + timeStampList.length + "<br>");17

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487

/* VRI付きタイムスタンプリストの取得 */PdfTimeStamp[] vriTimeStampList = docinfo.getTimeStampsWithVRI();
if (vriTimeStampList != null) {resultBuffer.append("VRI付きタイムスタンプリスト：" + vriTimeStampList.length + "<br>");}/* VRI付きでないタイムスタンプリストの取得 */PdfTimeStamp[] notVriTimeStampList = docinfo.getTimeStampsWithNotVRI();
if (notVriTimeStampList != null) {resultBuffer.append("VRI付きでないタイムスタンプリスト：" + notVriTimeStampList.length + "<br>");}/****************************************** 取得情報出力：タイムスタンプ情報*****************************************/for (int i = 0; i < timeStampList.length; i++) {resultBuffer.append("【TimeStamp[" + i + "]】<br>");/* ハッシュアルゴリズムの取得 */HASH_ALGORITHM hashAlgorithm = timeStampList[i].getHashAlgorithm();
resultBuffer.append(" ハッシュアルゴリズム：" + hashAlgorithm + "<br>");/* 有効期限の取得 */Date expirationDate = timeStampList[i].getTimeStampExpirationDate();resultBuffer.append(" 有効期限：" + expirationDate + "<br>");/* タイムスタンプ生成日時の取得 */Date createDate = timeStampList[i].getCreationDate();resultBuffer.append(" タイムスタンプ生成日時：" + createDate + "<br>");/* 検証結果の取得 */int validateResult = timeStampList[i].getValidateResult();
resultBuffer.append(" 検証結果：" + validateResult + "<br>");/* 署名Vriが付加されているかの取得 */boolean vriFlg = timeStampList[i].getVriFlg();
resultBuffer.append(" 署名VRIの付加：" + vriFlg + "<br>");/* タイムスタンプ情報の取得 */PdfTimeStampToken token = timeStampList[i].getTimeStampToken();/****************************************** 取得情報出力：タイムスタンプトークン*****************************************//* タイムスタンプデータ値の取得 */byte[] tokenData = token.getData();resultBuffer.append(" タイムスタンプデータ値：" + tokenData + "<br>");/* 登録時のタイムスタンプハッシュ値の取得 */byte[] registerDigest = token.getRegisterDigest();resultBuffer.append(" 登録時のタイムスタンプハッシュ値：" + registerDigest + "<br>");/* 検証時のタイムスタンプハッシュ値の取得 */byte[] digest = token.getDigest();resultBuffer.append(" 検証時のタイムスタンプハッシュ値：" + digest + "<br>");}} catch (PdfTimeStampException e) {resultBuffer.append("延長タイムスタンプ付与：ERROR<br>");18

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548

resultBuffer.append("ステータス：" + e.getCode() + "<br>メッセージ：" + e.getMessage() + "<br>");}
finally{}
return resultBuffer.toString();}/*** タイムスタンプの検証*/
String validateTimestamp() {StringBuffer resultBuffer = new StringBuffer(200);/* 検証結果 */int res;try {/****************************************** 実行準備*****************************************//* タイムスタンプを検証するPDFファイルのパス、及び権限パスワードを設定 */service.setInputPdf(outpdfpath2, inputpdfpasswd);/****************************************** 実行*****************************************//* PDFのタイムスタンプを検証 */res = service.validate();/****************************************** 実行結果出力*****************************************/
resultBuffer.append("PDF文書のタイムスタンプ検証(validate)：SUCCESS：[" + res + "]<br>");} catch (PdfTimeStampException e) {resultBuffer.append("PDF文書のタイムスタンプ検証(validate)：ERROR<br>");resultBuffer.append("ステータス：" + e.getCode() + "<br>メッセージ：" + e.getMessage() + "<br>");}
finally{}
return resultBuffer.toString();}
String validateTsTimestamp() {StringBuffer resultBuffer = new StringBuffer(200);/* 検証結果 */PdfTimeStamp[] timeStampList;try {/****************************************** 実行準備*****************************************//* タイムスタンプを検証するPDFファイルのパス、及び権限パスワードを設定 */19

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609

service.setInputPdf(outpdfpath2, inputpdfpasswd);/****************************************** 実行*****************************************//* PDFのタイムスタンプを検証 */timeStampList = service.validateTs();/****************************************** 取得情報出力：タイムスタンプ情報*****************************************/for (int i = 0; i < timeStampList.length; i++) {resultBuffer.append("【TimeStamp[" + i + "]】<br>");/* ハッシュアルゴリズムの取得 */HASH_ALGORITHM hashAlgorithm = timeStampList[i].getHashAlgorithm();
resultBuffer.append(" ハッシュアルゴリズム：" + hashAlgorithm + "<br>");/* 有効期限の取得 */Date expirationDate = timeStampList[i].getTimeStampExpirationDate();resultBuffer.append(" 有効期限：" + expirationDate + "<br>");/* タイムスタンプ生成日時の取得 */Date createDate = timeStampList[i].getCreationDate();resultBuffer.append(" タイムスタンプ生成日時：" + createDate + "<br>");/* 検証結果の取得 */int validateResult = timeStampList[i].getValidateResult();
resultBuffer.append(" 検証結果：" + validateResult + "<br>");/* 署名Vriが付加されているかの取得 */boolean vriFlg = timeStampList[i].getVriFlg();
resultBuffer.append(" 署名VRIの付加：" + vriFlg + "<br>");/* タイムスタンプ情報の取得 */PdfTimeStampToken token = timeStampList[i].getTimeStampToken();/****************************************** 取得情報出力：タイムスタンプトークン*****************************************//* タイムスタンプデータ値の取得 */byte[] tokenData = token.getData();resultBuffer.append(" タイムスタンプデータ値：" + tokenData + "<br>");/* 登録時のタイムスタンプハッシュ値の取得 */byte[] registerDigest = token.getRegisterDigest();resultBuffer.append(" 登録時のタイムスタンプハッシュ値：" + registerDigest + "<br>");/* 検証時のタイムスタンプハッシュ値の取得 */byte[] digest = token.getDigest();resultBuffer.append(" 検証時のタイムスタンプハッシュ値：" + digest + "<br>");}} catch (PdfTimeStampException e) {resultBuffer.append("PDF文書のタイムスタンプ検証(validateTs)：ERROR<br>");resultBuffer.append("ステータス：" + e.getCode() + "<br>メッセージ：" + e.getMessage() + "<br>");}
finally{20

— IM-PDFTimeStamper for Accel Platform プログラミングガイド
609
610
}
611
612
return resultBuffer.toString();
613
}
614
615
/**
616
* PDFドキュメント、及びタイムスタンプ情報の取得
617
*/
618
String getInfo() {619
620
StringBuffer resultBuffer = new StringBuffer(200);
621
622/* PDF情報 */623
PdfDocument docinfo;
624
625
try {
626
/*****************************************
627* 実行準備628*****************************************/
629/* 情報を取得するPDFファイルのパス、及び権限パスワードを設定 */630
service.setInputPdf(outpdfpath2, inputpdfpasswd);
631
632/*****************************************
633
* 実行
634
*****************************************/
635/* PDFおよびタイムスタンプ情報の取得 */636
docinfo = service.getPdfDocument();
637
638/*****************************************
639* 取得情報出力：PDFドキュメント情報
640*****************************************/
641/* ファイルサイズの取得 */642
long fileSize = docinfo.getContentSize();643
resultBuffer.append("ファイルサイズ：" + fileSize + " Bytes<br>");644
645/* ページ数の取得 */646
int pageNum = docinfo.getNumberOfPages();647
resultBuffer.append("ページ数：" + pageNum + " Pages<br>");648
649/* ページサイズ(幅)の取得 */650
double paperWidth = docinfo.getPaperWidth();651
resultBuffer.append("ページ幅：" + paperWidth + " pts<br>");652
653/* ページサイズ(高さ)の取得 */654
double paperHeight = docinfo.getPaperHeight();655
resultBuffer.append("ページ高：" + paperHeight + " pts<br>");656
657/* 解像度取得 */658
int resolution = docinfo.getResolution();659
resultBuffer.append("解像度：" + resolution + " dpi<br>");660
661/* 階調取得 */662
int gradation = docinfo.getGradation();663
resultBuffer.append("階調：" + gradation + "<br>");664
665/* 最新のタイムスタンプ情報の取得 */666//PdfTimeStamp timeStamp = docinfo.getLatestTimeStamp();667
668/* タイムスタンプリストの取得 */669
PdfTimeStamp[] timeStampList = docinfo.getTimeStamps();670
21

第8版 2024-10-01

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
670
671/* タイムスタンプが付与されていない場合は処理終了 */672
if (timeStampList == null) {673
resultBuffer.append("タイムスタンプが付与されていません。<br>");674
resultBuffer.append("PDF文書の情報取得：SUCCESS<br>");675
return resultBuffer.toString();
676
}
677
678
/* 付与されているタイムスタンプを出力 */679
resultBuffer.append("タイムスタンプリスト：" + timeStampList.length + "<br>");680
681/* VRI付きタイムスタンプリストの取得 */682
PdfTimeStamp[] vriTimeStampList = docinfo.getTimeStampsWithVRI();
683
if (vriTimeStampList != null) {684
resultBuffer.append("VRI付きタイムスタンプリスト：" + vriTimeStampList.length + "<br>");
685
}
686
687
/* VRI付きでないタイムスタンプリストの取得 */688
PdfTimeStamp[] notVriTimeStampList = docinfo.getTimeStampsWithNotVRI();
689
if (notVriTimeStampList != null) {690
resultBuffer.append("VRI付きでないタイムスタンプリスト：" + notVriTimeStampList.length + "691<br>");
692
}
693
694
/*****************************************
695* 取得情報出力：タイムスタンプ情報696*****************************************/
697
for (int i = 0; i < timeStampList.length; i++) {698
resultBuffer.append("【TimeStamp[" + i + "]】<br>");699
700/* ハッシュアルゴリズムの取得 */701
HASH_ALGORITHM hashAlgorithm = timeStampList[i]702.getHashAlgorithm();
703
resultBuffer.append(" ハッシュアルゴリズム：" + hashAlgorithm + "<br>");704
705/* 有効期限の取得 */706
Date expirationDate = timeStampList[i]707.getTimeStampExpirationDate();708
resultBuffer.append(" 有効期限：" + expirationDate + "<br>");709
710/* タイムスタンプ生成日時の取得 */711
Date createDate = timeStampList[i].getCreationDate();712
resultBuffer.append(" タイムスタンプ生成日時：" + createDate + "<br>");713
714/* 検証結果の取得 */715
int validateResult = timeStampList[i].getValidateResult();
716
resultBuffer.append(" 検証結果：" + validateResult + "<br>");717
718/* 署名Vriが付加されているかの取得 */719
boolean vriFlg = timeStampList[i].getVriFlg();
720
resultBuffer.append(" 署名VRIの付加：" + vriFlg + "<br>");721
722/* タイムスタンプ情報の取得 */723
PdfTimeStampToken token = timeStampList[i].getTimeStampToken();724
725/*****************************************
726* 取得情報出力：タイムスタンプトークン
727*****************************************/
728/* タイムスタンプデータ値の取得 */729
byte[] tokenData = token.getData();730
resultBuffer.append(" タイムスタンプデータ値：" + tokenData + "<br>");731
22

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
731
732/* 登録時のタイムスタンプハッシュ値の取得 */byte[] registerDigest = token.getRegisterDigest();resultBuffer.append(" 登録時のタイムスタンプハッシュ値：" + registerDigest + "<br>");/* 検証時のタイムスタンプハッシュ値の取得 */byte[] digest = token.getDigest();resultBuffer.append(" 検証時のタイムスタンプハッシュ値：" + digest + "<br>");}/****************************************** 実行結果出力*****************************************/
resultBuffer.append("PDF文書の情報取得：SUCCESS<br>");} catch (PdfTimeStampException e) {resultBuffer.append("PDF文書の情報取得：ERROR<br>");resultBuffer.append("ステータス：" + e.getCode() + "<br>メッセージ：" + e.getMessage() + "<br>");}
finally{}
return resultBuffer.toString();
}
%>

コラム
タイムスタンプ局のURL、ユーザID、および、パスワード情報は環境に合わせて指定してください。

コラム
タイムスタンプ局のポリシーは、タイムスタンプ局のURLのクエリパラメータで指定することも可能です。
TypeA3（”1.3.6.1.4.1.955.1.10.1.5.3”）の場合
https://pades01.seiko-cybertime.jp/basic/Timestamp?type=AccreditedA3

注意
文字コードを UTF-8 にして保存してください。

プログラム実行
準備
実行させるための準備の手順を説明します。

メニュー設定1. テナント管理者でログインし、以下のメニューを設定します。
2. [テナント管理]-[メニュー]画面を開きます。
3. フォルダを作成します。

23

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

4. URLに、PdfTimeStampSample.jsp を設定し、メニューを追加します。

5. メニュー設定は完了です。

24

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

プログラム実行
メニューで『PdfTimeStampSample』を選択してください。作成したJSPファイルが実行されます。
JSPの実行エラー（コンパイルエラー）になってしまった場合には、エラーメッセージの内容に従いJSPプログラムを修正してください。
JSPプログラムが正しく動作しているにも関わらず実行時エラーになってしまう場合は、エラーの内容にしたがって環境を正しく溝築してください（環境を変更した場合は、サーバの再起動が必要になる場合があります）。

確認プログラムが正しく実行されると、タイムスタンプ情報が画面に表示され、 C:/temp ディレクトリに out1.pdf 、
out2.pdf というPDFファイルが作成されます。
このファイルにタイムスタンプ情報が付与されており、PDFビューア（Adobe AcrobatReader など）で正しく表示
できればすべての処理が正しく行われたことになります。

サンプルプログラム
PdfTimeStampSample.jsp

25

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

ステータスコード
目次
ステータスコード一覧

ステータスコード一覧
ステータス
コード

内容

0

付与されているタイムスタンプは有効です。

1

付与されているタイムスタンプの有効期限が切れています。

2

付与されているタイムスタンプのデータが改竄されています。

3

付与されているタイムスタンプが失効しています。

-1

付与されているタイムスタンプは未検証です。

-101

タイムスタンプを付与するPDFが存在しません。

-102

タイムスタンプを付与するPDFの読み込みに失敗しました。

-103

タイムスタンプを付与したPDFの出力に失敗しました。

-104

タイムスタンプ局への接続に失敗しました。

-105

タイムスタンプトークンの取得に失敗しました。

-106

タイムスタンプトークンの埋め込みに失敗しました。

-107

PDFにタイムスタンプが付与されていません。

-108

タイムスタンプの取得に失敗しました。

-109

LTVの生成に失敗しました。

-110

CRL配布ポイントへの接続に失敗しました。

-111

CRLの取得に失敗しました。

-112

付与されているタイムスタンプが失効しています。

-113

PDF情報の取得に失敗しました。

-114

処理対象外の形式のタイムスタンプが付与されています。

-115

PDFタイムスタンプサービスのリモートサーバへの接続に失敗しました。

-116

一時ディレクトリの作成に失敗しました。

-117

一時ファイルの作成に失敗しました。

-118

PDFセキュリティの付与に失敗しました。

-119

タイムスタンプの検証に失敗しました。

-120

必須パラメータが設定されていません。

-121

変換元の画像ファイルの拡張子が「.jpg」か「.jpeg」ではありません。

-122

変換元の画像ファイルが存在しません。

26

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01
ステータス
コード

内容

-123

変換元の画像ファイルの読み込みに失敗しました。

-124

解像度に0以下の値が指定されています。

-125

画像ファイルのPDF変換に失敗しました。

-126

画像ファイルを変換したPDFの出力に失敗しました。

-127

オブジェクト識別子(OID)に不正な値が指定されています。

-999

予期しないエラーが発生しました。

注意
次のエラーが発生した場合、「Password error」と表示されますが、パスワードに起因するエラーではないケースがあります。
yss.iothe.pdftimestamp.PdfTimeStampException: 処理対象PDFの読み込みに失敗しました。
「Password error」

上記のエラーが発生する主なPDFファイルの形式やケースは、次の通りです。
パスワードが付与され、暗号化されているPDFファイル
電子署名やタイムスタンプ等が付与されているPDFファイル
Adobe Acrobat の拡張機能等が使用されているPDFファイル
内部構造が一部破損しているPDFファイル
PDFの規格に準拠していないPDFファイル

27

— IM-PDFTimeStamper for Accel Platform プログラミングガイド 第8版 2024-10-01

サポート
弊社では、Web にて弊社製品に対するサポートおよび技術情報の公開を行っております。
当製品に関して不明な点などがございましたら、情報検索または弊社サポート窓口までご相談ください。

28