InDesign脚本:导出到IDML

时间:2014-01-08 16:14:18

标签: javascript scripting export adobe-indesign

我正在尝试编写一个脚本来执行数据合并,然后是查找/替换,页面添加,最后导出。我可以让它执行合并并找到/替换所需的。当我手动添加新页面时,我通常会在页面窗口中选择第一页,然后单击底部添加新页面。这样做会使之后的每一页都变为2页。我不知道如何在脚本中执行此操作,我在下面尝试的操作无效。它在文档的末尾添加了一个新页面。

app.activeDocument.pages.item(0).select();
app.activeDocument.pages.add(); 

合并之后,编辑变得非常慢,我添加或删除每个字母15-20。我发现像你期望的那样编辑的唯一方法是将其导出为IDML格式然后重新打开InDesign中的文件。我无法在javascript中通过脚本导出很多内容。我打算接下来尝试的是:app.activeDocument.exportFile(ExportFormat.INDESIGN_MARKUP, newDoc, false);但我不知道这是否有效。我非常擅长在InDesign中编写脚本。我正在使用InDesign CS5.5,到目前为止这是整个脚本:

main();

function main()
{
    //Possibly let the user go find and choose a file
    //var mergeTemplate = File.openDialog();
    //var myDocument = app.open(mergeTemplate);

    //Open the template file to be used by the data merge.
    var myDocument = app.open(File("Macintosh HD/Users/Christian/Desktop/InDesign_Data_Merge/MMM14 Template_v1.indd"));
    //Load the data source
    var myDataSource = File("Macintosh HD/Users/Christian/Desktop/InDesign_Data_Merge/MMM v1.mer");

    myDocument.dataMergeProperties.selectDataSource(myDataSource);
    myDocument.dataMergeProperties.mergeRecords();

    //Save the document under a new name for later use.
    app.activeDocument.save(File("Macintosh HD/Users/Christian/Desktop/InDesign_Data_Merge/DataMerge_MMM.indd"));

    //Close the document, NOT saving original template,  so the original file is not destroyed or overwritten.
    myDocument.close(SaveOptions.no);

    //Find line break placeholder and replace with line break
    findReplace ("$$", "^n");
    //Find the tab placeholder and replace with tab
    findReplace ("##", "^t");

    //Select the first page of the document
    //app.activeDocument.pages.item(0).select();
    //Add another page to make the document print on both sides, like an open book
    //app.activeDocument.pages.add(); 

//export to IDML
//exportIDML();
}


function findReplace(findVal,replaceVal)
{
     // Clear the find/change text preferences.
    app.findTextPreferences = NothingEnum.NOTHING;
    app.changeTextPreferences = NothingEnum.NOTHING;

     // Set the find options
    app.findChangeTextOptions.caseSensitive = false;
    app.findChangeTextOptions.includeFootnotes = false;
    app.findChangeTextOptions.includeHiddenLayers = false;
    app.findChangeTextOptions.includeLockedLayersForFind = false;
    app.findChangeTextOptions.includeLockedStoriesForFind = false;
    app.findChangeTextOptions.includeMasterPages = false;
    app.findChangeTextOptions.wholeWord = false;

    // Search the document for the string findVal
    app.findTextPreferences.findWhat = findVal;
    // Change it to the string replaceVal
    app.changeTextPreferences.changeTo = replaceVal;
    // Perform the search-and-replace operation
    app.activeDocument.changeText();

}

function exportIDML()
{
    var newDoc = app.open(File("Macintosh HD/Users/Christian/Desktop/InDesign_Data_Merge/DataMerge_MMM.indd"));
    app.activeDocument.exportFile(ExportFormat.INDESIGN_MARKUP, newDoc, false);
}

修改 另一篇文章引导我访问了这个网站jongware.mit.edu,但我不知道如何开始寻找我需要的网站?

1 个答案:

答案 0 :(得分:1)

添加页面和流动文本

而不是

