IM-PDFCoordinator for Accel Platform プログラミングガイド 第13版 2024-04-01

5.2. jsプログラムの作成( スクリプト開発モデル )

スクリプト開発モデル として、HTML/JavaScriptのプログラムを作成します。

5.2.1. 準備

本チュートリアルを進めるにあたり、次の事前準備を行ってください。

  • IM-PDFCoordinator for Accel Platform のサンプルデータを投入してください。

    サンプルデータを投入するには、 IM-PDFCoordinator for Accel Platform のセットアップ時、WARファイルを出力する際に「サンプルデータを含める」へのチェックが必要です。

    投入手順については、「 intra-mart Accel Platform セットアップガイド 」-「 サンプルデータの投入 」を参照してください。

    コラム

    チュートリアルのプログラム内部で使用する マージ機能(Merge) ・ エディット機能(Edit) 用のPDFファイルや画像ファイルは、サンプルデータを投入することで設置されます。

  • 本チュートリアルでは、 後述で作成する画面から処理対象ファイルをアップロードすることで処理を実行します。

    処理対象のPDFファイルを用意してください。

5.2.2. jsファイルの作成

テキストエディタを使用してhtmlファイルとjsファイルを作成します。

Resin の場合、< %RESIN_HOME%/webapps/warファイルと同名のディレクトリ/WEB-INF/jssp/src/pdfc >の配下に、それぞれ次の名前でファイルを作成し、ソースを実装します。

機能 htmlファイル名 jsファイル名
ページ機能(Page) combine.html combine.js
マージ機能(Merge) merge.html merge.js
エディット機能(Edit) edit.html edit.js

注意

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

コラム

RC4-40ビット、RC4-128ビット、および、AES128ビットのセキュリティは、いずれか一つのみ付与されます。

セキュリティ設定処理を複数実行した場合、最後に実行したセキュリティ設定が有効になります。

5.2.2.1. ページ機能(Page)

combine.html

 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
<imart type="head">
  <title>IM-PDFCoordinator-チュートリアル-スクリプト開発モデル-combine</title>
	<script type="text/javascript">
		$(function (){
			$("#combine_submit").click(function() {
				if($("#comb_file_1_path").val().length == 0 || $("#comb_file_2_path").val().length == 0) {
					imuiAlert("ファイルを2つ選択してください。", "警告");
					return;
				}
				$("#combine_form").submit();
			});
		});
	</script>
</imart>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル スクリプト開発モデル combine</h1>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>combine プログラム実行</h2></div>
    <div class="imui-box-supplementation">
      <div class="supplementation-left-m">
        <span class="im-ui-icon-common-24-information"></span>
      </div>
      <p class="imui-pgh-section supplementation-left-m">
        アップロードした2つのPDFファイルを結合し、結合後PDFをダウンロードします。<br>
        PDFファイルを2つ指定し、「PDF結合」ボタンを押下してください。
      </p>
    </div>
    <imart type="form" action="combinePDF" method="POST" id="combine_form" enctype="multipart/form-data">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-225px">結合対象PDFファイル1</th>
            <td><input type="file" id="comb_file_1_path" name="comb_file_1_path"></td>
          </tr>
          <tr>
            <th class="wd-225px">結合対象PDFファイル2</th>
            <td><input type="file" id="comb_file_2_path" name="comb_file_2_path"></td>
          </tr>
        </tbody>
      </table>
      <div class="imui-operation-parts">
        <imart type="imuiButton" value="PDF結合" class="imui-medium-button" id="combine_submit"></imart>
      </div>
    </imart>
  </div>
</div>

combine.js

  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
 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
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
184
185
186
187
188
189
190
191
192
/**
 * アップロードした2つのファイルを結合します。
 * @param {Object} request リクエスト
 */
function combinePDF(request) {

	// リクエストからアップロードしたPDFファイル1の情報を取得します。
	let uploadFile = request.getParameter("comb_file_1_path");
	let combFile1Stream = uploadFile.getValueAsStream();
	let combFile1Name = uploadFile.getFileName();

	// リクエストからアップロードしたPDFファイル2の情報を取得します。
	uploadFile = request.getParameter("comb_file_2_path");
	let combFile2Stream = uploadFile.getValueAsStream();
	let combFile2Name = uploadFile.getFileName();

	// アップロードしたファイルを一時ファイルに保管します。
	let sessionid  = Client.identifier();
	let combFile1 = File.createTempFile("comb1_" + sessionid, ".pdf", "", false);
	combFile1.save(combFile1Stream);

	let combFile2 = File.createTempFile("comb_" + sessionid, ".pdf", "", false);
	combFile2.save(combFile2Stream);

	// 出力するPDFファイルパスを作成します。
	let outFile = File.createTempFile("out_" + sessionid, ".pdf", "", false);
	let pdfFileStream = null;
	let errorMessage;

	try {
		// IM-PDFCoordinatorを実行し、PDFファイルを結合します。
		execPdfcoordinatorCombine(combFile1.path(), combFile2.path(), outFile.path());

		// PDFファイルを取得します。
		if(outFile.exist()) {
			pdfFileStream = outFile.load();
		}
	}
	catch(e) {
		errorMessage = e.message + (isUndefined(e.stack) ? '' : '\r\n' + e.stack);
	}

	// 保存したファイルを削除します。
	combFile1.remove();
	combFile2.remove();
	outFile.remove();

	// 生成したPDFファイルをダウンロードします。
	if(pdfFileStream != null) {
		let pdfFileName = combFile1Name.substr(0, combFile1Name.lastIndexOf("."))
			+ "_" + combFile2Name.substr(0, combFile2Name.lastIndexOf(".")) + ".pdf";
		Module.download.send(pdfFileStream, pdfFileName);
	}
	else {
		let logger = Logger.getLogger();
		logger.error(errorMessage);
		let response = Web.getHTTPResponse();
		response.sendError(500, "Failed to combine PDF file.");
	}
}

