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

5.1. JSPプログラムの作成( JavaEE開発モデル )

JavaEE開発モデル として、JSPのプログラムを作成します。

5.1.1. 準備

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

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

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

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

    コラム

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

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

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

5.1.2. JSPファイルの作成

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

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

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

注意

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

コラム

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

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

5.1.2.1. ページ機能(Page)

combine.jsp

 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
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-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>
</imui:head>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル JavaEE開発モデル 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>
    <form action="pdfc/javaee/combine_act" 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">
        <imui:button value="PDF結合" class="imui-medium-button" id="combine_submit" />
      </div>
    </form>
  </div>
</div>

combine_act.jsp

  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
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import="java.util.Date" %>
<%@ page import="java.text.ParseException" %>
<%@ page import="java.text.SimpleDateFormat" %>

<%@ page import="yss.pdfmakeup.pdfcombine" %>
<%@ page import="java.nio.file.Path" %>
<%@ page import="java.nio.file.Files" %>
<%@ page import="jp.co.intra_mart.foundation.service.client.file.PublicStorage" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData.Entity" %>
<%@ page import="java.nio.file.StandardCopyOption" %>

<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<%
  String message = "";
  int resultCode = 0;
  String dirPath = "pdfc/tutorial";

  ArrayList<Path> tempFiles = new ArrayList<Path>();

  // 結合したPDFファイルの一時出力先を作成します。
  Path tempOutputFile = Files.createTempFile("combineOut_", ".pdf");
  tempFiles.add(tempOutputFile);

  // 出力するPDFファイルパスを作成します。
  PublicStorage outputFile = new PublicStorage(dirPath + "/result/combine_" + session.getId() + ".pdf");

  // リクエストからアップロードした情報を取得します。
  MultipartFormData multipartFormData = new MultipartFormData(request);

  // 1つ目の結合ファイルを一時ファイルにコピーします。
  Path combFile1Path = Files.createTempFile("combine1_", ".pdf");
  tempFiles.add(combFile1Path);
  try (InputStream in = multipartFormData.getEntity("comb_file_1_path").getInputStream()) {
    Files.copy(in, combFile1Path, StandardCopyOption.REPLACE_EXISTING);
  }
  // 2つ目の結合ファイルを一時ファイルにコピーします。
  Path combFile2Path = Files.createTempFile("combine2_", ".pdf");
  tempFiles.add(combFile2Path);
  try (InputStream in = multipartFormData.getEntity("comb_file_2_path").getInputStream()) {
    Files.copy(in, combFile2Path, StandardCopyOption.REPLACE_EXISTING);
  }

  // IM-PDFCoordinatorを実行し、PDFファイルを結合します。
  Result result = execPdfcoordinatorCombine(combFile1Path, combFile2Path, tempOutputFile);

  resultCode = result.code;
  message = result.message;

  if (resultCode == 0) {
    // 生成したPDFファイルをパブリックストレージへコピーします。
    try (OutputStream os = outputFile.create()) {
      Files.copy(tempOutputFile, os);
    }
  }

  // 一時ファイルを削除します。
  for (Path file : tempFiles) {
    if (Files.exists(file)) {
        Files.delete(file);
    }
  }
%>

