/** * @fileoverview エラーレポートファイルまたはフォルダを指定して画像ファイルを並べた1枚のファイルを作成する。望むならPDFとして保存できる * @author Kenshi Muto <kmuto@debian.org> */ /* Copyright: 2008-2009 Kenshi Muto ---------------------------------------------------------------------- ソフトウェア使用許諾同意書 本ソフトウェアの利用・変更・再配布にあたっては、下記の使用許諾同意書に 同意する必要があります。 1. 本使用許諾同意書における「ソフトウェア」とは、機械可読の資料 (ライブ ラリ、スクリプト、ソースファイル、データファイル)、実行形式、および 文書を意味します。 2. 本ソフトウェアの使用許諾同意書に同意する限りにおいて、使用者は 本ソフトウェアを自由に利用、変更することができます。 3. 本ソフトウェアに変更を加えない限りにおいて、使用者は本ソフトウェアを 自由にコピー、再配布することができます。 4. 本ソフトウェアは無保証です。作者およびそれに関連する組織、配布者は、 本ソフトウェアの使用に起因する一切の直接損害、間接損害、偶発的損害、 特別損害、懲戒的損害、派生的損害について何らの責任・保証も負いません。 5. 本ソフトウェアを変更した上で再配布するときには、下記の事項すべてに 従わなければなりません。 - 使用許諾同意書の内容に変更を加えてはなりません。技術上の理由で 文字エンコーディングの変換を行うことは許可しますが、その使用者が 特殊な技術的措置なしに可読な形でなければなりません。 - 技術上の理由でバイナリ化・難読化を行う場合も、変更箇所を含めた ソフトウェアを、その使用者が可読可能な形式の形で同一のメディアで 提供しなければなりません。本使用許諾同意書の2条および3条により、 使用者が可読形式の該当ソフトウェアを変更、コピー、再配布することを 妨げてはなりません。 - ソフトウェア構成物の所定の作者名の欄に、変更者のクレジット (個人名、企業名、所属、連絡先など)を「追加」しなければなりません。 6. 本ソフトウェアを変更した上で再配布するときには、変更理由および その内容を明記することが推奨されます。 7. 使用者がソフトウェアに適用可能な特許に対して特許侵害にかかわる何らか の行動を開始した時点で、この使用許諾同意書は自動的に終了し、以降 使用者はこの使用許諾書によって与えられた一切の権利を放棄するものと します。 著作権所有者 Copyright (C) 2008-2009 Kenshi Muto. All rights reserved. 使用許諾同意書バージョン1.0 著作権所有者による書面での事前の許可がない限り、この使用許諾同意書 に変更を加えてはなりません。 ---------------------------------------------------------------------- */ // A4 var pagewidth = 210; var pageheight = 297; // font size of filenames var printpoint = 9; var prefixpath = ""; var files = []; var filenames = []; app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS; // foolproof // dialogs var dialog = new Window('dialog', '画像配置検証', [100, 100, 600, 300]); var grpObj = dialog.add("group", [20, 20, 580, 120]); grpObj.reportCheckbox = grpObj.add("radiobutton", [0, 0, 0+200, 0+20], "レポートファイルから生成"); grpObj.dirCheckbox = grpObj.add("radiobutton", [0, 50, 0+200, 50+25], "フォルダ内の画像群から生成"); grpObj.reportCheckbox.value = true; dialog.reportlabel = dialog.add("statictext", [100, 45, 80+400, 45+25], "レポートファイルを選択"); dialog.reportButton = dialog.add("button", [20, 45, 20+50, 45+25], "参照"); dialog.dirlabel = dialog.add("statictext", [100, 100, 80+400, 100+25], "フォルダを選択"); dialog.dirButton = dialog.add("button", [20, 100, 20+50, 100+25], "参照"); dialog.dirlabel.enabled = false; dialog.dirButton.enabled = false; dialog.pdfCheckbox = dialog.add("checkbox", [20, 130, 20+80, 130+25], "PDFで保存"); dialog.filenameCheckbox = dialog.add("checkbox", [100, 130, 100+100, 130+25], "ファイル名表示"); dialog.filenameCheckbox.value = true; dialog.sizelabel = dialog.add("statictext", [260, 130, 260+50, 130+25], "紙面 幅"); dialog.xsizeEdit = dialog.add("edittext", [310, 130, 310+40, 130+25], pagewidth); dialog.size2label = dialog.add("statictext", [360, 130, 360+30, 130+25], "x高さ"); dialog.ysizeEdit = dialog.add("edittext", [400, 130, 400+40, 130+25], pageheight); dialog.size3label = dialog.add("statictext", [450, 130, 450+30, 130+25], "(mm)"); dialog.okButton = dialog.add("button", [180, 160, 180+50, 160+25], "開始", { name: "ok" }); dialog.cancelButton = dialog.add("button", [260, 160, 260+50, 160+25], "閉じる", { name: "cancel" }); grpObj.reportCheckbox.onClick = function() { if (grpObj.reportCheckbox.value == true) { dialog.dirlabel.enabled = false; dialog.dirButton.enabled = false; dialog.reportlabel.enabled = true; dialog.reportButton.enabled = true; } } grpObj.dirCheckbox.onClick = function() { if (grpObj.dirCheckbox.value == true) { dialog.dirlabel.enabled = true; dialog.dirButton.enabled = true; dialog.reportlabel.enabled = false; dialog.reportButton.enabled = false; } } dialog.reportButton.onClick = function() { listfile = File.openDialog("レポートファイルを選択"); if (listfile != null) { dialog.reportlabel.text = listfile.fullName; } else { dialog.reportlabel.text = "レポートファイルを選択"; } } dialog.dirButton.onClick = function() { listfile = Folder.selectDialog("フォルダを選択"); if (listfile != null) { dialog.dirlabel.text = listfile.fullName; } else { dialog.dirlabel.text = "フォルダを選択"; } } dialog.cancelButton.onClick = function() { dialog.close(); } dialog.okButton.onClick = function() { if ((grpObj.reportCheckbox.value == true && dialog.reportlabel.text == "レポートファイルを選択") || (grpObj.dirCheckbox.value == true && dialog.dirlabel.text == "フォルダを選択")) { alert("ファイルまたはフォルダが選択されていません"); } else { if(grpObj.reportCheckbox.value == true) { loadFromReport(dialog.reportlabel.text); } else { loadFromDir(dialog.dirlabel.text); } var myDocument = createPage(); if (dialog.pdfCheckbox.value == true) { var filename = File.saveDialog("保存するPDFファイル"); if (filename) { var fileObj = new File(filename); myDocument.saveAs(fileObj, new PDFSaveOptions()); myDocument.close(); } } dialog.close(); } } dialog.show(); /** * mmからポイントに変換する * @param {Number} mm ミリメートル * @type Number * @return ポイント値 */ function mmtopt(pt) { return pt / 0.351; } /** * filesとfilenames配列にある画像を並べたページを作成する * @type Nothing */ function createPage() { var pagewidth = mmtopt(dialog.xsizeEdit.text); var pageheight = mmtopt(dialog.ysizeEdit.text); var xmax = Math.ceil(Math.sqrt(files.length)); // try to place like square var ymax = Math.ceil(files.length / xmax); var dx = pagewidth / xmax; var dy = pageheight / ymax; var myDocument = app.documents.add(DocumentColorSpace.CMYK, pagewidth, pageheight); var regcol = new CMYKColor(); // registration color regcol.cyan = 100; regcol.magenta = 100; regcol.yellow = 100; regcol.black = 100; var xcount = 0; var ycount = 0; for (var i = 0; i < files.length; i++) { var fObj = new File(files[i]); var item = myDocument.placedItems.add(); item.file = fObj; item.position = [xcount * dx, pageheight - ycount *dy]; // resizing if (item.width > dx) { var n = item.width; item.width = dx; item.height = item.height * dx / n; } if (item.height > dy) { var n = item.height; item.height = dy; item.width = item.width * dy / n; } if (dialog.filenameCheckbox.value == true) { var t = myDocument.textFrames.add(); t.contents = filenames[i]; t.paragraphs[0].characterAttributes.fillColor = regcol; t.paragraphs[0].size = printpoint; t.position = [xcount * dx, pageheight - (ycount + 1) * dy + t.height]; } xcount++; if (xcount == xmax) { xcount = 0; ycount++; } } return myDocument; } /** * レポートファイルからファイルを読み取り、filesとfilenamesを構成する * @param {String} listfile レポートファイル * @return Nothing */ function loadFromReport(listfile) { var listObj = new File(listfile); listObj.open("r"); while (!listObj.eof) { var l = listObj.readln(); if (l.search(/Target folder:/) >= 0) { prefixpath = l.match(/Target folder: (.*)/)[1]; } if (l.search(/\[ERR\] /) >= 0) { filename = l.match(/\[ERR\] (.+?):/)[1]; filenames.push(filename); files.push(prefixpath + "/" + filename); } } listObj.close(); } /** * フォルダからファイルを読み取り、filesとfilenamesを構成する * @param {String} dirname フォルダ名 * @return Nothing */ function loadFromDir(dirname) { prefixpath = dirname; findImages(dirname); } /** * loadFromDirの実体。再帰でフォルダからai、eps、psdのファイルを読み取り、filesとfilenamesを構成する * @param {String} dirname フォルダ名 * @return Nothing */ function findImages(dirname) { var list = Folder(dirname).getFiles(); for (var i = 0; i < list.length; i++) { if (list[i] instanceof Folder) findImages(list[i].fullName); if (list[i] instanceof File && list[i].name.match(/\.(ai|eps|psd)$/i)) { filenames.push(list[i].displayName); files.push(list[i].fullName); } } }