/**
 * IM-PDFCoordinatorを実行し、PDFファイルを結合します。
 * @param {String} combFile1Path 被結合対象のファイルパス
 * @param {String} combFile2Path 結合対象のファイルパス
 * @param {String} outFilePath 結合後の出力先PDFファイルパス
 */
function execPdfcoordinatorCombine(combFile1Path, combFile2Path, outFilePath)
{
	// PDFをファイル単位で結合するクラスのインスタンスを生成します。
	// @return {Object} PDFをファイル単位で結合するクラスのインスタンス
	let comb = new pdfcombine();
	checkerror(0, comb);

	// エンコード文字列を指定します。
	comb.m_encode = "MS932";

	// 内部メンバの初期化等を行います。
	// @returns {Number} 正常時は0、エラー時は-1を返します。
	let sts = comb.init();
	checkerror(sts, comb);

	// 出力PDFの文書情報を設定します。
	// setdocinfo(title, subTitle, creator, app, keyword);
	// @param {String} title タイトルに設定する文字列を指定します。
	// @param {String} subtitle サブタイトルに設定する文字列を指定します。
	// @param {String} creator 作成者に設定する文字列を指定します。
	// @param {String} app 作成アプリケーションに設定する文字列を指定します。
	// @param {String} keyword キーワードに設定する文字列を指定します。
	sts = comb.setdocinfo("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
	checkerror(sts, comb);

	// 出力PDFのRC4 40ビットセキュリティを設定します。
	// setsecurity(fromtop, showpasswd, securitypasswd, noprint, noedit, nocopy, noaddnote);
	// @param {boolean} fromtop 連結元の先頭のPDFを引継ぎます。
	// @param {String} showpasswd 参照用のパスワードを指定します。
	// @param {String} securitypasswd セキュリティ設定用のパスワードを指定します。
	// @param {boolean} noprint 印刷(true:不可,false:可能)
	// @param {boolean} noedit 編集(true:不可,false:可能)
	// @param {boolean} nocopy 転載(true:不可,false:可能)
	// @param {boolean} noaddnote 注釈追加(true:不可,false:可能)
//	sts = comb.setsecurity(false, "open", "security", false, true, false, true);
//	checkerror(sts, comb);

	// 出力PDFのRC4 128ビットセキュリティを設定します。
	// setsecurity128(showpasswd, securitypasswd, print, access, copy, change);
	// @param {String} showpasswd 参照用のパスワードを指定します。
	// @param {String} securitypasswd セキュリティ設定用のパスワードを指定します。
	// @param {String} print 128bit security(印刷)を指定します。
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} access 128bit security(アクセス)を指定します。
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 128bit security(転載)を指定します。
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 128bit security(文書変更)を指定します。
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = comb.setsecurity128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, comb);

	// 出力PDFのAES 128ビットセキュリティを設定します。
	// setsecurityaes128(showpasswd, securitypasswd, print, access, copy, change);
	// @param {String} showpasswd 参照用のパスワードを指定します。
	// @param {String} securitypasswd セキュリティ設定用のパスワードを指定します。
	// @param {String} print 128bit security(印刷)を指定します。
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} access 128bit security(アクセス)を指定します。
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 128bit security(転載)を指定します。
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 128bit security(文書変更)を指定します。
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = comb.setsecurityaes128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, comb);

	// PDF出力後のWebに最適化の処理の有無を設定します。
	// 特にこのメソッドを呼び出さない場合はデフォルトで最適化されます。
	// setfastwebview(bfastwebview);
	// @param {boolean} bfastwebview true:最適化する,false:最適化しない
	sts = comb.setfastwebview(true);
	checkerror(sts, comb);

	// 出力PDFをオープンし、連結の準備をします。
	// open(outpdf);
	// @param {String} outpdf 出力先PDFのファイル名を指定します。
	sts = comb.open(outFilePath);
	checkerror(sts, comb);

	// 指定ファイルのPDF連結の準備をします。
	// combine(pdf);
	// @param {String} pdf 連結するPDFのファイル名を指定します。
	sts = comb.combine(combFile1Path);
	checkerror(sts, comb);
	sts = comb.combine(combFile2Path);
	checkerror(sts, comb);

	// 出力PDFを連結及びクローズし、連結を終了します。
	sts = comb.close();
	checkerror(sts, comb);

	// 内部のハンドルを開放します。
	comb.release();
}

/**
 * メソッドの戻り値からエラーを判定し、エラーであれば例外を投げます。
 * @param {Number} sts メソッドの戻り値
 * @param {Object} obj メソッドを実行したインスタンス
 */
