2

InDesign ユーザーが InDesign ドキュメント内のページ範囲を選択し、それらのページから新しいドキュメントを作成できる機能を提供する必要があります。これは簡単に聞こえますが、そうではありません...

私はこれを行うためにさまざまな方法を試しましたが、いずれもある程度失敗しています。一部の方法では、すべてのページが 1 つのスプレッドに配置されます (InDesign がクラッシュすることがあります)。私ができる最善のこと (以下のコードを参照) は、まだ最初と最後に問題があります (下のスクリーンショットを参照):

元のドキュメント:

元のドキュメントの概要。 中央が削除されます (赤い線)。

新しいドキュメント:

新しいドキュメントの概要。 中央が削除されます (赤い線)。

質問:スクリーンショットに示されている問題を発生させずに、(InDesign で ExtendScript を使用して) 別のドキュメントのページのサブセットから新しいドキュメントを作成するにはどうすればよいですか?

注:スクリプトの動作は、CS5.5 と CS6 ではかなり異なります。私の質問はCS6に関するものです。


2 番目のスクリーンショットは、最初のスクリーンショットに示されているドキュメントに次のコードを適用して取得したものです。

コード

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

1 に答える 1

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();
   }
};
于 2012-06-30T04:01:02.133 に答える