<%!
  public static class Result {
    public int code;
    public String message;

    public Result(int code, String message) {
      this.code =code;
      this.message = message;
    }
  }

  public static Result execPdfcoordinatorCombine(Path combFile1Path, Path combFile2Path, Path outFilePath) {
    int sts = 0;

    // PDFをファイル単位で結合するクラスのインスタンスを生成します。
    // @return {pdfcombine} PDFをファイル単位で結合するクラスのインスタンス
    pdfcombine comb = new pdfcombine();
    if (comb == null) return new Result(-999, "did not create the object");

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

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

    // 出力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("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
    if (sts < 0) return new Result(sts, comb.geterror());

    // 出力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);
//    if (sts < 0) return new Result(sts, comb.geterror());

    // 出力PDFのRC4 128ビットセキュリティを設定します。
    // setsecurity128(showpasswd, securitypasswd, print, access, copy, change);
    // @param {String} showpasswd 参照用のパスワードを指定します。
    // @param {String} securitypasswd セキュリティ設定用のパスワードを指定します。
    // @param {int} print 128bit security(印刷)を指定します。
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} access 128bit security(アクセス)を指定します。
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 128bit security(転載)を指定します。
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 128bit security(文書変更)を指定します。
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = comb.setsecurity128("open", "security", comb.SEC128PRINT_DEGRADED, comb.SEC128ACC_ENABLE, comb.SEC128COPY_DISABLE, comb.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, comb.geterror());

    // 出力PDFのAES 128ビットセキュリティを設定します。
    // setsecurityaes128(showpasswd, securitypasswd, print, access, copy, change);
    // @param {String} showpasswd 参照用のパスワードを指定します。
    // @param {String} securitypasswd セキュリティ設定用のパスワードを指定します。
    // @param {int} print 128bit security(印刷)を指定します。
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} access 128bit security(アクセス)を指定します。
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 128bit security(転載)を指定します。
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 128bit security(文書変更)を指定します。
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = comb.setsecurityaes128("open", "security", comb.SEC128PRINT_DEGRADED, comb.SEC128ACC_ENABLE, comb.SEC128COPY_DISABLE, comb.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, comb.geterror());

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

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

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

    // 出力PDFを連結及びクローズし、連結を終了します。
    sts = comb.close();
    if (sts < 0) return new Result(sts, comb.geterror());

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

    return new Result(sts, "Success !!");
  }
%>

<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-combine</title>
</imui:head>

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

<div class="imui-toolbar-wrap">
  <div class="imui-toolbar-inner">
    <ul class="imui-list-toolbar">
      <li><a href="javascript:history.back()" class="imui-toolbar-icon" title="戻る">
        <span class="im-ui-icon-common-16-back"></span></a></li>
    </ul>
  </div>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>実行結果</h2></div>
    <form action="pdfc/outfile" method="POST">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-20">出力PDFファイル</th>
            <td>%PUBLIC_STORAGE_PATH%/<%= outputFile.getPath() %></td>
          </tr>
          <tr>
            <th>戻り値</th>
            <td><%= resultCode %></td>
          </tr>
          <tr>
            <th>メッセージ</th>
            <td><%= message %></td>
          </tr>
        </tbody>
      </table>
      <% if(resultCode == 0) { %>
        <div class="imui-operation-parts">
          <imui:button value="ダウンロード" class="imui-medium-button" onClick="form.submit()" />
          <input type="hidden" name="downloadFile" value="<%= outputFile.getPath() %>" />
        </div>
      <% } %>
    </form>
</div>

5.1.2.2. マージ機能(Merge)

merge.jsp

 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
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-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>
</imui:head>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル JavaEE開発モデル 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>
    <form action="pdfc/javaee/merge_act" 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">
        <imui:button value="PDF重ね合わせ" class="imui-medium-button" id="merge_submit"></imart>
      </div>
    </form>
  </div>
</div>

merge_act.jsp

  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
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import="java.util.Date" %>
<%@ page import="java.text.ParseException" %>
<%@ page import="java.text.SimpleDateFormat" %>

<%@ page import="yss.pdfmakeup.pmumerge" %>
<%@ page import="yss.pdfmakeup.pmumergesrc" %>
<%@ page import="java.nio.file.Path" %>
<%@ page import="java.nio.file.Files" %>
<%@ page import="jp.co.intra_mart.foundation.service.client.file.PublicStorage" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData.Entity" %>
<%@ page import="java.nio.file.StandardCopyOption" %>