function checkerror(sts, obj) {
	if (obj == null) {
		throw new Error("did not create the object");
	}
		if (sts < 0) {
			throw new Error("error code:" + obj.geterrorno() + ", error message:" + obj.geterror());
		}
}

5.2.2.2. マージ機能(Merge)

merge.html

 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
<imart type="head">
  <title>IM-PDFCoordinator-チュートリアル-スクリプト開発モデル-merge</title>
	<script type="text/javascript">
		$(function (){
			$("#merge_submit").click(function() {
				if($("#src_file_path").val().length == 0) {
					imuiAlert("PDFファイルを選択してください。", "警告");
					return;
				}
				$("#merge_form").submit();
			});
		});
	</script>
</imart>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル スクリプト開発モデル merge</h1>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>merge プログラム実行</h2></div>
    <div class="imui-box-supplementation">
      <div class="supplementation-left-m">
        <span class="im-ui-icon-common-24-information"></span>
      </div>
      <p class="imui-pgh-section supplementation-left-m">
        アップロードしたPDFファイルに、印影が記載されたPDFファイルを重ね合わせ、処理後PDFファイルをダウンロードします。<br>
        印影が記載されたPDFファイルのサイズ関係上、A4サイズ以上のPDFファイルを指定し、「PDF重ね合わせ」ボタンを押下してください。
      </p>
    </div>
    <imart type="form" action="mergePDF" method="POST" id="merge_form" enctype="multipart/form-data">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-225px">重ね合わせ対象PDFファイル</th>
            <td><input type="file" id="src_file_path" name="src_file_path"></td>
          </tr>
        </tbody>
      </table>
      <div class="imui-operation-parts">
        <imart type="imuiButton" value="PDF重ね合わせ" class="imui-medium-button" id="merge_submit"></imart>
      </div>
    </imart>
  </div>
</div>

merge.js

  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
 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
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
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/**
 * アップロードしたファイルに印影を重ね合わせます。
 * @param {Object} request リクエスト
 */
function mergePDF(request) {

	// リクエストからアップロードした重ね合わせ対象のPDFファイル情報を取得します。
	let uploadFile = request.getParameter("src_file_path");
	let srcFileStream = uploadFile.getValueAsStream();
	let srcFileName = uploadFile.getFileName();

	// アップロードしたファイルを一時ファイルに保管します。
	let sessionid  = Client.identifier();
	let srcFile = File.createTempFile("src_" + sessionid, ".pdf", "", false);
	srcFile.save(srcFileStream);

	// 印影PDFファイルを取得し、一時ファイルとして保管します。
	let stampFile = File.createTempFile("stamp_" + sessionid, ".pdf", "", false);
	let stampFileReader = new PublicStorage("pdfc/tutorial/stamp.pdf").openAsBinary();
	let fileWriter = stampFile.createAsBinary();
	stampFileReader.transferTo(fileWriter);
	fileWriter.close();
	stampFileReader.close();

	// 出力するPDFファイルパスを作成します。
	let outFile = File.createTempFile("out_" + sessionid, ".pdf", "", false);
	let pdfFileStream = null;
	let errorMessage;

	try {
		// IM-PDFCoordinatorを実行し、PDFファイルに印影を重ね合わせます。
		execPdfcoordinatorMerge(srcFile.path(), stampFile.path(), outFile.path());

		// PDFファイルを取得します。
		if(outFile.exist()) {
			pdfFileStream = outFile.load();
		}
	}
	catch(e) {
		errorMessage = e.message + (isUndefined(e.stack) ? '' : '\r\n' + e.stack);
	}

	// 保存したファイルを削除します。
	srcFile.remove();
	stampFile.remove();
	outFile.remove();

	// 生成したPDFファイルをダウンロードします。
	if(pdfFileStream != null) {
		let pdfFileName = srcFileName.substr(0, srcFileName.lastIndexOf(".")) + "_merged.pdf";
		Module.download.send(pdfFileStream, pdfFileName);
	}
	else {
		let logger = Logger.getLogger();
		logger.error(errorMessage);
		let response = Web.getHTTPResponse();
		response.sendError(500, "Failed to merge PDF file.");
	}
}

/**
 * IM-PDFCoordinatorを実行し、PDFファイルに印影を重ね合わせます。
 * @param {String} srcFilePath 重ね合わせ対象のファイルパス
 * @param {String} stampFilePath 印影PDFのファイルパス
 * @param {String} outFilePath 追記後の出力先PDFファイルパス
 */
