Skip to main content
AhmetSamsa
Known Participant
April 26, 2022
Answered

Adjust Layout Script Not working properly.

  • April 26, 2022
  • 2 replies
  • 2258 views

I'm using "AdjustPageItems" or "//AdjustLayout_modified.jsx" script to move all items on every page. I have the document with 700+ pages. I divided the document into sections. When I select last page from script menu, it only moves items from page 1 until page 30.  I think script is ignoring any section mark, or section breaks.  Does anyone have any suggestions other than removing all sections?

 

Correct answer m1b

@Laubender is spot on. I made a file with two sections—"A" and "B"—with pages numbers starting at 1 in each. The myPageNames array was 1,2,3,4,1,2,3,4 which won't work. I changed the script to use page specifiers instead of page names and seems to work correctly now, but specifiers are a bit ugly to look at. See what you think. A refinement would be to make a list for the UI of combined Section prefix and page number.

- Mark

 

Edit: changed to mm, minor adjustments to script.

 

/*  AdjustLayout_modified2.jsx

    Moves the content of even/odd pages by specified amounts; attempts to get
    objects back into the correct position after a master page margin change
    and/or page insertion.

    Quick modification to use page specifiers rather than page names
*/

function main() {
    //Make certain that user interaction (display of dialogs, etc.) is turned on.
    app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
    if (app.documents.length != 0) {
        if (app.activeDocument.pageItems.length != 0) {
            myDisplayDialog();
        }
        else {
            alert("Document contains no page items.");
        }
    }
    else {
        alert("Please open a document and try again.");
    }
}
function myDisplayDialog() {
    var myLabelWidth = 70;
    var mm = 2.83465;
    var myDialog = app.dialogs.add({ name: "Adjust Layout" });
    var myPageSpecifiers = myGetPageSpecifiers();
    with (myDialog.dialogColumns.add()) {
        with (borderPanels.add()) {
            with (dialogColumns.add()) {
                with (dialogRows.add()) {
                    with (dialogColumns.add()) {
                        staticTexts.add({ staticLabel: "Start Page:", minWidth: myLabelWidth });
                    }
                    with (dialogColumns.add()) {
                        var myStartPageDropdown = dropdowns.add({ stringList: myPageSpecifiers, selectedIndex: 0 });
                    }
                }
                with (dialogRows.add()) {
                    with (dialogColumns.add()) {
                        staticTexts.add({ staticLabel: "End Page:", minWidth: myLabelWidth });
                    }
                    with (dialogColumns.add()) {
                        var myEndPageDropdown = dropdowns.add({ stringList: myPageSpecifiers, selectedIndex: myPageSpecifiers.length - 1 });
                    }
                }
            }
        }
        with (borderPanels.add()) {
            with (dialogRows.add()) {
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "Even Pages", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Horizontal:", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Vertical:", minWidth: myLabelWidth });
                }
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "" });
                    var myEvenXField = measurementEditboxes.add({ editValue: -10 * mm, editUnits: MeasurementUnits.millimeters });
                    var myEvenYField = measurementEditboxes.add({ editValue: 0, editUnits: MeasurementUnits.millimeters });
                }
            }
        }
        with (borderPanels.add()) {
            with (dialogRows.add()) {
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "Odd Pages", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Horizontal:", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Vertical:", minWidth: myLabelWidth });
                }
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "" });
                    var myOddXField = measurementEditboxes.add({ editValue: 10 * mm, editUnits: MeasurementUnits.millimeters });
                    var myOddYField = measurementEditboxes.add({ editValue: 0, editUnits: MeasurementUnits.millimeters });
                }
            }
        }
    }
    var myResult = myDialog.show();
    if (myResult == true) {
        var myStartPageSpecifier = myPageSpecifiers[myStartPageDropdown.selectedIndex];
        var myEndPageSpecifier = myPageSpecifiers[myEndPageDropdown.selectedIndex];
        if (myCheckPageRange(myStartPageSpecifier, myEndPageSpecifier) == true) {
            var myEvenX = myEvenXField.editValue;
            var myEvenY = myEvenYField.editValue;
            var myOddX = myOddXField.editValue;
            var myOddY = myOddYField.editValue;
            myDialog.destroy();
            myAdjustPages(myEvenX, myEvenY, myOddX, myOddY, myStartPageSpecifier, myEndPageSpecifier);
        }
        else {
            myDialog.destroy();
            alert("Invalid page range.");
        }
    }
    else {
        myDialog.destroy();
    }
}
function myAdjustPages(myEvenX, myEvenY, myOddX, myOddY, myStartPageSpecifier, myEndPageSpecifier) {
    var myPage, myPageAdjust;
    app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;

    //Save the old page numbering
    var myOldPageNumbering = app.generalPreferences.pageNumbering;
    app.generalPreferences.pageNumbering = PageNumberingOptions.section;
    var myStartPage = resolve(myStartPageSpecifier);
    var myEndPage = resolve(myEndPageSpecifier);
    //Set page numbering to absolute
    app.generalPreferences.pageNumbering = PageNumberingOptions.absolute;
    //Does the document start with an even page?
    if (myCheckPageStart(app.activeDocument) == false) {
        myPageAdjust = 0;
    }
    else {
        myPageAdjust = 1;
    }
    for (var myCounter = (myStartPage.documentOffset); myCounter <= myEndPage.documentOffset; myCounter++) {
        myPage = app.activeDocument.pages.item(myCounter);
        var myPageValue = myPage.documentOffset;
        myPageValue = myPageValue + myPageAdjust;
        if (myPageValue % 2 == 0) {
            //Page is an even page.
            myAdjustPage(myPage, myEvenX, myEvenY);
        }
        else {
            //Page is an odd page.
            myAdjustPage(myPage, myOddX, myOddY);
        }
    }
    app.generalPreferences.pageNumbering = myOldPageNumbering;
}
function myAdjustPage(myPage, myX, myY) {
    var myPageItem;
    var myResetItemLock = false;
    var myResetLayerLock = false;
    for (var myCounter = 0; myCounter < myPage.pageItems.length; myCounter++) {
        myPageItem = myPage.pageItems.item(myCounter);
        if (myPageItem.locked == true) {
            myPageItem.locked = false;
            myResetItemLock = true;
        }
        if (myPageItem.itemLayer.locked == true) {
            myPageItem.itemLayer.locked = false;
            myResetLayerLock = true;

        }
        myPageItem.move(undefined, [myX, myY]);
        if (myResetItemLock == true) {
            myPageItem.locked = true;
        }
        if (myResetLayerLock == true) {
            myPageItem.itemLayer.locked = true;
        }
    }
}
function myGetPageSpecifiers() {
    var myPageSpecifiers = new Array;
    for (myCounter = 0; myCounter < app.activeDocument.pages.length; myCounter++) {
        myPageSpecifiers.push(app.activeDocument.pages.item(myCounter).toSpecifier());
    }
    return myPageSpecifiers;
}
function myCheckPageStart(myDocument) {
    var mySection = myDocument.sections.item(0);
    if (mySection.pageNumberStart % 2 == 0) {
        //Starting page number is an even page.
        return false;
    }
    else {
        //Starting page number is an odd page.
        return true;
    }
}
function myCheckPageRange(myStartPageSpecifier, myEndPageSpecifier) {
    var myStartIndex = resolve(myStartPageSpecifier).documentOffset;
    var myEndIndex = resolve(myEndPageSpecifier).documentOffset;
    if (myStartIndex <= myEndIndex) {
        return true;
    }
    else {
        return false;
    }
}


