1.算法程序

illustrator是矢量编辑软件,画板是绘制处理的重要容器,在印刷方面的一个重要功能就是打开多页PDF,开发一个打开多页PDF功能,以下功能仅用于学习交流,请勿用于非法用途,源代码如下所示:

var w = new Window("dialog { text: 'PDF 打开选项', frameLocation:[400, 200], alignChildren:['fill', 'top'], filePnl: Panel { text: 'PDF 文件', orientation:'row', alignChildren:['left', 'center'], loadBtn: Button { text:'. . .', helpTip :'浏览 PDF 文件, 或将文件路径粘帖至右边文本框'}, et: EditText { text:'' , preferredSize: [220, 20]}, }, rangePnl: Panel { text: '页面', orientation:'column', alignChildren:['fill', 'top'], range: Group {allRb: RadioButton { text:'全部页面', value:true, helpTip: '部分 PDF 文件可能无法正确获取页数\n遇此请自行输入“ 1-总页数”'}, rangeRb: RadioButton { text:'范围:', helpTip: '正确: 1-5 或 1, 2, 3 或 1, 2-4, 5, 7-8\n允许空格, 逗号须为半角'} et: EditText { text: '', characters:25, properties:{multiline:true} }}, caGrp: Group{artboardsCb: Checkbox { text:'创建画板', preferredSize: [84, 20], helpTip: '仅适用于CS4/CS5'}, st: StaticText { text: '间距:' }, et: EditText { text:'20', characters:3}, st2: StaticText { text:'pt' }}, }, dividerLine: Panel { preferredSize: [280, 1], margins:0, }, btn: Group { orientation:'row', alignChildren:['right', 'center'], cancelBtn: Button { text:'取消', properties:{name:'cancel'}}, buildBtn: Button { text:'打开', properties:{name:'ok'} }}}"); w.rangePnl.caGrp.artboardsCb.enabled = w.rangePnl.caGrp.artboardsCb.value = app.version.split(".")[0] > 13; w.filePnl.loadBtn.onClick = function() { var pdfile = File.openDialog("选择PDF文件", "*.pdf"); pdfile && w.filePnl.et.text = pdfile.fsName; }; w.rangePnl.range.et.onChange = function() { this.parent.rangeRb.value = true; }; w.btn.buildBtn.onClick = function go() { var start = new Date().getTime(); var pdfile = w.filePnl.et.text; var allPage = w.rangePnl.range.allRb.value; var pageRange = w.rangePnl.range.et.text; var createAbs = w.rangePnl.caGrp.artboardsCb.value; var gap = w.rangePnl.caGrp.et.text; var psArr = []; var maxArr = null; var pageArr = null; var pdfOptions = app.preferences.PDFFileOptions; var oldInteractionPref = app.userInteractionLevel; w.close(0); app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS; pdfOptions.pageToOpen = 1; app.open(new File(pdfile)); width = activeDocument.width; height = activeDocument.height; activeDocument.close(SaveOptions.DONOTSAVECHANGES); if (allPage) { pageCount = getPDFPageCount(new File(pdfile)); if (!pageCount) { return; } mainloop(pageCount, 0, pageCount); } else { maxArr = function() { for (var i = 0, var a = []; ++i < 101; a.push(i)) { } return a; }(); pageArr = pageRange.replace(/s/g, "").replace(/(d+)-(d+)/g, function($1, $2, $3) { return maxArr.slice($2 - 1, $3); }).split(","); mainloop(pageArr.length - 1, -1, pageArr.length); } if (createAbs) { var layers = activeDocument.layers; layers[layers.length - 1].remove(); psArr = psArr.reverse(); for (var k = layers.length - 1; k >= 0; k--) { if (layers[k].groupItems.length > 0) { layers[k].visible = true; var myGroup = layers[k].groupItems[0]; myGroup.top = (activeDocument.artboards[k].artboardRect[1] + psArr[k][0]) - height; myGroup.left = activeDocument.artboards[k].artboardRect[0] + psArr[k][1]; layers[k].visible = false; } } } finish = new Date().getTime(); totalSeconds = (finish - start) / 1000; minutes = Math.floor(totalSeconds / 60); seconds = totalSeconds % 60; alert("操作已完成,图层为隐藏状态,按住Alt单击眼睛图标以显示n打开 " + activeDocument.layers.length + " 页, 用时 " + minutes + " 分, " + Math.round(seconds) + " 秒."); app.userInteractionLevel = oldInteractionPref; function mainloop(start, end, pages) { if (createAbs) { targetDoc = app.documents.add(DocumentColorSpace.CMYK, width, height, pages, DocumentArtboardLayout.GridByRow, gap, Math.round(Math.sqrt(pages))) } else { targetDoc = app.documents.add(DocumentColorSpace.CMYK, width, height) } for (var i = start; i > end; i--) { p = pageArr ? pageArr[i] : i; pdfOptions.pageToOpen = p; sourceDoc = app.open(new File(pdfile)); targetLayer = targetDoc.layers.add(); targetLayer.name = "Page " + p; main(sourceDoc, targetLayer, psArr); } } }; w.btn.cancelBtn.onClick = function() { w.close(0); }; w.show(); function main(sourceDoc, targetLayer, psArr) { if (!sourceDoc.pageItems.length) { sourceDoc.close(SaveOptions.DONOTSAVECHANGES); psArr.push(null); return; } sourceDoc.pageItems[0].selected = true; if (!sourceDoc.pageItems[sourceDoc.pageItems.length - 1].selected) { groupAll(sourceDoc); } psArr.push([sourceDoc.groupItems[0].top, sourceDoc.groupItems[0].left]); sourceDoc.groupItems[0].duplicate().moveToEnd(targetLayer); targetLayer.visible = false; sourceDoc.close(SaveOptions.DONOTSAVECHANGES); } function groupAll(doc) { var group = doc.layers.add().groupItems.add(); var layer = doc.layers[1]; for (a = layer.pageItems.length; a-- > 0; layer.pageItems[a].move(group, ElementPlacement.PLACEATBEGINNING)) { } } function getPDFPageCount(f) { var gotCount = false; if (BridgeTalk.isInstalled("bridge") && BridgeTalk.isRunning("bridge")) { return getPDFCount_Br(f); } f.open("r"); while (!gotCount) { next_line = f.readln(); if (f.eof) { alert("抱歉,未能获取总页数"); f.close(); return 0; } if (next_line.indexOf("/N ") > 0) { p = next_line.match(//N (d+)/T/)[1]; gotCount = true; } else { if (next_line.indexOf("/Pages>>") > 0) { p = next_line.match(//Count (d+)/K/)[1]; gotCount = true; } } } f.close(); return Number(p); } function getPDFCount_Br(file) { var f = new File(file); var bt = new BridgeTalk(); bt.target = "bridge"; bt.body = "function a(){app.document.setPresentationMode("browser","" + f.path + "");tn = new Thumbnail( File("" + f + "") ); return tn.core.itemContent.pageCount}a();"; bt.onResult = function(inBT) { data = eval(inBT.body); }; bt.onError = function(inBT) { data = ""; }; bt.send(); bt.pump(); $.sleep(100); timeOutAt = new Date().getTime() + 5000; currentTime = new Date().getTime(); while (currentTime < timeOutAt && undefined == data) { bt.pump(); $.sleep(100); currentTime = new Date().getTime(); } undefined == data && data = 0; return data; }

2.作者答疑


如有疑问,请留言。

提示: 作者知了-联系方式1
提示: 作者知了-联系方式2