function execPdfcoordinatorMerge(srcFilePath, stampFilePath, outFilePath)
{
	// PDFマージクラスのインスタンスを生成します。
	// @return {Object} PDFマージクラスのインスタンス
	let merge = new pmumerge();
	checkerror(0, merge);

	// エンコード文字列を指定します。
	merge.m_encode = "MS932";

	// 内部メンバの初期化等を行います。環境ファイルパスを指定できます。
	// @param {String} [etcpath] 環境ファイルパス
	// @returns {Number} 正常時は0、エラー時は-1を返します。
	let sts = merge.init();
	checkerror(sts, merge);

	// 出力PDFの文書情報を設定します。
	// setdocinfo(title, subTitle, creator, app, keyword);
	// @param {String} title タイトルに設定する文字列を指定します。
	// @param {String} subtitle サブタイトルに設定する文字列を指定します。
	// @param {String} creator 作成者に設定する文字列を指定します。
	// @param {String} app 作成アプリケーションに設定する文字列を指定します。
	// @param {String} keyword キーワードに設定する文字列を指定します。
	sts = merge.setdocinfo("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
	checkerror(sts, merge);

	// PDF出力時に設定するRC4 40ビットセキュリティ情報を指定します。
	// setsecurity(openpassword, securitypassword, noprint, noedit, nocopy, noaddnote);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {boolean} noprint 印刷を許可しない。
	// @param {boolean} noedit 編集を許可しない。
	// @param {boolean} nocopy 転載を許可しない。
	// @param {boolean} noaddnote 注釈追加を許可しない。
//	sts = merge.setsecurity(false, "open", "security", false, true, false, true);
//	checkerror(sts, merge);

	// PDF出力時に設定するRC4 128ビットセキュリティ情報を指定します。
	// setsecurity128(openpassword, securitypassword, print, acc, copy, change);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {String} print 印刷
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} acc アクセス
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 転載
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 文書変更
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = merge.setsecurity128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, merge);

	// PDF出力時に設定するAES 128ビットセキュリティ情報を指定します。
	// setsecurityaes128(openpassword, securitypassword, print, acc, copy, change);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {String} print 印刷
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} acc アクセス
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 転載
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 文書変更
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = merge.setsecurityaes128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, merge);

	// PDF出力後のWebに最適化の処理の有無を設定します。
	// 特にこのメソッドを呼び出さない場合はデフォルトで最適化されます。
	// setfastwebview(bfastwebview);
	// @param {boolean} bfastwebview true:最適化する,false:最適化しない
	sts = merge.setfastwebview(true);
	checkerror(sts, merge);

	// マージの基本になるPDFをオープンします。
	// openbase(filename, passwd);
	// @param {String} filename ファイル名
	// @param {String} passwd パスワード
	// @returns {pmumergesrc} マージ処理の基本PDFのpmumergesrcクラス。
	// エラーの場合はnull。
	let srcBase = merge.openbase(srcFilePath, null);
	checkerror(0, srcBase);

	// pmumerge.outpage()によるマージ時の上下関係を設定します。
	// setorder(order);
	// @param {Number} order 任意の数値を指定します。
	// 0が一番下になります。
	// 0以下は0と見なされます。
	sts = srcBase.setorder(0);
	checkerror(sts, srcBase);

	// マージするPDFをオープンします。
	// openmerge(filename, passwd);
	// @param {String} filename ファイル名
	// @param {String} passwd パスワード
	// @returns {pmumergesrc} マージ処理のマージするPDFのpmumergesrcクラス。
	// エラーの場合はnull。
	let srcMerge = merge.openmerge(stampFilePath, null);
	checkerror(0, srcMerge);

	// pmumerge.outpage()によるマージ時の上下関係を設定します。
	// setorder(order);
	// @param {Number} order 任意の数値を指定します。
	// 0が一番下になります。
	// 0以下は0と見なされます。
	sts = srcMerge.setorder(99);
	checkerror(sts, srcMerge);

	// pmumerge.outpage()によるマージ時の原点位置を設定します。
	// setorigin(origin);
	// @param {String} origin 以下の追記オブジェクトの基本位置を指定します。
	// "LT":左上
	// "LM":左中段
	// "LB":左下
	// "CT":中央上
	// "CM":中央中段
	// "CB":中央下
	// "RT":右上
	// "RM":右中段
	// "RB":右下
	sts = srcMerge.setorigin("CM");
	checkerror(sts, srcMerge);

	// どのレイヤに含めるかを設定します。
	// setlayer(layer);
	// @param {pmuobjlayer} layer pmumerge.createlayer()で作成したインスタンスを指定します。
	// レイヤ指定を無効にするにはnullを指定します。
	sts = srcMerge.setlayer(null);
	checkerror(sts, srcMerge);

	// 出力PDFをオープンします。
	// openoutput(filename);
	// @param {String} filename ファイル名
	sts = merge.openoutput(outFilePath);
	checkerror(sts, merge);

	// オープンした切出し元のPDFのページ数を返します。
	// @returns {Number} オープンした切出し元のPDFのページ数
	let basePageCount = srcBase.getpagecount();
	checkerror(basePageCount, srcBase);

	for(let i = 0; i < basePageCount; i++) {
		// pmumerge.outpage()によるマージ対象のページを設定します。
		// setpage(page);
		// @param {Number} page pmumerge.outpage()が出力する、対象になるページを指定します(1以上の値)。
		// 存在しないページ番号を指定した場合は、マージ対象になりません。
		// また、基本PDFは、ページの順序、スキップ、削除はできません。
		// @returns {Number} 0:マージするPDFに、無効なページ番号を指定した。
		// 1:マージするPDFに、有効なページ番号を指定した。
		// 2:基本PDFに正しいページ番号を指定した。
		// 3:基本PDFに正しくない(現在ページ以外)のページ番号を指定した。
		sts = srcMerge.setpage(1);
		checkerror(sts, srcMerge);

		// マージしてページを出力します。
		sts = merge.outpage();
		checkerror(sts, merge);
	}

	// マージ用にオープンされている出力ファイルをクローズします。
	// また、pmumerge.outpage()呼び出しが、基本PDFの途中のページで打ち切られた場合は、残りのページも出力してからクローズします。
	sts = merge.closeoutput();
	checkerror(sts, merge);

	// 内部のハンドルを開放します。
	merge.release();
}