<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<%
  String message = "";
  int resultCode = 0;
  String dirPath = "pdfc/tutorial";
  String stampFilePath = dirPath + "/stamp.pdf";

  ArrayList<Path> tempFiles = new ArrayList<Path>();

  // 結合したPDFファイルの一時出力先を作成します。
  Path tempOutputFile = Files.createTempFile("mergeOut_", ".pdf");
  tempFiles.add(tempOutputFile);

  // 出力するPDFファイルパスを作成します。
  PublicStorage outputFile = new PublicStorage(dirPath + "/result/merge_" + session.getId() + ".pdf");

  // リクエストからアップロードした情報を取得します。
  MultipartFormData multipartFormData = new MultipartFormData(request);

  // アップロードされたファイルを一時ファイルにコピーします。
  Path srcFilePath = Files.createTempFile("src_", ".pdf");
  tempFiles.add(srcFilePath);
  try (InputStream in = multipartFormData.getEntity("src_file_path").getInputStream()) {
    Files.copy(in, srcFilePath, StandardCopyOption.REPLACE_EXISTING);
  }
  // 印影PDFファイルを一時ファイルにコピーします。
  Path tempStampFilePath = Files.createTempFile("stamp_", ".pdf");
  tempFiles.add(tempStampFilePath);
  try (InputStream in = new PublicStorage(stampFilePath).open()) {
    Files.copy(in, tempStampFilePath, StandardCopyOption.REPLACE_EXISTING);
  }

  // IM-PDFCoordinatorを実行し、PDFファイルに印影を重ね合わせます。
  Result result = execPdfcoordinatorMerge(srcFilePath, tempStampFilePath, tempOutputFile);

  resultCode = result.code;
  message = result.message;

  if (resultCode == 0) {
    // 生成したPDFファイルをパブリックストレージへコピーします。
    try (OutputStream os = outputFile.create()) {
      Files.copy(tempOutputFile, os);
    }
  }

  // 一時ファイルを削除します。
  for (Path file : tempFiles) {
    if (Files.exists(file)) {
        Files.delete(file);
    }
  }
%>

<%!
  public static class Result {
    public int code;
    public String message;

    public Result(int code, String message) {
      this.code =code;
      this.message = message;
    }
  }

  public static Result execPdfcoordinatorMerge(Path srcFilePath, Path stampFilePath, Path outFilePath) {
    int sts = 0;

    // PDFマージクラスのインスタンスを生成します。
    // @return {pmumerge} PDFマージクラスのインスタンス
    pmumerge merge = new pmumerge();
    if (merge == null) return new Result(-999, "did not create the object");

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

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

    // 出力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("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
    if (sts < 0) return new Result(sts, merge.geterror());

    // 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);
//    if (sts < 0) return new Result(sts, merge.geterror());

    // PDF出力時に設定するRC4 128ビットセキュリティ情報を指定します。
    // setsecurity128(openpassword, securitypassword, print, acc, copy, change);
    // @param {String} openpassword 参照用のパスワード
    // @param {String} securitypassword セキュリティ設定用のパスワード
    // @param {int} print 印刷
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} acc アクセス
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 転載
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 文書変更
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = merge.setsecurity128("open", "security", merge.SEC128PRINT_DEGRADED, merge.SEC128ACC_ENABLE, merge.SEC128COPY_DISABLE, merge.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, merge.geterror());

    // PDF出力時に設定するAES 128ビットセキュリティ情報を指定します。
    // setsecurityaes128(openpassword, securitypassword, print, acc, copy, change);
    // @param {String} openpassword 参照用のパスワード
    // @param {String} securitypassword セキュリティ設定用のパスワード
    // @param {int} print 印刷
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} acc アクセス
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 転載
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 文書変更
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = merge.setsecurityaes128("open", "security", merge.SEC128PRINT_DEGRADED, merge.SEC128ACC_ENABLE, merge.SEC128COPY_DISABLE, merge.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, merge.geterror());

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

    // マージの基本になるPDFをオープンします。
    // openbase(filename, passwd);
    // @param {String} filename ファイル名
    // @param {String} passwd パスワード
    // @returns {pmumergesrc} マージ処理の基本PDFのpmumergesrcクラス。
    // エラーの場合はnull。
    pmumergesrc srcBase = merge.openbase(srcFilePath.toString(), null);
    if (srcBase == null) return new Result(-999, "did not create the object");

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

    // マージするPDFをオープンします。
    // openmerge(filename, passwd);
    // @param {String} filename ファイル名
    // @param {String} passwd パスワード
    // @returns {pmumergesrc} マージ処理のマージするPDFのpmumergesrcクラス。
    // エラーの場合はnull。
    pmumergesrc srcMerge = merge.openmerge(stampFilePath.toString(), null);
    if (srcMerge == null) return new Result(-999, "did not create the object");

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

    // pmumerge.outpage()によるマージ時の原点位置を設定します。
    // setorigin(origin);
    // @param {String} origin 以下の追記オブジェクトの基本位置を指定します。
    // ORIGIN_LT:左上
    // ORIGIN_LM:左中段
    // ORIGIN_LB:左下
    // ORIGIN_CT:中央上
    // ORIGIN_CM:中央中段
    // ORIGIN_CB:中央下
    // ORIGIN_RT:右上
    // ORIGIN_RM:右中段
    // ORIGIN_RB:右下
    sts = srcMerge.setorigin(srcMerge.ORIGIN_CM);
    if (sts < 0) return new Result(sts, srcMerge.geterror());

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

    // 出力PDFをオープンします。
    // openoutput(filename);
    // @param {String} filename ファイル名
    sts = merge.openoutput(outFilePath.toString());
    if (sts < 0) return new Result(sts, merge.geterror());

    // オープンした切出し元のPDFのページ数を返します。
    // @returns {int} オープンした切出し元のPDFのページ数
    int basePageCount = srcBase.getpagecount();
    if (basePageCount < 0) return new Result(basePageCount, srcBase.geterror());

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

      // マージしてページを出力します。
      sts = merge.outpage();
      if (sts < 0) return new Result(sts, merge.geterror());
    }

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

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

    return new Result(sts, "Success !!");
  }
