请求编写InDesign脚本:批量调整指定页面图片属性
InDesign JS脚本:批量处理指定页码范围内的图片
需求概述
需对250-300页文档中约半数页面的图片执行以下操作:
- 选择指定页码范围
- 按比例缩放图片(支持百分比、英寸尺寸或单值自动适配),同步调整图片框架
- 将图片逆时针旋转90°
- 使图片相对于页边距垂直、水平居中
完整实现脚本
#target indesign // 弹出参数设置对话框 var dialog = new Window("dialog", "图片批量处理设置"); dialog.alignChildren = "fill"; // 页码范围设置 var pageGroup = dialog.add("group"); pageGroup.add("statictext", undefined, "页码范围(如1-10,15):"); var pageRangeInput = pageGroup.add("edittext", undefined, "1-300"); pageRangeInput.preferredSize.width = 150; // 缩放方式选择 var scaleGroup = dialog.add("group"); var scaleRadioGroup = scaleGroup.add("radiogroup"); var percentRadio = scaleRadioGroup.add("radiobutton", undefined, "百分比缩放"); var inchRadio = scaleRadioGroup.add("radiobutton", undefined, "英寸尺寸(宽x高)"); var autoRadio = scaleRadioGroup.add("radiobutton", undefined, "单值自动适配(按长边)"); percentRadio.value = true; // 缩放参数输入 var paramGroup = dialog.add("group"); var percentInput = paramGroup.add("edittext", undefined, "80"); percentInput.preferredSize.width = 80; percentInput.add("statictext", undefined, "%"); var inchInput = paramGroup.add("edittext", undefined, "6x9"); inchInput.preferredSize.width = 80; inchInput.enabled = false; var autoInput = paramGroup.add("edittext", undefined, "8"); autoInput.preferredSize.width = 80; autoInput.add("statictext", undefined, "英寸"); autoInput.enabled = false; // 单选框切换事件 percentRadio.onClick = function() { percentInput.enabled = true; inchInput.enabled = false; autoInput.enabled = false; }; inchRadio.onClick = function() { percentInput.enabled = false; inchInput.enabled = true; autoInput.enabled = false; }; autoRadio.onClick = function() { percentInput.enabled = false; inchInput.enabled = false; autoInput.enabled = true; }; // 对话框按钮 var btnGroup = dialog.add("group"); btnGroup.alignment = "center"; var okBtn = btnGroup.add("button", undefined, "确定"); var cancelBtn = btnGroup.add("button", undefined, "取消"); // 解析页码范围 function parsePageRange(rangeStr) { var pages = []; var parts = rangeStr.split(","); for (var i = 0; i < parts.length; i++) { var part = parts[i].trim(); if (part.indexOf("-") !== -1) { var range = part.split("-"); var start = parseInt(range[0]); var end = parseInt(range[1]); for (var j = start; j <= end; j++) { pages.push(j); } } else { pages.push(parseInt(part)); } } return pages; } // 处理单张图片 function processImage(frame, scaleParams, scaleType) { if (frame instanceof Rectangle && frame.graphics.length > 0) { var graphic = frame.graphics[0]; var originalBounds = frame.geometricBounds; var originalWidth = originalBounds[3] - originalBounds[1]; var originalHeight = originalBounds[2] - originalBounds[0]; var scaleX, scaleY; // 根据缩放类型计算比例 switch(scaleType) { case "percent": var percent = parseFloat(scaleParams) / 100; scaleX = scaleY = percent; break; case "inch": var dims = scaleParams.split("x"); var targetWidth = parseFloat(dims[0]) * 72; // 转成点(1英寸=72点) var targetHeight = parseFloat(dims[1]) * 72; scaleX = targetWidth / originalWidth; scaleY = targetHeight / originalHeight; // 按比例取最小缩放值,避免变形 scaleX = scaleY = Math.min(scaleX, scaleY); break; case "auto": var targetLongSide = parseFloat(scaleParams) * 72; var originalLongSide = Math.max(originalWidth, originalHeight); scaleX = scaleY = targetLongSide / originalLongSide; break; } // 缩放图片和框架 frame.resize(CoordinateSpaces.INNER_COORDINATES, AnchorPoint.CENTER_ANCHOR, scaleX, scaleY); graphic.transform(CoordinateSpaces.INNER_COORDINATES, AnchorPoint.CENTER_ANCHOR, Matrix(1,0,0,1,0,0).rotate(-90)); // 逆时针转90度 // 获取页边距参考 var page = frame.parentPage; var marginBounds = page.marginPreferences.properties; var marginLeft = marginBounds.left; var marginRight = page.bounds[3] - marginBounds.right; var marginTop = marginBounds.top; var marginBottom = page.bounds[2] - marginBounds.bottom; // 居中图片框架 var newWidth = frame.geometricBounds[3] - frame.geometricBounds[1]; var newHeight = frame.geometricBounds[2] - frame.geometricBounds[0]; var centerX = marginLeft + (marginRight - marginLeft - newWidth)/2; var centerY = marginTop + (marginBottom - marginTop - newHeight)/2; frame.move(CoordinateSpaces.PAGE_COORDINATES, AnchorPoint.TOP_LEFT_ANCHOR, [centerX, centerY]); } } // 执行主逻辑 okBtn.onClick = function() { if (app.documents.length === 0) { alert("请先打开一个InDesign文档!"); return; } var doc = app.activeDocument; var pageNumbers = parsePageRange(pageRangeInput.text); var scaleType, scaleParams; if (percentRadio.value) { scaleType = "percent"; scaleParams = percentInput.text; if (isNaN(parseFloat(scaleParams))) { alert("请输入有效的百分比数值!"); return; } } else if (inchRadio.value) { scaleType = "inch"; scaleParams = inchInput.text; var dims = scaleParams.split("x"); if (dims.length !== 2 || isNaN(parseFloat(dims[0])) || isNaN(parseFloat(dims[1]))) { alert("请输入有效的英寸尺寸格式(如6x9)!"); return; } } else if (autoRadio.value) { scaleType = "auto"; scaleParams = autoInput.text; if (isNaN(parseFloat(scaleParams))) { alert("请输入有效的单值尺寸数值!"); return; } } // 遍历指定页码处理图片 for (var i = 0; i < pageNumbers.length; i++) { var pageNum = pageNumbers[i]; if (pageNum < 1 || pageNum > doc.pages.length) continue; var page = doc.pages[pageNum - 1]; var pageItems = page.pageItems; for (var j = 0; j < pageItems.length; j++) { var item = pageItems[j]; processImage(item, scaleParams, scaleType); } } alert("图片处理完成!"); dialog.close(); }; cancelBtn.onClick = function() { dialog.close(); }; dialog.show();
脚本说明
- 参数设置对话框:提供页码范围输入和三种缩放方式的选择,输入框会随选中的缩放类型自动启用/禁用
- 页码解析:支持单页码、连续页码范围(如1-10)和离散页码(如1,3,5)的混合输入
- 缩放逻辑:
- 百分比缩放:按输入百分比等比例缩放图片和框架
- 英寸尺寸:按输入的宽高尺寸,取最小比例避免图片变形
- 单值自动适配:按输入的长边尺寸自动计算缩放比例,保证图片最长边不超过指定值
- 旋转与居中:缩放完成后将图片逆时针旋转90°,然后将图片框架相对于页面边距进行水平和垂直居中
使用注意事项
- 确保InDesign中已打开目标文档
- 脚本会处理指定页码内所有图片框架(Rectangle类型且包含图形的页面项)
- 建议先在小范围页码测试脚本效果,再批量处理全文档
内容的提问来源于stack exchange,提问作者TechMonkeyKS
相关产品推荐
相关产品推荐

