2012-06-04 41 views
2

我需要提供一項功能,它允許InDesign用戶在InDesign文檔中選擇一個頁面範圍,並從這些頁面中創建一個新文檔。這聽起來很簡單,但它不是...如何從其他文檔頁面的子集創建新文檔(使用ExtendScript在InDesign(CS6)中)?

我已經嘗試了許多不同的方式來做到這一點,但他們都沒有達到某種程度。有些方法會將所有頁面放在一起(有時會導致InDesign崩潰)。我已經能夠做到最好的(見下面的代碼)仍然在一開始的問題和結束(見下截圖):

原稿:

Overview of the original document. The middle is removed (red lines).

的新的文件:

Overview of the new document. The middle is removed (red lines).

問題:如何在沒有屏幕截圖中顯示問題的情況下使用其他文檔頁面的子集(使用ExtendScript在InDesign中)創建新文檔?

note:在CS5.5和CS6中,腳本的行爲完全不同。我的問題涉及CS6。


第二畫面是通過將下面的代碼來在所述第一屏幕截圖中所示的文檔而獲得:

CODE

var firstPageName = { editContents: "117" }; // This page number is actually entered by the user in an integerEditbox 
var lastPageName = { editContents: "136" }; // This page number is actually entered by the user in an integerEditbox 
var sourceDocument = app.activeDocument; 
var destDocument = app.documents.add(); 
destDocument.importStyles(ImportFormat.paragraphStylesFormat, new File(sourceDocument.filePath + "/" + sourceDocument.name), GlobalClashResolutionStrategy.LOAD_ALL_WITH_OVERWRITE); 
destDocument.importStyles(ImportFormat.characterStylesFormat, new File(sourceDocument.filePath + "/" + sourceDocument.name), GlobalClashResolutionStrategy.LOAD_ALL_WITH_OVERWRITE); 
destDocument.viewPreferences.horizontalMeasurementUnits = sourceDocument.viewPreferences.horizontalMeasurementUnits; 
destDocument.viewPreferences.verticalMeasurementUnits = sourceDocument.viewPreferences.verticalMeasurementUnits; 
destDocument.documentPreferences.facingPages = sourceDocument.documentPreferences.facingPages; 
destDocument.documentPreferences.pageHeight = sourceDocument.documentPreferences.pageHeight; 
destDocument.documentPreferences.pageWidth = sourceDocument.documentPreferences.pageWidth; 
destDocument.documentPreferences.pageSize = sourceDocument.documentPreferences.pageSize; 
var sourceSpreads = sourceDocument.spreads; 
var nbSourceSpreads = sourceSpreads.length; 
var firstPageFound = false; 
var lastPageFound = false; 
var i; 
var newSpreadNeeded; 
var currentDestSpread; 

for (i = 0; !lastPageFound, i < nbSourceSpreads; ++i) { 
    newSpreadNeeded = true; 
    var sourcePages = sourceSpreads[i].pages; 
    var nbSourcePages = sourcePages.length; 
    var j; 
    for (j = 0; !lastPageFound, j < nbSourcePages; ++j) { 
    if (sourcePages[j].name === firstPageName.editContents) { 
     firstPageFound = true; 
     destDocument.documentPreferences.startPageNumber = parseInt(firstPageName.editContents); // We want to preserve page numbers 
    } 
    if (firstPageFound) { 
     // Copy this page over to the new document. 
     var firstInNewSpread = false; 
     if (newSpreadNeeded) { 
     currentDestSpread = destDocument.spreads.add(); 
     newSpreadNeeded = false; 
     firstInNewSpread = true; 
     } 
     var newPage = sourcePages[j].duplicate(LocationOptions.AT_END, currentDestSpread); 
     var k; 
     for (k = 0; k < newPage.index; ++k) { 
     currentDestSpread.pages[k].remove(); 
     } 
    } 
    if (sourcePages[j].name === lastPageName.editContents) { 
     lastPageFound = true; 
    } 
    } 
} 
destDocument.spreads[0].remove(); 

回答

1

我被黑客周圍,並用這個小想出了腳本。雖然它從相反的方向接近問題,但它似乎在這裏工作得很好。另外,我仍然使用InDesign CS5,但它可能適用於您。希望我有你的問題的要點?

這將提取的頁面3到5到單獨的文檔:

var doc = app.activeDocument; 

var newFilePath = doc.filePath + "/subset_" + doc.name; 
var newFile = File(newFilePath); // Create a new file path 

doc.saveACopy(newFile); // Save a copy of the doc 
var newDoc = app.open(newFile); // Open the copy 

var firstPageNum = 3; // First page number in the range 
var lastPageNum = 5; // Last page number in the range 

var firstPage = newDoc.pages[firstPageNum-1]; 
var lastPage = newDoc.pages[lastPageNum-1]; 

// Remove all text from the last page in the range to the end of the document 
var lastPageFrames = lastPage.textFrames.everyItem().getElements(); 
for (var i=0; i < lastPageFrames.length; i++) { 
    var frame = lastPageFrames[i]; 
    var parentStory = frame.parentStory; 
    var lastFrameInsert = frame.insertionPoints.lastItem(); 
    var lastStoryInsert = parentStory.insertionPoints.lastItem(); 
    var textAfter = parentStory.insertionPoints.itemByRange(lastFrameInsert,lastStoryInsert); 
    textAfter.remove(); 
}; 

// Remove all text from the beginning of the document to the first page in the range 
var firstPageFrames = firstPage.textFrames.everyItem().getElements(); 
for (var i=0; i < firstPageFrames.length; i++) { 
    var frame = firstPageFrames[i]; 
    var parentStory = frame.parentStory; 
    var firstFrameInsert = frame.insertionPoints.firstItem(); 
    var textBefore = parentStory.insertionPoints.itemByRange(0,firstFrameInsert.index); 
    textBefore.remove(); 
}; 

// Remove the pages that aren't in the range 
var allPages = newDoc.pages.everyItem().getElements(); 
for (var i=0; i < allPages.length; i++) { 
    var page = allPages[i]; 
    if (i < firstPageNum || i > lastPageNum) { 
     page.remove(); 
    } 
}; 
相關問題