%>

<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-merge</title>
</imui:head>

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

<div class="imui-toolbar-wrap">
  <div class="imui-toolbar-inner">
    <ul class="imui-list-toolbar">
      <li><a href="javascript:history.back()" class="imui-toolbar-icon" title="戻る">
        <span class="im-ui-icon-common-16-back"></span></a></li>
    </ul>
  </div>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>実行結果</h2></div>
    <form action="pdfc/outfile" method="POST">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-20">出力PDFファイル</th>
            <td>%PUBLIC_STORAGE_PATH%/<%= outputFile.getPath() %></td>
          </tr>
          <tr>
            <th>戻り値</th>
            <td><%= resultCode %></td>
          </tr>
          <tr>
            <th>メッセージ</th>
            <td><%= message %></td>
          </tr>
        </tbody>
      </table>
      <% if(resultCode == 0) { %>
        <div class="imui-operation-parts">
          <imui:button value="ダウンロード" class="imui-medium-button" onClick="form.submit()" />
          <input type="hidden" name="downloadFile" value="<%= outputFile.getPath() %>" />
        </div>
      <% } %>
  </form>
</div>

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

edit.jsp

 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
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-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>
</imui:head>

<div class="imui-title">
  <h1>IM-PDFCoordinator チュートリアル JavaEE開発モデル 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>
    <form action="pdfc/javaee/edit_act" 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">
        <imui:button value="PDF追記" class="imui-medium-button" id="edit_submit" />
      </div>
    </form>
  </div>
</div>

edit_act.jsp

  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
363
364
365
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
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import="java.util.Date" %>
<%@ page import="java.text.ParseException" %>
<%@ page import="java.text.SimpleDateFormat" %>

<%@ page import="yss.pdfmakeup.pmudst" %>
<%@ page import="yss.pdfmakeup.pmuobjtext" %>
<%@ page import="yss.pdfmakeup.pmuobjimage" %>
<%@ page import="java.nio.file.Path" %>
<%@ page import="java.nio.file.Files" %>
<%@ page import="jp.co.intra_mart.foundation.service.client.file.PublicStorage" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData" %>
<%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData.Entity" %>
<%@ page import="java.nio.file.StandardCopyOption" %>

