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. 認可設定¶
テナント管理者でログインし、次のメニューを設定します。
[テナント管理]-[認可]画面を開きます。
[権限設定を開始する]ボタンを押下します。
[リソース]を選択し、[リソースの詳細を開く]押下します。
[配下にリソースを新規作成]を押下します。
リソースグループを作成します。
リソースグループ名に、次の値を設定します。
機能 リソースグループ名 ページ機能(Page) Script_PDF結合サンプル マージ機能(Merge) Script_PDFマージサンプル エディット機能(Edit) Script_PDF追記サンプル リソースURIに、次の値を設定します。
機能 リソースURI ページ機能(Page) service://pdfc/script/combine マージ機能(Merge) service://pdfc/script/merge エディット機能(Edit) service://pdfc/script/edit 作成したリソースグループで「認証済みユーザ」に「全て許可」を付与します。
5.2.5. プログラムの実行と確認¶
メニューで次のアイテムを選択することにより、作成した画面が表示されます。
機能 | メニューアイテム名 |
---|---|
ページ機能(Page) | Script_combine |
マージ機能(Merge) | Script_merge |
エディット機能(Edit) | Script_edit |
画面上で処理対象ファイルをアップロードすることで、編集/加工処理のプログラムが実行され、処理されたPDFファイルがダウンロードされます。
PDFビューア( Adobe Acrobat Reader など)で処理後のファイルが正しく表示されることを確認し、このチュートリアルは完了です。