/**
 * メソッドの戻り値からエラーを判定し、エラーであれば例外を投げます。
 * @param {Number} sts メソッドの戻り値
 * @param {Object} obj メソッドを実行したインスタンス
 */
function checkerror(sts, obj) {
	if (obj == null) {
		throw new Error("did not create the object");
	}
	if (sts < 0) {
		throw new Error("error code:" + obj.geterrorno() + ", error message:" + obj.geterror());
	}
}

5.2.2.3. エディット機能(Edit)

edit.html

 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
<imart type="head">
  <title>IM-PDFCoordinator-チュートリアル-スクリプト開発モデル-edit</title>
	<script type="text/javascript">
		$(function (){
			$("#edit_submit").click(function() {
				if($("#src_file_path").val().length == 0) {
					imuiAlert("PDFファイルを選択してください。", "警告");
					return;
				}
				$("#edit_form").submit();
			});
		});
	</script>
</imart>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル スクリプト開発モデル edit</h1>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>edit プログラム実行</h2></div>
    <div class="imui-box-supplementation">
      <div class="supplementation-left-m">
        <span class="im-ui-icon-common-24-information"></span>
      </div>
      <p class="imui-pgh-section supplementation-left-m">
        アップロードしたPDFファイルへ文字・画像を追記し、追記後PDFをダウンロードします。<br>
        追記対象ファイルを指定し、「PDF追記」ボタンを押下してください。
      </p>
    </div>
    <imart type="form" action="editPDF" method="POST" id="edit_form" enctype="multipart/form-data">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-225px">追記対象PDFファイル</th>
            <td><input type="file" id="src_file_path" name="src_file_path"></td>
          </tr>
        </tbody>
      </table>
      <div class="imui-operation-parts">
        <imart type="imuiButton" value="PDF追記" class="imui-medium-button" id="edit_submit"></imart>
      </div>
    </imart>
  </div>
</div>

edit.js

  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
 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
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
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
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
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
/**
 * アップロードしたファイルへ文字・画像を追記します。
 * @param {Object} request リクエスト
 */
function editPDF(request) {

	// リクエストからアップロードした追記されるPDFファイル情報を取得します。
	let uploadFile = request.getParameter("src_file_path");
	let srcFileStream = uploadFile.getValueAsStream();
	let srcFileName = uploadFile.getFileName();

	// アップロードしたファイルを一時ファイルに保管します。
	let sessionid  = Client.identifier();
	let srcFile = File.createTempFile("src_" + sessionid, ".pdf", "", false);
	srcFile.save(srcFileStream);

	// 画像ファイルを取得し、一時ファイルとして保管します。
	let picFile = File.createTempFile("pic_" + sessionid, ".jpg", "", false);
	let picFileReader = new PublicStorage("pdfc/tutorial/bitmap.jpg").openAsBinary();
	let fileWriter = picFile.createAsBinary();
	picFileReader.transferTo(fileWriter);
	fileWriter.close();
	picFileReader.close();

	// 出力するPDFファイルパスを作成します。
	let outFile = File.createTempFile("out_" + sessionid, ".pdf", "", false);
	let pdfFileStream = null;
	let errorMessage;

	try {
		// IM-PDFCoordinatorを実行し、PDFファイルへ追記します。
		execPdfcoordinatorEdit(srcFile.path(), picFile.path(), outFile.path());

		// PDFファイルを取得します。
		if(outFile.exist()) {
			pdfFileStream = outFile.load();
		}
	}
	catch(e) {
		errorMessage = e.message + (isUndefined(e.stack) ? '' : '\r\n' + e.stack);
	}

	// 保存したファイルを削除します。
	srcFile.remove();
	picFile.remove();
	outFile.remove();

	// 生成したPDFファイルをダウンロードします。
	if(pdfFileStream != null) {
		let pdfFileName = srcFileName.substr(0, srcFileName.lastIndexOf(".")) + "_edited.pdf";
		Module.download.send(pdfFileStream, pdfFileName);
	}
	else {
		let logger = Logger.getLogger();
		logger.error(errorMessage);
		let response = Web.getHTTPResponse();
		response.sendError(500, "Failed to edit PDF file.");
	}
}

/**
 * IM-PDFCoordinatorを実行し、PDFファイルへ文字・画像を追記します。
 * @param {String} srcFilePath 被追記対象のファイルパス
 * @param {String} picFilePath 追記対象の画像ファイルパス
 * @param {String} outFilePath 追記後の出力先PDFファイルパス
 */