<%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
<%
  String message = "";
  int resultCode = 0;
  String dirPath = "pdfc/tutorial";
  String picFilePath = dirPath + "/bitmap.jpg";

  ArrayList<Path> tempFiles = new ArrayList<Path>();

  // 結合したPDFファイルの一時出力先を作成します。
  Path tempOutputFile = Files.createTempFile("editOut_", ".pdf");
  tempFiles.add(tempOutputFile);

  // 出力するPDFファイルパスを作成します。
  PublicStorage outputFile = new PublicStorage(dirPath + "/result/edit_" + session.getId() + ".pdf");

  // リクエストからアップロードした情報を取得します。
  MultipartFormData multipartFormData = new MultipartFormData(request);

  // アップロードされたファイルを一時ファイルにコピーします。
  Path srcFilePath = Files.createTempFile("src_", ".pdf");
  tempFiles.add(srcFilePath);
  try (InputStream in = multipartFormData.getEntity("src_file_path").getInputStream()) {
    Files.copy(in, srcFilePath, StandardCopyOption.REPLACE_EXISTING);
  }
  // 画像ファイルを一時ファイルにコピーします。
  Path tempPicFilePath = Files.createTempFile("pic_", ".jpg");
  tempFiles.add(tempPicFilePath);
  try (InputStream in = new PublicStorage(picFilePath).open()) {
    Files.copy(in, tempPicFilePath, StandardCopyOption.REPLACE_EXISTING);
  }

  // IM-PDFCoordinatorを実行し、PDFファイルへ追記します。
  Result result = execPdfcoordinatorEdit(srcFilePath, tempPicFilePath, tempOutputFile);

  resultCode = result.code;
  message = result.message;

  if (resultCode == 0) {
    // 生成したPDFファイルをパブリックストレージへコピーします。
    try (OutputStream os = outputFile.create()) {
      Files.copy(tempOutputFile, os);
    }
  }

  // 一時ファイルを削除します。
  for (Path file : tempFiles) {
    if (Files.exists(file)) {
        Files.delete(file);
    }
  }
%>

<%!
  public static class Result {
    public int code;
    public String message;

    public Result(int code, String message) {
      this.code =code;
      this.message = message;
    }
  }

  public static Result execPdfcoordinatorEdit(Path srcFilePath, Path picFilePath, Path outFilePath) {
    int sts = 0;
    Result result = null;

    // PDF出力制御クラスのインスタンスを生成します。
    // @return {pmudst} PDF出力制御クラスのインスタンス
    pmudst dst = new pmudst();
    if (dst == null) return new Result(-999, "did not create the object");

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

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

    // 出力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("文書タイトル", "文書サブタイトル", "作成者", "作成アプリケーション名", "キーワード");
    if (sts < 0) return new Result(sts, dst.geterror());

    // 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);
//    if (sts < 0) return new Result(sts, dst.geterror());

    // PDF出力時に設定するRC4 128ビットセキュリティ情報を指定します。
    // setsecurity128(openpassword, securitypassword, print, acc, copy, change);
    // @param {String} openpassword 参照用のパスワード
    // @param {String} securitypassword セキュリティ設定用のパスワード
    // @param {int} print 印刷
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} acc アクセス
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 転載
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 文書変更
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = dst.setsecurity128("open", "security", dst.SEC128PRINT_DEGRADED, dst.SEC128ACC_ENABLE, dst.SEC128COPY_DISABLE, dst.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, dst.geterror());

    // PDF出力時に設定するAES 128ビットセキュリティ情報を指定します。
    // setsecurityaes128(openpassword, securitypassword, print, acc, copy, change);
    // @param {String} openpassword 参照用のパスワード
    // @param {String} securitypassword セキュリティ設定用のパスワード
    // @param {int} print 印刷
    // SEC128PRINT_DISABLE:許可しない
    // SEC128PRINT_DEGRADED:低解像度で許可する
    // SEC128PRINT_ENABLE:許可する
    // @param {int} acc アクセス
    // SEC128ACC_DISABLE:許可しない
    // SEC128ACC_ENABLE:許可する
    // @param {int} copy 転載
    // SEC128COPY_DISABLE:許可しない
    // SEC128COPY_ENABLE:許可する
    // @param {int} change 文書変更
    // SEC128DOCCHANGE_DISABLE:許可しない
    // SEC128DOCCHANGE_ASSEMBLE:アセンブリを許可する
    // SEC128DOCCHANGE_FORMFILL:フォーム入力を許可する
    // SEC128DOCCHANGE_ADDNOTE:フォーム入力と注釈追加を許可する
    // SEC128DOCCHANGE_ENABLE:許可する
