【问题标题】:InDesign - Add column numbers and row letters text under an set of imagesInDesign - 在一组图像下添加列号和行字母文本
【发布时间】:2022-06-14 15:02:57
【问题描述】:

我被脚本卡住了,无法在线找到解决方案,希望有人能帮助我。
在我工作的地方,我们在瓷砖上打印。其中一项主要工作是将大图像分割成几个正方形,然后将它们打印在如下图块上:

然后,瓷砖工将通过连接瓷砖来安装瓷砖以形成图像。为此,他必须对如何放置瓷砖有一些指示。
我们通常使用类似于战舰游戏中的网格,一侧是字母,另一侧是数字,就像您在图像中看到的红色那样(例如 A1、A2...)。
它们不会在图像内,仅供参考。
我已经编写了一个脚本来在 InDesign 文档的每页放置一个方形图像,现在我正在寻找的是在图像下插入一些文本,它标记了它是哪个图块(例如 A1、C5 ...)。 有一种方法可以手动为水平图块的数量选择自定义数字(例如 4),以便脚本将文本 A1 插入到 A4,然后开始将字母 B 一直插入到 B4,然后是 C、D 等. 等直到平铺图像用完?
到目前为止,这是我的脚本:

    var Pagewidth =app.activeDocument.documentPreferences.pageWidth;
    var Pageheight = app.activeDocument.documentPreferences.pageHeight;
    var Imagefolder = Folder.selectDialog("Select a folder");
    var Images = Imagefolder.getFiles(/.+\.(?:gif|jpe?g|eps|tiff?|psd|pdf|bmp|png)$/i);
    for(var i =0; i < Images.length; i++) {
        var Placed = app.activeDocument.pages.item(-1).place(Images[i]);
        app.activeDocument.align(Placed[0], AlignOptions.VERTICAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
        app.activeDocument.align(Placed[0], AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
        Placed[0].parent.fit(FitOptions.FRAME_TO_CONTENT);
        app.activeDocument.pages.add(LocationOptions.AT_END);
        }
    app.activeDocument.pages.item(-1).remove();

编辑

以防万一我会尝试更清楚,我正在寻找的是在每个页面的图像下添加一些文本,如下所示:

我已经知道如何为每个图像添加文本框并将其放在它们下方。
不明白的是如何添加这种textframe内容。


更新

感谢 Yuri 提供的代码,我根据自己的目的对其进行了调整。
这是最终代码:

    var Pagewidth =app.activeDocument.documentPreferences.pageWidth;
    var Pageheight = app.activeDocument.documentPreferences.pageHeight;
    var Columns = prompt("Type the number of columns","");
    if(!Columns){
        exit();
        }
    if(!Number(Columns)){
        alert("You can only type numbers");
        exit();
        }
    var Imagefolder = Folder.selectDialog("Select a folder");
    if(!Imagefolder){
        exit();
        }
    var Images = Imagefolder.getFiles(/.+\.(?:gif|jpe?g|eps|tiff?|psd|pdf|bmp|png)$/i);
    for(var i =0; i < Images.length; i++){
        var Placed = app.activeDocument.pages.item(-1).place(Images[i]);
        app.activeDocument.align(Placed[0], AlignOptions.VERTICAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
        app.activeDocument.align(Placed[0], AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
        Placed[0].parent.fit(FitOptions.FRAME_TO_CONTENT);
        app.activeDocument.pages.add(LocationOptions.AT_END);
        }
    app.activeDocument.pages.item(-1).remove();
    var Lettersnumber = 26;
    var Arr = [];
    var Letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    for(var j = 0; j < Lettersnumber; j++){
        for(var k = 1; k <= Columns; k++){
            Arr.push(Letters[j] + k);
            }
        }
    for(var l = 0; l < app.activeDocument.allGraphics.length; l++){
        if(app.activeDocument.allGraphics[l].parentPage != null){
            try{
                var Subtext = app.activeDocument.allGraphics[l].parentPage.textFrames.add();
                Subtext.textFramePreferences.verticalJustification = VerticalJustification.TOP_ALIGN;
                Subtext.contents = Arr[l];
                Subtext.paragraphs[0].appliedFont = app.fonts.item("Arial");
                Subtext.paragraphs[0].pointSize = "30";
                Subtext.paragraphs[0].justification = Justification.CENTER_ALIGN;
                var Margin = app.activeDocument.allGraphics[l].parent.visibleBounds;
                Subtext.visibleBounds = [Margin[2]+12, Margin[1], Margin[2]+4, Margin[3]];
                Subtext.fit(FitOptions.FRAME_TO_CONTENT);
                Subtext.fit(FitOptions.FRAME_TO_CONTENT);
                Subtext.move(undefined, ["0", "12"]);
                }
            catch(e){
                alert("The text is not enough for the number of images in the document");
                break;
                }
            }
        }

【问题讨论】:

    标签: javascript adobe-indesign extendscript


    【解决方案1】:

    这是询问列数和行数的代码,使标题为“A1”、“A2”、“A3”、“B1”、“B2”、“B3”...等,然后将文本放在页数:

    var doc = app.activeDocument;
    
    // ask the number of columns and rows
    var cols_rows = prompt('Columns Rows', '4 3');
    if (cols_rows == null) exit();
    cols_rows = cols_rows.match(/\d+/g);
    var cols = cols_rows[0];
    var rows = cols_rows[1];
    
    // make the captions A1, A2, A3, B1, B2, B3... etc
    var captions = [];
    var abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    for (var r=0; r<rows; r++) for (var c=1; c<=cols; c++) captions.push(abc[r] + c);
    
    // add pages if it's need
    while(doc.pages.length < captions.length) doc.pages.add();
    
    // set text frames with the captions on the pages
    for (var i=0; i<captions.length; i++) {
        var page = doc.pages[i];
        var caption = captions[i];
        var frame = page.textFrames.add();
        frame.geometricBounds = [0,0,20,20];
        frame.contents = caption;
        frame.paragraphs[0].justification = Justification.CENTER_ALIGN;
        frame.paragraphs[0].pointSize = 30;
        frame.move([0,200]);
        doc.align(frame, AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
    }
    

    4 列 3 行(A、B、C)网格的输入:

    结果:

    ...

    但如果您的行数超过 26 行,则需要决定如何标记“Z”之后的行。


    更新

    这是一个完整的实现,它获取选定的图片,询问列数、行数和间隙,对图片进行切片并将每个切片放在带有标题的页面上:

    var doc = app.activeDocument;
    if (app.selection.length == 0) { alert('Nothing selected'); exit() }
    var sel = app.selection[0];
    
    // ask the number of columns and rows
    var input = prompt('Columns, Rows, Gap', '4 3 2');
    if (input == null) exit();
    input = input.match(/\d+/g);
    var cols = +input[0];
    var rows = +input[1];
    var gap  = +input[2];
    
    // calculate tile width and height
    var sel_gb = sel.geometricBounds;
    var sel_w = sel_gb[3] - sel_gb[1];
    var sel_h = sel_gb[2] - sel_gb[0];
    var w = (sel_w - (cols-1) * gap) / cols; // tile width
    var h = (sel_h - (rows-1) * gap) / rows; // tile height
    
    // make the tiles
    var tiles = [];
    var gb = sel_gb.slice(0);
    gb[2] = gb[0] + h;
    gb[3] = gb[1] + w;
    
    for (var r=0; r<rows; r++) {
        for (var c=0; c<cols; c++) {
            var tile = sel.duplicate();
            tiles.push(tile);
            tile.geometricBounds = gb;
            gb[1] = gb[3] + +gap;
            gb[3] = gb[1] + w;
        }
        gb[1] = sel_gb[1];
        gb[3] = gb[1] + w;
        gb[0] = gb[2] + gap;
        gb[2] = gb[0] + h;
    }
    
    sel.remove();
    
    // make the captions A1, A2, A3, B1, B2, B3... etc
    var captions = [];
    var abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    for (var r=0; r<rows; r++) for (var c=1; c<=cols; c++) captions.push(abc[r] + c);
    
    // add pages if it's need
    while(doc.pages.length <= captions.length) doc.pages.add();
    
    // set text frames with the captions on the pages
    for (var i=0; i<captions.length; i++) {
        var page = doc.pages[i+1];
    
        // get a tile and copy the tile on the page
        var tile = tiles[i].duplicate(page);
        doc.align(tile, AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
        doc.align(tile, AlignOptions.VERTICAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
    
        // get a caption and put the caption on the page
        var caption = captions[i];
        var frame = page.textFrames.add();
        frame.geometricBounds = [0,0,20,20];
        frame.contents = caption;
        frame.paragraphs[0].justification = Justification.CENTER_ALIGN;
        frame.paragraphs[0].pointSize = 30;
        frame.move([0, tile.geometricBounds[2] + 20]);
        doc.align(frame, AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.PAGE_BOUNDS);
    }
    

    输入:

    输出:

    第一页的“A B C D ...”行和“1 2 3 4 ...”列也可以使用脚本添加。如果您需要,请告诉我。

    【讨论】:

    • 感谢您的帮助。我已经知道您可以在 InDesign 中分割图像,但不幸的是,我们的图形部门必须修改每个正方形以适合平铺形状,以便它没有令人不快的微小白色边缘。这只能在 Photoshop 中完成。
    • 只要我有时间,我也会考虑自动化这个过程。考虑到第一个代码,我认为我不需要超过 26 行,所以我想我会稍微调整一下代码。再次感谢。
    最近更新 更多