如何以编程方式将嵌入式图形添加到 InDesign 中的表格单元格中



我在 InDesign 文档中有一个表格。我将在第一个单元格中添加一个内联图像。

var myPics = File("/c/test.png"),
myDoc = app.activeDocument,
myPage = myDoc.pages[0],
myTable = myDoc.stories.everyItem().tables[0],
myCell = myTable.cells[0];
myCell.contents = myPics;

我希望应该有一个图像放入单元格中,但文件地址被填充。我该怎么办?

> InDesign 中文本对象的contents并不完全等同于实际格式化的本机 InDesign 文本;它们始终在简单的 Javascript 文本字符串之间转换。读取contents会丢弃 InDesign 的所有文本属性(例如,文本格式、超链接、书签、XML 标记和所有图元对象,例如图像(;书写contents用纯文本填充目标,在放置文本的位置使用文本容器的默认格式进行格式化。

你不能将PNG文件"存储在"Javascript变量中;不能作为File对象(它不会被解析为实际文件的内容(,也不能作为"图像"(内容将被视为文本字符串,而不是"意义"任何东西(。

正确的方法是使用 place ,它可以将整个 InDesign 文档作为一个整体处理,在这种情况下,文件将直接"在"页面上导入,或通过有效属性(如其insertionPoints(使用文本位置

var myPics = File("/c/test.png"),
myDoc = app.activeDocument,
myPage = myDoc.pages[0],
myTable = myDoc.stories.everyItem().tables[0],
myCell = myTable.cells[0];
myCell.insertionPoints[0].place(myPics);

如果要在放置之前确保myCell的内容为空,可以添加

if (myCell.texts[0].length > 0)
    myCell.texts[0].remove();

关于您使用everyItem()的警告 :以这种方式使用时,它是一个实时集合。集合的行为类似于数组,只是集合的每个元素都被"视为"唯一的对象。因此,您可以执行以下操作

myTable.cells.everyItem().contents = "hello!";

由于 everyItem() 命令,文本将出现在每个单元格中。但是,由于您已经创建了一个表集合(myDoc.stories.everyItem().tables[0]将是当前文档的所有故事中"第一个"表的列表(,因此您会惊讶地发现,所有这些也会突然包含hello

如果您将当前文本框架的副本放在同一页面上并再次运行我的脚本版本,则可以看到这一点。您会发现它在两个表中插入了相同的图像!

大概您只想在第一个表格中、在第一个故事中、在第一页上插入一次图像。那将是

myTable = myPage.stories[0].tables[0];

最新更新