Javascript InDesign脚本:导出到IDML

Javascript InDesign脚本:导出到IDML,javascript,scripting,export,adobe-indesign,Javascript,Scripting,Export,Adobe Indesign,我试图编写一个脚本来执行数据合并,然后是查找/替换、页面添加,最后是导出。我可以让它执行合并并查找/替换所需的内容。当我手动添加新页面时,我通常会在页面窗口中选择第一个页面,然后单击底部的添加新页面。这样做会使之后的每一页都变成两页。我不知道如何在脚本中做到这一点,我在下面尝试的没有效果。它会在文档末尾添加一个新页面 app.activeDocument.pages.item(0).select(); app.activeDocument.pages.add(); 合并后,编辑速度非常慢,我

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

app.activeDocument.pages.item(0).select();
app.activeDocument.pages.add(); 
合并后,编辑速度非常慢,我添加或删除的每个字母需要15-20次。我发现让它像你期望的那样编辑的唯一方法是将其导出为IDML格式,然后在InDesign中重新打开该文件。我还没有找到太多关于通过javascript脚本导出的内容。我计划下一步尝试的是:app.activeDocument.exportFileExportFormat.INDESIGN\u标记,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);
}
编辑: 另一篇帖子将我带到了这个网站,但我不确定如何开始搜索我需要的内容?

添加页面和流动文本 而不是

app.activeDocument.pages.add(); 
您可以在函数中使用一个方便的参数:

app.activeDocument.pages.add(LocationOptions.AT_END); 
您不需要第二个参数引用,因为AT_END已经精确地告诉ID新页面必须出现的位置,即,如果您希望始终在第一个页面之后添加页面,您将使用AT的after和app.activeDocument.pages[0]作为引用

然而,这只会增加一页。要使文本在其上流动,您需要手动添加一个新的文本框,并对上一页中的文本框进行线程链接:

newframe = newpage.textFrames.add(..)
startframe.nextTextFrame = newframe; // <- thread
出口 这是一个令人恼火的问题,数据合并后ID会变慢。我想不起来以前是否有过这样的报道;你可能想在电话上问一下。只有可能:也许你可以手动尝试这个。合并完成后,不要直接使用“保存”,而是执行“另存为”,并覆盖旧文件。另存为清理和重新分配内存;我发现它有时有用。如果这不起作用,我只能推荐导出到IDML并重新打开它

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

首先,你不应该使用app.open-这就是它所说的,它会打开以前保存的文件。您想在这里创建一个新文件;中的参数引用它将创建的文件。使用您的代码,它将覆盖现有的文件-除非ID注意到您已经打开了它,并因此而抱怨。这不是一个我愿意检验其正确性的声明

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

第三点,次要的一点:该对象为您的桌面文件夹提供了方便的快捷方式

var newDoc = new File(Folder.desktop+"/DataMerge_MMM.idml");
app.activeDocument.exportFile(ExportFormat.INDESIGN_MARKUP, newDoc);
免责声明
我手头没有CS5,我用CS6测试过。如果您在未知属性及其类似属性上遇到错误,请在早上打电话过来,我会看看我能做些什么。

模板MMM14 template_v1.indd的一个小提示:如果您在“另存为”对话框的“格式”下将其另存为模板,或者只需将其扩展名更改为indt,默认情况下,您会发现ID打开了一个副本。根据您所说的,我使用app.activeDocument.pages.addLocationOptions添加了附加页面。之后是app.activeDocument.pages[0];它给出了期望的结果。有关导出的信息和提示也起了作用!我理解你的代码在做什么,但我不明白你为什么建议它?合并数据时,会为每条记录创建一个新页面。有一些过度设置的文本,但我运行TextStitch使文档像书一样流动,它修复了这一问题。Jonathan:我还没有想到如何从脚本中运行它,尽管它没有那么重要。@Jonathan:在数据合并过程中新页面出现问题的想法一定在我脑海中根深蒂固。但是,很高兴你能根据我的提示解决它!要在您的脚本完成后链接另一个脚本,您可以尝试。
var newDoc = new File(Folder.desktop+"/DataMerge_MMM.idml");
app.activeDocument.exportFile(ExportFormat.INDESIGN_MARKUP, newDoc);