app.activeDocument.pages.add(); 

您可以在Pages.add函数中使用方便的参数:

app.activeDocument.pages.add(LocationOptions.AT_END); 

您不需要第二个参数“reference”,因为AT_END已经准确地告诉ID新页面必须到达的位置(即,如果您想在第一个参数之后总是添加页面,那么您需要将{{1>}用于 AFTER用于参考)。

然而,只有添加页面。要使文本流入它,您需要手动添加一个新的文本框架和“线程”(链接)上一页的文本框架:

app.activeDocument.pages[0]

不幸的是,只有向页面添加新文本框架不会自动将其大小调整为其父页面的边距。你得到的只是左上角的一个小框架。因此,您必须读取页面大小(使用其bounds属性)和当前margins,然后您可以调整框架的大小。如果您的边距镜像,则会有另一个障碍等待您:由于某种原因,MarginPreferences对象不会“看到”您是在左侧还是右侧页面上。所以我使用newframe = newpage.textFrames.add(..) startframe.nextTextFrame = newframe; // <- thread 检查它是否奇怪,如果是,则反转page.indexleft边距。

另一个可能的缺陷是当你的文本包含Continuously Overset项目 - 不适合页面的文本,无论你做什么。这可能发生在大表,大图像或具有某些奇怪属性的文本上,例如巨大的左缩进或无法应用于更多文本而不适用于单行。如果未选中,此脚本将继续检查溢出,检测它,创建新页面和文本框架,然后溢出等等。快速检查是添加一个新的文本框架并检查它是否实际上包含任何东西 - 一个连续溢出的框架将始终是完全空的。

除此之外,这里是您可以使用的部分,而不是您自己的注释掉的代码。它假定要添加的文本位于当前文档最后一页(索引right)的溢流文本框架中。它还假设该文本框架是该页面上唯一的文本框架(!)。

-1

导出

这是一个令人讨厌的问题,在数据合并后ID会减慢。我不记得以前是否报道过;你可能想问Adobe InDesign forum。只有可能:也许你可以手动试试这个。合并后,请不要使用“保存”,而是执行“另存为”,并覆盖旧文件。 “另存为”清理并重新分配内存;我发现它有时会有所帮助。如果这不起作用,我不能推荐任何其他东西,实际上,导出到IDML并重新打开它。

您尝试导出到IDML是公平的,但它包含一些错误!

首先,您不应该使用startframe = app.activeDocument.pages[-1].textFrames[0]; while (startframe.overflows) { newpg = app.activeDocument.pages.add(LocationOptions.AT_END); newframe = newpg.textFrames.add(); if (newpg.index & 1) newframe.geometricBounds = [newpg.bounds[0]+newpg.marginPreferences.top, newpg.bounds[1]+newpg.marginPreferences.left, newpg.bounds[2]-newpg.marginPreferences.bottom, newpg.bounds[3]-newpg.marginPreferences.right]; else newframe.geometricBounds = [newpg.bounds[0]+newpg.marginPreferences.top, newpg.bounds[1]+newpg.marginPreferences.right, newpg.bounds[2]-newpg.marginPreferences.bottom, newpg.bounds[3]-newpg.marginPreferences.left]; startframe.nextTextFrame = newframe; startframe = newframe; // Check for Continuous Overflow! if (startframe.contents.length == 0) { alert ("Continuous Overflow detected, cannot continue"); break; } } - 这就是它所说的,打开以前保存的文件。您想在此处创建文件; exportFile中的参数 to 指的是创建的文件。使用您的代码,它将覆盖现有文件 - 除非ID通知您已将其打开并因此抱怨。我不愿意为正确性进行测试。

其次,您需要将其文件扩展名正确设置为app.open:)

第三个小点:Folder对象提供了Desktop文件夹的便捷快捷方式。

.idml

声明

我手头没有CS5,我用CS6测试过。如果您在“未知属性”及其同类中遇到错误,请在早上回电,我会看到我能做些什么。