2012-06-04 4 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에서)에서 새 문서를 만들려면 어떻게해야합니까?

참고 : 스크립트의 동작은 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에서 실행 중이지만 아마도 당신을 위해 작동 할 것입니다. 바라건대 내가 질문의 요지가 있니?

이 별도의 문서로 (5)을 통해 페이지 3를 추출합니다 :

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(); 
    } 
};