app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, 'Adjust Layout');

 

 

 

2 replies

Community Expert
April 26, 2022

Hi Ahmet,

yes, it's an issue how pages are addressed.

There is a name property with page objects in scripting.

With alternate layouts sections are introduced to the document. Sections that could contain pages with the same name in other sections. A page name is not unique in InDesign. And that's by definition.

Obviously the script cannot work with a situation where page names are not unique in a given document.

 

Well, and here we have it if I am looking at this function myGetPageNames() in AdjustPageItems.jsx that is delivered with every version of InDesign:

 

function myGetPageNames(){
	var myPageNames = new Array;
	for(myCounter = 0; myCounter < app.activeDocument.pages.length; myCounter ++){
		myPageNames.push(app.activeDocument.pages.item(myCounter).name);
	}
	return myPageNames;
}

 

That array, and also the code that is working with the array of page names, should be abandoned.

 

An array of selected pages from the GUI of the script should either contain the page objects themselves or at least the documentOffset numbers which will reflect the position of the pages in the document

 

That could mean a major rewrite, I think…

 

Regards,
Uwe Laubender

( ACP )

m1b
Community Expert
m1bCommunity ExpertCorrect answer
Community Expert
April 26, 2022

@Laubender is spot on. I made a file with two sections—"A" and "B"—with pages numbers starting at 1 in each. The myPageNames array was 1,2,3,4,1,2,3,4 which won't work. I changed the script to use page specifiers instead of page names and seems to work correctly now, but specifiers are a bit ugly to look at. See what you think. A refinement would be to make a list for the UI of combined Section prefix and page number.