function execPdfcoordinatorEdit(srcFilePath, picFilePath, outFilePath)
{
	// PDF出力制御クラスのインスタンスを生成します。
	// @return {Object} PDF出力制御クラスのインスタンス
	let dst = new pmudst();
	checkerror(0, dst);

	// エンコード文字列を指定します。
	dst.m_encode = "MS932";

	// 内部メンバの初期化等を行います。
	// @returns {Number} 正常時は0、エラー時は-1を返します。
	let sts = dst.init();
	checkerror(sts, dst);

	// 出力PDFの文書情報を設定します。
	// setdocinfo(title, subTitle, creator, app, keyword);
	// @param {String} title タイトルに設定する文字列を指定します。
	// @param {String} subtitle サブタイトルに設定する文字列を指定します。
	// @param {String} creator 作成者に設定する文字列を指定します。
	// @param {String} app 作成アプリケーションに設定する文字列を指定します。
	// @param {String} keyword キーワードに設定する文字列を指定します。
	sts = dst.setdocinfo("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
	checkerror(sts, dst);

	// PDF出力時に設定するRC4 40ビットセキュリティ情報を指定します。
	// setsecurity(openpassword, securitypassword, noprint, noedit, nocopy, noaddnote);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {boolean} noprint 印刷を許可しない。
	// @param {boolean} noedit 編集を許可しない。
	// @param {boolean} nocopy 転載を許可しない。
	// @param {boolean} noaddnote 注釈追加を許可しない。
//	sts = dst.setsecurity(false, "open", "security", false, true, false, true);
//	checkerror(sts, dst);

	// PDF出力時に設定するRC4 128ビットセキュリティ情報を指定します。
	// setsecurity128(openpassword, securitypassword, print, acc, copy, change);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {String} print 印刷
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} acc アクセス
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 転載
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 文書変更
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = dst.setsecurity128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, dst);

	// PDF出力時に設定するAES 128ビットセキュリティ情報を指定します。
	// setsecurityaes128(openpassword, securitypassword, print, acc, copy, change);
	// @param {String} openpassword 参照用のパスワード
	// @param {String} securitypassword セキュリティ設定用のパスワード
	// @param {String} print 印刷
	// "PRINT_DISABLE":許可しない
	// "PRINT_DEGRADED":低解像度で許可する
	// "PRINT_ENABLE":許可する
	// @param {String} acc アクセス
	// "ACC_DISABLE":許可しない
	// "ACC_ENABLE":許可する
	// @param {String} copy 転載
	// "COPY_DISABLE":許可しない
	// "COPY_ENABLE":許可する
	// @param {String} change 文書変更
	// "DOCCHANGE_DISABLE":許可しない
	// "DOCCHANGE_ASSEMBLE":アセンブリを許可する
	// "DOCCHANGE_FORMFILL":フォーム入力を許可する
	// "DOCCHANGE_ADDNOTE":フォーム入力と注釈追加を許可する
	// "DOCCHANGE_ENABLE":許可する
//	sts = dst.setsecurityaes128("open", "security", "PRINT_DEGRADED", "ACC_ENABLE", "COPY_DISABLE", "DOCCHANGE_ADDNOTE");
//	checkerror(sts, dst);

	// PDF出力後のWebに最適化の処理の有無を設定します。
	// 特にこのメソッドを呼び出さない場合はデフォルトで最適化されます。
	// setfastwebview(bfastwebview);
	// @param {boolean} bfastwebview true:最適化する,false:最適化しない
	sts = dst.setfastwebview(true);
	checkerror(sts, dst);

	// 指定された切出し元のPDFの全てのページを出力時の対象とします。
	// addsrcfile(filename, passwd);
	// @param {String} filename 切出し元のPDFのファイル名
	// @param {String} passwd 切出し元のPDFのパスワード
	// @returns {Number} 切出し元のPDFファイルのページ数を返します。
	sts = dst.addsrcfile(srcFilePath, null);
	checkerror(sts, dst);

	addtext(dst);

	addimage(dst, picFilePath);

	// 指定された切出し元のPDF、及び、追記オブジェクトを指定されたファイルにPDF出力します。
	// outputpdf(filename);
	// @param {String} filename 出力先のPDFファイルのファイル名
	sts = dst.outputpdf(outFilePath);
	checkerror(sts, dst);

	// 内部のハンドルを開放します。
	dst.release();
}

/**
 * 文字列を追記します。
 * @param {Object} dst PDF出力制御クラスのインスタンス
 */
function addtext(dst) {
	let sts = 0;

	// PDF出力時に追記するテキスト枠オブジェクトクラスを作成します。
	// @returns {pmuobjtext} テキスト枠オブジェクトクラス
	let text = dst.createobjtext();
	checkerror(sts, text);
	text.m_encode = "MS932";

	// オブジェクトの基本位置を指定します。
	// setbasepos(postype);
	// @param {String} postype 以下の追記オブジェクトの基本位置を指定します。
	// "XY":XYを使用
	// "LT":左上
	// "LM":左中段
	// "LB":左下
	// "CT":中央上
	// "CM":中央中段
	// "CB":中央下
	// "RT":右上
	// "RM":右中段
	// "RB":右下
	sts = text.setbasepos("LT");
	checkerror(sts, text);

	// 追記オブジェクトをオリジナルPDFの上または下のどちらに追記するかを設定します。
	// setlayer(layertype);
	// @param {String} layertype 以下の追記位置を設定します。
	// "FRONT":追記オブジェクトをオリジナルの上(前面)に配置
	// "BACK":追記オブジェクトをオリジナルの下(背面)に配置
	sts = text.setlayer("FRONT");
	checkerror(sts, text);

	// オブジェクトをどのページにするかを設定します。
	// settargetpage(pagetype, pageno1, pageno2)
	// ページ番号を指定する際は、1ページ目を「1」として指定してください。
	// @param {String} pagetype 以下のページ指定の種類を指定します。
	// "ALL":全てのページ
	// "FROM":指定ページ以降
	// "FROMTO":範囲指定
	// "PAGE":特定のページ
	// "TO":指定ページまで
	// @param {Number} pageno1 ページ番号1
	// @param {Number} pageno2 ページ番号2(FROMTOの場合のみ使用)
	sts = text.settargetpage("PAGE", 1, 0);
	checkerror(sts, text);

	// 追記オブジェクトが使用するフォントのサイズを設定します。
	// setfontsize(fontsize);
	// @param {Number} fontsize フォントのサイズ
	sts = text.setfontsize("32.0");
	checkerror(sts, text);

	// 追記オブジェクトが使用するフォントの色をRGBで設定します。
	// setfontcolor(r, g, b);
	// @param {Number} r 赤値
	// @param {Number} g 緑値
	// @param {Number} b 青値
	sts = text.setfontcolor(255, 0, 0);
	checkerror(sts, text);

	// テキストオブジェクトの文字列を設定します。
	// setstring(str);
	// @param {String} str 文字列
	sts = text.setstring("文字列追記テスト1");
	checkerror(sts, text);

	// テキストオブジェクトの枠線の種類を設定します。
	// setbordertype(bordertype);
	// @param {String} bordertype 以下の枠線の種類を指定します。
	// "AUTONEWLINE":自動改行
	// "BORDERFITSTRING":枠をテキストに合せる
	// "NONAUTONEWLINE":調節なし
	// "STRINGFITBORDER":テキストを枠に合せる
	sts = text.setbordertype("BORDERFITSTRING");
	checkerror(sts, text);
}

