You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写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. 参数设置对话框:提供页码范围输入和三种缩放方式的选择,输入框会随选中的缩放类型自动启用/禁用
  2. 页码解析:支持单页码、连续页码范围(如1-10)和离散页码(如1,3,5)的混合输入
  3. 缩放逻辑:
    • 百分比缩放:按输入百分比等比例缩放图片和框架
    • 英寸尺寸:按输入的宽高尺寸,取最小比例避免图片变形
    • 单值自动适配:按输入的长边尺寸自动计算缩放比例,保证图片最长边不超过指定值
  4. 旋转与居中:缩放完成后将图片逆时针旋转90°,然后将图片框架相对于页面边距进行水平和垂直居中

使用注意事项

  • 确保InDesign中已打开目标文档
  • 脚本会处理指定页码内所有图片框架(Rectangle类型且包含图形的页面项)
  • 建议先在小范围页码测试脚本效果,再批量处理全文档

内容的提问来源于stack exchange,提问作者TechMonkeyKS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:07:51