Skip to main content
Known Participant
January 25, 2012
Answered

Copy artboard (and art) to another document

  • January 25, 2012
  • 3 replies
  • 78905 views

Is there a way to write a script to copy a selected/chosen artboard (and it's contents) to another opened document, placing it in exactly the same place on the global x/y coordinates?  I'm either unable to find this feature built in to Illustrator, or it's simply missing.  Any help is greatly appreciated.

Thanks!

Tim

This topic has been closed for replies.
Correct answer CarlosCanto

it was in fact more dificult than I had anticipated...in part because of the limitations of the Illustrator scripting capabilities, in part your document set up...but it is "almost" done.


Hi Tim, here you go, open both your template and your destination document and run the script

#target illustrator

// script.name = timLCdupArtboards.jsx;

// script.description = duplicates provided artboards to another open document;

// script.required = requires CS5, and both source and destination documenets (with the same layer structure) open

// script.parent = CarlosCanto // 02/07/12; 

// script.elegant = false;

// Notes: use only in documents with NO sublayers,

var docList = doclist(); // get a list of open docs

var source = prompt ("Enter Source Document (Index Number)\r\r" + docList, 0, "Copy Artboards"); // get source doc name index

if (source!=null) {// quit if pressed Cancel

    var dest = prompt ("Enter Destination Document (Index Number)\r\r" + docList, 1, "Copy Artboards"); // get destination doc name index

    if (dest!=null) {// quit if pressed Cancel

        var absstring = prompt ("Enter Indexes of Artboards to copy (comma separated)", "25,37,16,19,34,35,36", "Copy Artboards"); // get list of artboards to copy

        if (absstring!=null) {// quit if pressed Cancel

            var artbs = absstring.split (","); // turn list into an array

            var absCount = artbs.length; // get artboards count

            var sourceDoc = app.documents[source]; // get actual docs

            var destDoc = app.documents[dest];

            // get layer visible/lock info & unlock and make visible all layers

            var sourceDocLayerState = unlockUnhideLayers(sourceDoc);

            var destDocLayerState = unlockUnhideLayers(destDoc);

            sourceDoc.activate(); // activate source otherwise it is not able to access selection

            var ABs = []; // array to hold of artboard objects to copy

            var ABsRect = []; // array to hold artboards Rectangles

            var ABsNames = []; // array to hold artboard names

            var ABsInfo = []; // array to hold [Rect, Names]

            for (i=0; i<absCount; i++) {

                ABs = sourceDoc.artboards[artbs-1]; // get actual artboard

                ABsRect = ABs.artboardRect; // get Rectangle

                ABsNames = ABs.name; // get Name

                ABsInfo = [ABsRect, ABsNames]; // get Rectangle and Name

                sourceDoc.selection = null; // deselect everything

                sourceDoc.artboards.setActiveArtboardIndex (artbs-1); // activate each artboard

                sourceDoc.selectObjectsOnActiveArtboard(); // select all in artboard

                sel = sourceDoc.selection; // get selection

                moveObjects(sel, destDoc); // move selection

            }

            addArtboards(destDoc, ABsInfo); // recreate artboards in destination document

            // restore layer original state

            lockHideLayers(sourceDoc, sourceDocLayerState);

            lockHideLayers(destDoc, destDocLayerState);

        }

    }

}

function unlockUnhideLayers(doc) {

          // get visible state of each layer, and show/unlock layers

          var layerState = []; // array to hold layer visibility

          var layerCount = doc.layers.length; // layer count

          // get layer visibility, and turn all layers on

          for (i=0; i<layerCount; i++) {

                    var ilayer = doc.layers;

                    layerState = [ilayer.visible, ilayer.locked];

                    ilayer.visible = true;

        ilayer.locked = false;

          }

    return layerState;

}

function lockHideLayers(doc, layerstate) {

          // restore layer visibility

    var layerCount = doc.layers.length; // layer count

          for (k=0; k<layerCount; k++) {

                    var ilayer = doc.layers;

        ilayer.visible = layerstate[0]; // already a Boolean value, no need to convert

        ilayer.locked = layerstate[1]; // already a Boolean value, no need to convert

          }

}

// create artboards in destination doc, using the info in absInfo (abRect, Name)

function addArtboards(doc, absInfo) {

    var destDoc = doc;

    var absCount = absInfo.length;

    destDoc.activate();

    for (j=0; j<absCount; j++) {

        var newAB = destDoc.artboards.add(ABsInfo[0]);

        newAB.name = ABsInfo[1];

    }

}

// move selected objects (sel) to destination document

function moveObjects(sel, destDoc) {

    for (k=0; k<sel.length; k++) {

        // duplicate items to the same layer in dest document, give both documents have the same layer structure

        var newItem = sel.duplicate(destDoc.layers[sel.layer.name],ElementPlacement.PLACEATEND);

    }

}

// get a list of open documents, separated by tabs

function doclist() {

    var docs = app.documents;

        msg = "";

    for (i=0; i<docs.length; i++) {

        msg += i + ". " + docs.name + "\t"; // had to use tab (insted of \r) to have the list "inline". Prompt only allows 4 rows in windows

    }

    return msg;

}

3 replies

Participant
October 4, 2019

I have a document with 10 artboards of different sizes and I wanted to copy it to another document so what I did was use "Save As" to save the existing document with a new file name and then delete everything in this file and continue with new atwork with the same artboards in the same position. 

Participant
April 1, 2014

I ran into this problem today, which I think is bad design by Adobe... keeping in mind Illustrator is an awesome program, but just not perfect.

Here is how I got around it, which may be a good solution for you (running scripts are a real pain, IMO): I was using 10 story boards and needed 1 more, but Illustrator would give me this message saying it wasn't possible to do it outside boundaires. I deleted some storyboards, to no avail. So then I did this:

Deleted all of them, except one, which wasn't possible to delete. Then I reduced the size of that one to a miniscule storyboard. Then I added 20 storyboards, which is more than what I'll need. Seems like you can go infinite on storyboards.

Deleting storyboards may seem like a bad way to go about it, but it isn't if you will write down the 4 coordinates for each storyboard: width, height, and x and y coordinates. Then just go back to the new [miniscule] storyboards you created and change them to the numbers they used to be. Hope this helps.

www.imaginativedesign.co

CarlosCanto
Community Expert
Community Expert
January 25, 2012

there's no one command to do that. You'll have to get the size/placement of the artboard and recreate in the destination document. Then is a matter of looping thru all pageItems and duplicate them to the new artboard.

Known Participant
January 25, 2012

So basically it would have to be a separate script for each artboard we’ want to copy, right? If that’s the case that wouldn’t save us much/if any efficiency. Was worth a shot, and can’t hurt to ask J

CarlosCanto
Community Expert
Community Expert
January 30, 2012

Something that springs to mind straight away… This could become a RPITA both your artboards and there relative artwork must be separate… AI lets you do artboards in formatted rows etc. or completly random and art can exist across multi-artboards… I would hop you are dealing with the first of these?


that was my main concern, it could get real messy, but if all docs are based on the same template that part would be covered. The other issue would be nested layers, now it seems there's only main layers, it's getting less complicated...