如何通过脚本在InDesign中替换给定文件的图形?

时间:2015-08-11 11:32:22

标签: javascript adobe-indesign indesign-server

我需要用给定文件替换InDesign文档中的一些图像。使用InDesign服务器会发生这种情况,但脚本与常规InDesign几乎相同,但不能进行用户交互。

我所拥有的是InDesign文档,包含一些图像的矩形的ID以及应该替换图像的新图像的路径。

应替换图像,但FitOptions等设置应保持不变。此外,新文件应嵌入InDesign文档中。已经有一些代码可以运行了:

function changeImages(doc) {
    var arrayLength = changeImage.length;
    for (var i = 0; i < arrayLength; i++) {
        var fr = doc.textFrames.itemByID(1 * changeImage[i].id);
        if (!fr)
            continue;
        var file = File(imagePath + changeImage[i].file);
        fr.place(file);
        fr.fit (FitOptions.CONTENT_TO_FRAME);
        fr.fit (FitOptions.PROPORTIONALLY);
        fr.fit (FitOptions.CENTER_CONTENT);

    }
}

这似乎不对。当对象是矩形时,为什么使用doc.textFrames?我实际上很困惑甚至可以工作。

它也只是设置了一些FitOptions,但我想保留现有的。

我是InDesign脚本的新手,所以我迷失在这里。我正在阅读docsother resources,但我很困惑。例如为什么doc.textFrames.itemByID但是其他框架没有这样的东西?我是否必须迭代doc.allPageItems并比较ID?

2 个答案:

答案 0 :(得分:2)

itemByID是一种适用于所有pageItems的方法,textFramesrectangles都是pageItem的子类。因此,您可以从两者中访问此方法,并且它会给出相同的结果。您也应该能够使用doc.rectangles.itemByID。请参阅:http://www.indesignjs.de/extendscriptAPI/indesign11/#Rectangles.html#d1e201999__d1e202138

但你说得对,描述有点令人困惑,它说:

  

返回具有指定ID的TextFrame。

显然不是这样。如果您已经拥有要定位的ID,则可以使用doc.pageItems.itemByID,这可能不那么令人困惑,因为在使用itemByID时基本上您正在寻找pageItems

对于fitting options,它们是矩形对象的属性,因此放置新图像不应该更改拟合选项。如果您想保持不变,只需删除对fit()的调用即可。请参阅RectangleframeFittingOptionshttp://www.indesignjs.de/extendscriptAPI/indesign11/#Rectangle.html

的属性列表

答案 1 :(得分:1)

约瑟夫,

我在使用InDesign CS4时遇到了与原始FitOptions相同的问题。我无法弄清楚如何获取当前在InDesign CS4中使用的设置。

要解决此问题,我所做的是在InDesign文档的框架适合选项中设置在空框架中拟合中的值。

enter image description here

然后在代码中我使用了这个设置,如下所示:

changeImages (app.activeDocument);
function changeImages(doc)
{
    with(doc)
    {
        var rec = doc.rectangles.itemByID(207);
        var file = new File("c:\\new_image.png");
        rec.place(file);
        rec.fit(rec.frameFittingOptions.fittingOnEmptyFrame);
    }
}