//    sts = dst.setsecurityaes128("open", "security", dst.SEC128PRINT_DEGRADED, dst.SEC128ACC_ENABLE, dst.SEC128COPY_DISABLE, dst.SEC128DOCCHANGE_ADDNOTE);
//    if (sts < 0) return new Result(sts, dst.geterror());

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

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

    result = addtext(dst);
    if (result.code < 0) return result;

    result = addimage(dst, picFilePath);
    if (result.code < 0) return result;

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

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

    return new Result(sts, "Success !!");
  }

  public static Result addtext(pmudst dst) {
    int sts = 0;

    // PDF出力時に追記するテキスト枠オブジェクトクラスを作成します。
    // @returns {pmuobjtext} テキスト枠オブジェクトクラス
    pmuobjtext text = dst.createobjtext();
    if (text == null) return new Result(-999, "did not create the object");
    text.m_encode = "MS932";

    // オブジェクトの基本位置を指定します。
    // setbasepos(postype);
    // @param {int} postype 以下の追記オブジェクトの基本位置を指定します。
    // POS_XY:XYを使用
    // POS_LT:左上
    // POS_LM:左中段
    // POS_LB:左下
    // POS_CT:中央上
    // POS_CM:中央中段
    // POS_CB:中央下
    // POS_RT:右上
    // POS_RM:右中段
    // POS_RB:右下
    sts = text.setbasepos(text.POS_LT);
    if (sts < 0) return new Result(sts, text.geterror());

    // 追記オブジェクトをオリジナルPDFの上または下のどちらに追記するかを設定します。
    // setlayer(layertype);
    // @param {int} layertype 以下の追記位置を設定します。
    // LAYER_FRONT:追記オブジェクトをオリジナルの上(前面)に配置
    // LAYER_BACK:追記オブジェクトをオリジナルの下(背面)に配置
    sts = text.setlayer(text.LAYER_FRONT);
    if (sts < 0) return new Result(sts, text.geterror());

    // オブジェクトをどのページにするかを設定します。
    // settargetpage(pagetype, pageno1, pageno2)
    // ページ番号を指定する際は、1ページ目を「1」として指定してください。
    // @param {int} pagetype 以下のページ指定の種類を指定します。
    // PAGETYPE_ALL:全てのページ
    // PAGETYPE_FROM:指定ページ以降
    // PAGETYPE_FROMTO:範囲指定
    // PAGETYPE_PAGE:特定のページ
    // PAGETYPE_TO:指定ページまで
    // @param {int} pageno1 ページ番号1
    // @param {int} pageno2 ページ番号2(FROMTOの場合のみ使用)
    sts = text.settargetpage(text.PAGETYPE_PAGE, 1, 0);
    if (sts < 0) return new Result(sts, text.geterror());

    // 追記オブジェクトが使用するフォントのサイズを設定します。
    // setfontsize(fontsize);
    // @param {double} fontsize フォントのサイズ
    sts = text.setfontsize(32.0);
    if (sts < 0) return new Result(sts, text.geterror());

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

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

    // テキストオブジェクトの枠線の種類を設定します。
    // setbordertype(bordertype);
    // @param {int} bordertype 以下の枠線の種類を指定します。
    // BORDER_AUTONEWLINE:自動改行
    // BORDER_BORDERFITSTRING:枠をテキストに合せる
    // BORDER_NONAUTONEWLINE:調節なし
    // BORDER_STRINGFITBORDER:テキストを枠に合せる
    sts = text.setbordertype(text.BORDER_BORDERFITSTRING);
    if (sts < 0) return new Result(sts, text.geterror());

    return new Result(sts, "Success !!");
  }

  public static Result addimage(pmudst dst, Path picFilePath) {
    int sts = 0;

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

    // オブジェクトの基本位置を指定します。
    // setbasepos(postype);
    // @param {int} postype 以下の追記オブジェクトの基本位置を指定します。
    // POS_XY:XYを使用
    // POS_LT:左上
    // POS_LM:左中段
    // POS_LB:左下
    // POS_CT:中央上
    // POS_CM:中央中段
    // POS_CB:中央下
    // POS_RT:右上
    // POS_RM:右中段
    // POS_RB:右下
    sts = objimg.setbasepos(objimg.POS_CM);
    if (sts < 0) return new Result(sts, objimg.geterror());

    // 追記オブジェクトをオリジナルPDFの上または下のどちらに追記するかを設定します。
    // setlayer(layertype);
    // @param {int} layertype 以下の追記位置を設定します。
    // LAYER_FRONT:追記オブジェクトをオリジナルの上(前面)に配置
    // LAYER_BACK:追記オブジェクトをオリジナルの下(背面)に配置
    sts = objimg.setlayer(objimg.LAYER_BACK);
    if (sts < 0) return new Result(sts, objimg.geterror());

    // オブジェクトをどのページにするかを設定します。
    // settargetpage(pagetype, pageno1, pageno2)
    // ページ番号を指定する際は、1ページ目を「1」として指定してください。
    // @param {int} pagetype 以下のページ指定の種類を指定します。
    // PAGETYPE_ALL:全てのページ
    // PAGETYPE_FROM:指定ページ以降
    // PAGETYPE_FROMTO:範囲指定
    // PAGETYPE_PAGE:特定のページ
    // PAGETYPE_TO:指定ページまで
    // @param {int} pageno1 ページ番号1
    // @param {int} pageno2 ページ番号2(FROMTOの場合のみ使用)
    sts = objimg.settargetpage(objimg.PAGETYPE_ALL, 0, 0);
    if (sts < 0) return new Result(sts, objimg.geterror());

    // イメージオブジェクトの表示の大きさを指定します。
    // setsize(option, width, height);
    // @param {int} option 以下のサイズ指定方法のオプションを指定します。
    // IMGWH_SIZE:イメージのサイズのまま
    // IMGWH_WH:指定されたボックスの幅高さ
    // IMGWH_LT:原寸の比率固定(左上段)
    // IMGWH_LM:原寸の比率固定(左中段)
    // IMGWH_LB:原寸の比率固定(左下段)
    // IMGWH_CT:原寸の比率固定(中央上段)
    // IMGWH_CM:原寸の比率固定(中央中段)
    // IMGWH_CB:原寸の比率固定(中央下段)
    // IMGWH_RT:原寸の比率固定(右上段)
    // IMGWH_RM:原寸の比率固定(右中段)
    // IMGWH_RB:原寸の比率固定(右下段)
    // 比率固定を指定した場合、以下のように表示されます。
    // ・原寸に対して、ボックスが縦長の場合:
    //   widthの値を基準とし、画像の高さを調整。
    //   調整後、ボックスに対して上段、中段、下段揃えで表示。
    // ・原寸に対して、ボックスが横長の場合:
    //   heightの値を基準とし、画像の幅を調整。
    //   調整後、ボックスに対して左、中央、右揃えで表示。
    // @param {double} width 幅
    // @param {double} height 高さ
    sts = objimg.setsize(objimg.IMGWH_SIZE, 255, 407);
    if (sts < 0) return new Result(sts, objimg.geterror());

    // イメージオブジェクトのファイル名を設定します。
    // setfilename(imgtype, filename);
    // @param {int} imgtype 以下のイメージファイルの種類を指定します。
    // IMGTYPE_BMP:Windows BMP
    // IMGTYPE_JPG:JPG
    // IMGTYPE_PNG:PNG
    // IMGTYPE_PNGALPHA:アルファチャンネルを持つPNG
    // IMGTYPE_TIFFG4:TIFF G4
    // @param {String} filename イメージファイル名
    sts = objimg.setfilename(objimg.IMGTYPE_JPG, picFilePath.toString());
    if (sts < 0) return new Result(sts, objimg.geterror());

    return new Result(sts, "Success !!");
  }