/**
 * 画像を追記します。
 * @param {Object} dst PDF出力制御クラスのインスタンス
 * @param {string} picFilePath 追記対象の画像ファイルパス
 */
function addimage(dst, picFilePath) {
	let sts = 0;

	// PDF出力時に追記するイメージオブジェクトクラスを作成します。
	// @returns {pmuobjimage} イメージオブジェクトクラス
	let objimg = dst.createobjimage();
	checkerror(sts, objimg);

	// オブジェクトの基本位置を指定します。
	// setbasepos(postype);
	// @param {String} postype 以下の追記オブジェクトの基本位置を指定します。
	// "XY":XYを使用
	// "LT":左上
	// "LM":左中段
	// "LB":左下
	// "CT":中央上
	// "CM":中央中段
	// "CB":中央下
	// "RT":右上
	// "RM":右中段
	// "RB":右下
	sts = objimg.setbasepos("CM");
	checkerror(sts, objimg);

	// 追記オブジェクトをオリジナルPDFの上または下のどちらに追記するかを設定します。
	// setlayer(layertype);
	// @param {String} layertype 以下の追記位置を設定します。
	// "FRONT":追記オブジェクトをオリジナルの上(前面)に配置
	// "BACK":追記オブジェクトをオリジナルの下(背面)に配置
	sts = objimg.setlayer("BACK");
	checkerror(sts, objimg);

	// オブジェクトをどのページにするかを設定します。
	// settargetpage(pagetype, pageno1, pageno2)
	// ページ番号を指定する際は、1ページ目を「1」として指定してください。
	// @param {String} pagetype 以下のページ指定の種類を指定します。
	// "ALL":全てのページ
	// "FROM":指定ページ以降
	// "FROMTO":範囲指定
	// "PAGE":特定のページ
	// "TO":指定ページまで
	// @param {Number} pageno1 ページ番号1
	// @param {Number} pageno2 ページ番号2(FROMTOの場合のみ使用)
	sts = objimg.settargetpage("ALL", 0, 0);
	checkerror(sts, objimg);

	// イメージオブジェクトの表示の大きさを指定します。
	// setsize(option, width, height);
	// @param {String} option 以下のサイズ指定方法のオプションを指定します。
	// "SIZE":イメージのサイズのまま
	// "WH":指定されたボックスの幅高さ
	// "LT":原寸の比率固定(左上段)
	// "LM":原寸の比率固定(左中段)
	// "LB":原寸の比率固定(左下段)
	// "CT":原寸の比率固定(中央上段)
	// "CM":原寸の比率固定(中央中段)
	// "CB":原寸の比率固定(中央下段)
	// "RT":原寸の比率固定(右上段)
	// "RM":原寸の比率固定(右中段)
	// "RB":原寸の比率固定(右下段)
	// 比率固定を指定した場合、以下のように表示されます。
	// ・原寸に対して、ボックスが縦長の場合:
	//   widthの値を基準とし、画像の高さを調整。
	//   調整後、ボックスに対して上段、中段、下段揃えで表示。
	// ・原寸に対して、ボックスが横長の場合:
	//   heightの値を基準とし、画像の幅を調整。
	//   調整後、ボックスに対して左、中央、右揃えで表示。
	// @param {Number} width 幅
	// @param {Number} height 高さ
	sts = objimg.setsize("SIZE", 255, 407);
	checkerror(sts, objimg);

	// イメージオブジェクトのファイル名を設定します。
	// setfilename(imgtype, filename);
	// @param {String} imgtype 以下のイメージファイルの種類を指定します。
	// "BMP":Windows BMP
	// "JPG":JPG
	// "PNG":PNG
	// "PNGALPHA":アルファチャンネルを持つPNG
	// "TIFFG4":TIFF G4
	// @param {String} filename イメージファイル名
	sts = objimg.setfilename("JPG", picFilePath);
	checkerror(sts, objimg);
}