- Mark

 

Edit: changed to mm, minor adjustments to script.

 

/*  AdjustLayout_modified2.jsx

    Moves the content of even/odd pages by specified amounts; attempts to get
    objects back into the correct position after a master page margin change
    and/or page insertion.

    Quick modification to use page specifiers rather than page names
*/

function main() {
    //Make certain that user interaction (display of dialogs, etc.) is turned on.
    app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
    if (app.documents.length != 0) {
        if (app.activeDocument.pageItems.length != 0) {
            myDisplayDialog();
        }
        else {
            alert("Document contains no page items.");
        }
    }
    else {
        alert("Please open a document and try again.");
    }
}
function myDisplayDialog() {
    var myLabelWidth = 70;
    var mm = 2.83465;
    var myDialog = app.dialogs.add({ name: "Adjust Layout" });
    var myPageSpecifiers = myGetPageSpecifiers();
    with (myDialog.dialogColumns.add()) {
        with (borderPanels.add()) {
            with (dialogColumns.add()) {
                with (dialogRows.add()) {
                    with (dialogColumns.add()) {
                        staticTexts.add({ staticLabel: "Start Page:", minWidth: myLabelWidth });
                    }
                    with (dialogColumns.add()) {
                        var myStartPageDropdown = dropdowns.add({ stringList: myPageSpecifiers, selectedIndex: 0 });
                    }
                }
                with (dialogRows.add()) {
                    with (dialogColumns.add()) {
                        staticTexts.add({ staticLabel: "End Page:", minWidth: myLabelWidth });
                    }
                    with (dialogColumns.add()) {
                        var myEndPageDropdown = dropdowns.add({ stringList: myPageSpecifiers, selectedIndex: myPageSpecifiers.length - 1 });
                    }
                }
            }
        }
        with (borderPanels.add()) {
            with (dialogRows.add()) {
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "Even Pages", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Horizontal:", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Vertical:", minWidth: myLabelWidth });
                }
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "" });
                    var myEvenXField = measurementEditboxes.add({ editValue: -10 * mm, editUnits: MeasurementUnits.millimeters });
                    var myEvenYField = measurementEditboxes.add({ editValue: 0, editUnits: MeasurementUnits.millimeters });
                }
            }
        }
        with (borderPanels.add()) {
            with (dialogRows.add()) {
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "Odd Pages", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Horizontal:", minWidth: myLabelWidth });
                    staticTexts.add({ staticLabel: "Vertical:", minWidth: myLabelWidth });
                }
                with (dialogColumns.add()) {
                    staticTexts.add({ staticLabel: "" });
                    var myOddXField = measurementEditboxes.add({ editValue: 10 * mm, editUnits: MeasurementUnits.millimeters });
                    var myOddYField = measurementEditboxes.add({ editValue: 0, editUnits: MeasurementUnits.millimeters });
                }
            }
        }
    }
    var myResult = myDialog.show();
    if (myResult == true) {
        var myStartPageSpecifier = myPageSpecifiers[myStartPageDropdown.selectedIndex];
        var myEndPageSpecifier = myPageSpecifiers[myEndPageDropdown.selectedIndex];
        if (myCheckPageRange(myStartPageSpecifier, myEndPageSpecifier) == true) {
            var myEvenX = myEvenXField.editValue;
            var myEvenY = myEvenYField.editValue;
            var myOddX = myOddXField.editValue;
            var myOddY = myOddYField.editValue;
            myDialog.destroy();
            myAdjustPages(myEvenX, myEvenY, myOddX, myOddY, myStartPageSpecifier, myEndPageSpecifier);
        }
        else {
            myDialog.destroy();
            alert("Invalid page range.");
        }
    }
    else {
        myDialog.destroy();
    }
}
function myAdjustPages(myEvenX, myEvenY, myOddX, myOddY, myStartPageSpecifier, myEndPageSpecifier) {
    var myPage, myPageAdjust;
    app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;

    //Save the old page numbering
    var myOldPageNumbering = app.generalPreferences.pageNumbering;
    app.generalPreferences.pageNumbering = PageNumberingOptions.section;
    var myStartPage = resolve(myStartPageSpecifier);
    var myEndPage = resolve(myEndPageSpecifier);
    //Set page numbering to absolute
    app.generalPreferences.pageNumbering = PageNumberingOptions.absolute;
    //Does the document start with an even page?
    if (myCheckPageStart(app.activeDocument) == false) {
        myPageAdjust = 0;
    }
    else {
        myPageAdjust = 1;
    }
    for (var myCounter = (myStartPage.documentOffset); myCounter <= myEndPage.documentOffset; myCounter++) {
        myPage = app.activeDocument.pages.item(myCounter);
        var myPageValue = myPage.documentOffset;
        myPageValue = myPageValue + myPageAdjust;
        if (myPageValue % 2 == 0) {
            //Page is an even page.
            myAdjustPage(myPage, myEvenX, myEvenY);
        }
        else {
            //Page is an odd page.
            myAdjustPage(myPage, myOddX, myOddY);
        }
    }
    app.generalPreferences.pageNumbering = myOldPageNumbering;
}
function myAdjustPage(myPage, myX, myY) {
    var myPageItem;
    var myResetItemLock = false;
    var myResetLayerLock = false;
    for (var myCounter = 0; myCounter < myPage.pageItems.length; myCounter++) {
        myPageItem = myPage.pageItems.item(myCounter);
        if (myPageItem.locked == true) {
            myPageItem.locked = false;
            myResetItemLock = true;
        }
        if (myPageItem.itemLayer.locked == true) {
            myPageItem.itemLayer.locked = false;
            myResetLayerLock = true;

        }
        myPageItem.move(undefined, [myX, myY]);
        if (myResetItemLock == true) {
            myPageItem.locked = true;
        }
        if (myResetLayerLock == true) {
            myPageItem.itemLayer.locked = true;
        }
    }
}
function myGetPageSpecifiers() {
    var myPageSpecifiers = new Array;
    for (myCounter = 0; myCounter < app.activeDocument.pages.length; myCounter++) {
        myPageSpecifiers.push(app.activeDocument.pages.item(myCounter).toSpecifier());
    }
    return myPageSpecifiers;
}
function myCheckPageStart(myDocument) {
    var mySection = myDocument.sections.item(0);
    if (mySection.pageNumberStart % 2 == 0) {
        //Starting page number is an even page.
        return false;
    }
    else {
        //Starting page number is an odd page.
        return true;
    }
}
function myCheckPageRange(myStartPageSpecifier, myEndPageSpecifier) {
    var myStartIndex = resolve(myStartPageSpecifier).documentOffset;
    var myEndIndex = resolve(myEndPageSpecifier).documentOffset;
    if (myStartIndex <= myEndIndex) {
        return true;
    }
    else {
        return false;
    }
}


app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, 'Adjust Layout');

 

 

 

AhmetSamsa
Known Participant
April 27, 2022

Any chance we can also move objects in master pages with this script? That would be great.

m1b
Community Expert
Community Expert
April 26, 2022

It's likely a limitation of the script—probably the way it addresses pages. Can you post the script so we can see what's going on?

- Mark

AhmetSamsa
Known Participant
April 26, 2022

This is the script. "https://github.com/ShinShinman/ID-scripts/blob/master/AdjustLayout_modified.jsx
Or script located in "\Scripts Panel\Samples\JavaScript\AdjustPageItems" (one of default sample script from Adobe)