%>

<imui:head>
  <title>IM-PDFCoordinator-チュートリアル-JavaEE開発モデル-edit</title>
</imui:head>

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

<div class="imui-toolbar-wrap">
  <div class="imui-toolbar-inner">
    <ul class="imui-list-toolbar">
      <li><a href="javascript:history.back()" class="imui-toolbar-icon" title="戻る">
        <span class="im-ui-icon-common-16-back"></span></a></li>
    </ul>
  </div>
</div>

<div class="imui-form-container">
  <div class="imui-chapter-title"><h2>実行結果</h2></div>
    <form action="pdfc/outfile" method="POST">
      <table class="imui-table">
        <tbody>
          <tr>
            <th class="wd-20">出力PDFファイル</th>
            <td>%PUBLIC_STORAGE_PATH%/<%= outputFile.getPath() %></td>
          </tr>
          <tr>
            <th>戻り値</th>
            <td><%= resultCode %></td>
          </tr>
          <tr>
            <th>メッセージ</th>
            <td><%= message %></td>
          </tr>
        </tbody>
      </table>
      <% if(resultCode == 0) { %>
        <div class="imui-operation-parts">
          <imui:button value="ダウンロード" class="imui-medium-button" onClick="form.submit()" />
          <input type="hidden" name="downloadFile" value="<%= outputFile.getPath() %>" />
        </div>
      <% } %>
    </form>