/**
 * メソッドの戻り値からエラーを判定し、エラーであれば例外を投げます。
 * @param {Number} sts メソッドの戻り値
 * @param {Object} obj メソッドを実行したインスタンス
 */
function checkerror(sts, obj) {
	if (obj == null) {
		throw new Error("did not create the object");
	}
	if (sts < 0) {
		throw new Error("error code:" + obj.geterrorno() + ", error message:" + obj.geterror());
	}
}

5.2.3. ルーティング設定ファイルの作成

ルーティング用のxmlファイルを作成します。

Resin の場合、< %RESIN_HOME%/webapps/warファイルと同名のディレクトリ/WEB-INF/conf/routing-jssp-config >の配下に、それぞれ次の名前でファイルを作成します。

機能 xmlファイル名
ページ機能(Page) sample-pdfc-script-combine.xml
マージ機能(Merge) sample-pdfc-script-merge.xml
エディット機能(Edit) sample-pdfc-script-edit.xml

注意

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

5.2.3.1. ページ機能(Page)

sample-pdfc-script-combine.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<routing-jssp-config
	xmlns="http://www.intra-mart.jp/router/routing-jssp-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.intra-mart.jp/router/routing-jssp-config ../../schema/routing-jssp-config.xsd ">

	<authz-default mapper="welcome-all" />
	<file-mapping path="pdfc/script/combine" page="pdfc/combine">
		<authz uri="service://pdfc/script/combine" action="execute" />
	</file-mapping>

</routing-jssp-config>

5.2.3.2. マージ機能(Merge)

sample-pdfc-script-merge.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<routing-jssp-config
	xmlns="http://www.intra-mart.jp/router/routing-jssp-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.intra-mart.jp/router/routing-jssp-config ../../schema/routing-jssp-config.xsd ">

	<authz-default mapper="welcome-all" />
	<file-mapping path="pdfc/script/merge" page="pdfc/merge">
		<authz uri="service://pdfc/script/merge" action="execute" />
	</file-mapping>

</routing-jssp-config>

5.2.3.3. エディット機能(Edit)

sample-pdfc-script-edit.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<routing-jssp-config
	xmlns="http://www.intra-mart.jp/router/routing-jssp-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.intra-mart.jp/router/routing-jssp-config ../../schema/routing-jssp-config.xsd ">

	<authz-default mapper="welcome-all" />
	<file-mapping path="pdfc/script/edit" page="pdfc/edit">
		<authz uri="service://pdfc/script/edit" action="execute" />
	</file-mapping>

</routing-jssp-config>

5.2.4. プログラムの登録

作成したhtmlファイルとjsファイルを環境に適用するため、 Web Application Server を再起動してください。

再起動後、プログラムを認可とメニューに設定します。

5.2.4.1. 認可設定

  1. テナント管理者でログインし、次のメニューを設定します。

  2. [テナント管理]-[認可]画面を開きます。

  3. [権限設定を開始する]ボタンを押下します。

    ../../_images/script_1.png
  4. [リソース]を選択し、[リソースの詳細を開く]押下します。

    ../../_images/script_2.png
  5. [配下にリソースを新規作成]を押下します。

    ../../_images/script_3.png
  6. リソースグループを作成します。

    ../../_images/script_4.png
  7. リソースグループ名に、次の値を設定します。

    機能 リソースグループ名
    ページ機能(Page) Script_PDF結合サンプル
    マージ機能(Merge) Script_PDFマージサンプル
    エディット機能(Edit) Script_PDF追記サンプル
    ../../_images/script_5.png
  8. リソースURIに、次の値を設定します。

    機能 リソースURI
    ページ機能(Page) service://pdfc/script/combine
    マージ機能(Merge) service://pdfc/script/merge
    エディット機能(Edit) service://pdfc/script/edit
    ../../_images/script_6.png
  9. 作成したリソースグループで「認証済みユーザ」に「全て許可」を付与します。

    ../../_images/script_7.png

5.2.4.2. メニュー設定

  1. テナント管理者でログインし、次のメニューを設定します。

  2. [テナント管理]-[メニュー]画面を開きます。

  3. メニューフォルダを作成します。

    同一のメニューフォルダを既に設定している場合、当該手順は不要です。

    ../../_images/script_8.png
  4. 作成したフォルダの下にメニューアイテムを新規作成し、メニューアイテム名、および、URLに次の値を設定します。

    機能 メニューアイテム名 URL
    ページ機能(Page) Script_combine pdfc/script/combine
    マージ機能(Merge) Script_merge pdfc/script/merge
    エディット機能(Edit) Script_edit pdfc/script/edit
    ../../_images/script_9.png
  5. メニュー設定は完了です。

    ../../_images/script_10.png

5.2.5. プログラムの実行と確認

メニューで次のアイテムを選択することにより、作成した画面が表示されます。

機能 メニューアイテム名
ページ機能(Page) Script_combine
マージ機能(Merge) Script_merge
エディット機能(Edit) Script_edit

画面上で処理対象ファイルをアップロードすることで、編集/加工処理のプログラムが実行され、処理されたPDFファイルがダウンロードされます。

PDFビューア( Adobe Acrobat Reader など)で処理後のファイルが正しく表示されることを確認し、このチュートリアルは完了です。