</div>

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

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

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

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

注意

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

5.1.3.1. ページ機能(Page)

sample-pdfc-javaee-combine.xml

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

	<servlet-mapping servlet="WEB-INF/view/pdfc/combine.jsp" path="pdfc/javaee/combine">
		<authz uri="service://pdfc/javaee/combine" action="execute" />
	</servlet-mapping>
	<servlet-mapping servlet="WEB-INF/view/pdfc/combine_act.jsp" path="pdfc/javaee/combine_act">
		<authz uri="service://pdfc/javaee/combine" action="execute" />
	</servlet-mapping>

</routing-servlet-config>

5.1.3.2. マージ機能(Merge)

sample-pdfc-javaee-merge.xml

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

	<servlet-mapping servlet="WEB-INF/view/pdfc/merge.jsp" path="pdfc/javaee/merge">
		<authz uri="service://pdfc/javaee/merge" action="execute" />
	</servlet-mapping>
	<servlet-mapping servlet="WEB-INF/view/pdfc/merge_act.jsp" path="pdfc/javaee/merge_act">
		<authz uri="service://pdfc/javaee/merge" action="execute" />
	</servlet-mapping>

</routing-servlet-config>

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

sample-pdfc-javaee-edit.xml

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

	<servlet-mapping servlet="WEB-INF/view/pdfc/edit.jsp" path="pdfc/javaee/edit">
		<authz uri="service://pdfc/javaee/edit" action="execute" />
	</servlet-mapping>
	<servlet-mapping servlet="WEB-INF/view/pdfc/edit_act.jsp" path="pdfc/javaee/edit_act">
		<authz uri="service://pdfc/javaee/edit" action="execute" />
	</servlet-mapping>

</routing-servlet-config>

5.1.4. プログラムの登録

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

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

5.1.4.1. 認可設定

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

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

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

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

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

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

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

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

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

    ../../_images/javaEE_7.png

5.1.4.2. メニュー設定

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

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

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

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

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

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

    ../../_images/javaEE_10.png

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

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

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

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

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

5.1.6. サンプルプログラムの場所

機能毎のサンプルプログラムを< %PDFMAKEUP%/sample/java >に用意しています。

使用用途に対応するフォルダの例は、次の通りです。

  • < %PDFMAKEUP%/sample/java >直下のフォルダ群

    No. 用途 サンプルフォルダ
    1 パスワード付与 /samplesetproperty
    2 パスワード解除 /samplesetproperty
    3 PDFファイルの 重ね合わせ /samplemerge
    4 PDFファイルに 透かしの挿入 /sampletrans
    5 用紙サイズの変更 /sampleedit
    6 PDFファイルの 結合 /samplecomb
    7 PDFファイルの 抽出・分割 /sampleextractpage、/samplediv
    8 PDFファイルの 回転 /samplediv
    9 PDFファイルへの 印影付与 /sampleiod、/sampletrans、/sample1
    10 PDFファイルへの 文字・画像追記 /sampletrans、/sample1
    11 PDFファイルへの しおり・リンク付与 /sampleol、/sample1
    12 PDFファイルへの フォーム・注釈追加 /sampleform、/samplenote
    13 PDFファイルへの JavaScriptの挿入 /sample1

コラム

機能に合わせて< %PDFMAKEUP%/sample/data >にサンプルデータを用意しています。

サンプルプログラムを実行する際に使用してください。