Copy link to clipboard
Copied
Hi all, many users have expressed their desire for a way to open multipage PDFs in Illustrator and for a couple of years now, mac users have enjoyed the use of a script by Shane Stanley to do just that...at first I wanted to translate his script into VB so PC users could benefit from it...since I couldn't get the source code, I decided to give my own version a try using JS....here's the result.
Use with caution, save everything before running until you're comfortable it won't mess things up. I didn't try opening a crazy amount of pages, I "only" opened 35 in about minute and a half. Let us know how many pages you're able to open before you crash Illustrator...
it works with CS4 and CS5 only, windows and mac
have comments?, questions? let me know...enjoy. Carlos Canto
Download:
http://www.fileswap.com/dl/QDc2eDC9v4/AI_openMultiPagePDF_CS4_CS5.zip.html
Copy link to clipboard
Copied
//@target illustrator
//@targetengine session
// script.name = AI_openMultiPagePDF_CS4_CS5_v1.02.jsx;
// script.description = opens a multipage PDF;
// script.required = requires CS4 or later
// script.parent = CarlosCanto // 01/07/12; v1.2-01/15/12
// script.elegant = false;
// Notes: I didn't try opening a ridiculous amount of pages, I "only" open 35 pages....in about a minute and a half.
// Use with caution, save everything before running, script is memory intensive...
// Lion fix by John Hawkinson 01/15/12
/**
* MaratShagiev, m_js@bk.ru, 15 oct 2016, tested on Illustrator CS4, CS5, CC2015.3
* modify lines: ~117, ~154-162, ~230-end;
* what modify:
* set zero point of the global rulers to the top left corner of the work area
* start edding pages from this zero point
* */
//----------------------- START UI CODE, create user interface
var win = new Window ("dialog", "MTools - Open Multipage PDF");
var fileGroup = win.add ("group"); // this is the group on the left, it holds the File button and the Font label note
var btnFile = fileGroup.add ("button", undefined, "File..."); // button to select the PDF to open
var lblFonts = fileGroup.add ("statictext", undefined, "Unavailable\nFonts\nwill be\nsubstituted.", {multiline: true});
var grpRight = win.add ("group"); // group on the right, to hold everything else
var txtFile = grpRight.add ("edittext", undefined); // to hold selected PDF file path
var grpPanel = grpRight.add ("group");
var pagesPanel = grpPanel.add ("panel", undefined, "Page Range");
var lblFrom = pagesPanel.add ("statictext", undefined, "From:");
var txtFrom = pagesPanel.add ("edittext", undefined, 1);
var lblTo = pagesPanel.add ("statictext", undefined, "To:");
var txtTo = pagesPanel.add ("edittext", undefined, 1);
var btnGroup = grpPanel.add ("group");
var btnOk = btnGroup.add ("button", undefined, "Open");
var btnCancel = btnGroup.add ("button", undefined, "Cancel");
var lblStatus = grpRight.add ("statictext", undefined, "Open Multipage PDF requires CS4 or later...");
win.orientation = pagesPanel.orientation = "row"; // two items fileGroup and grpRight
win.alignChildren = "right";
fileGroup.orientation = "column";
fileGroup.alignment = "top";
txtFile.alignment = ["fill", "top"];
lblStatus.alignment = "left";
grpRight.orientation = "column";
btnGroup.orientation = "column";
btnOk.enabled = false; // disable this button until a valid file is supplied
txtFrom.characters = txtTo.characters = 3;
btnFile.active = true; // receive the first "Enter"
win.helpTip = "\u00A9 2012 Carlos Canto";
grpRight.helpTip = "Not tested with a ridiculous amount of pages";
//------------------------ get the PDF file
btnFile.onClick = function () {
txtFile.text = ""; // clear previous File path if any
btnOk.enabled = false; // disable the Ok button
var fileRef = File.openDialog ("Select PDF...", "*.pdf"); // get the file
fileRef = new File (fileRef.fsName.replace ("file://", "")); // Lion fix by John Hawkinson
if (fileRef != null && fileRef.exists) // check if it is valid file, it should be, unless after clicking a file, the name gets edited
{
txtFile.text = fileRef.fsName; // show the file Path here
btnOk.enabled = true; // enable the Ok button
txtTo.active = true; // move focus to change the last page to open
}
}
//------------------------
btnOk.onClick = function () {
doSomething (); // call main function.
win.close (); // close when done
}
//------------------------ on leaving this text, check again if file exist, in case file path is typed instead of clicking the File...button
txtFile.onDeactivate = function () {
//alert("on deactivate")
var file = File (txtFile.text); // create a file based on the text edit control
if (file.exists) { // and chekc for existance, if it does
btnOk.enabled = true; // enable the Ok button
}
else { // if it does not exist
btnOk.enabled = false; // disable the Ok button
}
}
//------------------------
win.center ();
win.show ();
//-------------------------END UI CODE
function doSomething () // Open each page in the range, group all art, move to a new document, then
{ // with all pages on top of each other, create artboards and move each page
// to its final own layer, own artboard.
// get first page and last page to open
$.hiresTimer; // start timer
var from = txtFrom.text;
var to = txtTo.text;
// create destination document, pdf open options, etc
app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;
var fileRef = File (txtFile.text); // get file from text edit
//alert(fileRef.name)
var idoc = app.documents.add (); // add a document;
setAbsZero (); // MaratShagiev modify
var pdfOptions = app.preferences.PDFFileOptions;
pdfOptions.pDFCropToBox = PDFBoxType.PDFBOUNDINGBOX;
var spacing = 10; // space between artboards
var arrPagesInfo = []; // to hold each PDF page name, doc size and art position
for (j = from; j <= to; j++) // open all pages in range, group art, and move the dest document
{
pdfOptions.pageToOpen = j;
// Open a file using these preferences
var pdfDoc = open (fileRef, DocumentColorSpace.RGB);
lblStatus.text = "\u00A9 2012 Carlos Canto - Opening page " + j;
win.update ();
var pdfLayer = pdfDoc.activeLayer;
// add a group and group all items
var items = pdfLayer.pageItems; // get all items in layer, there's only one layer, right?
var tempGrp = pdfDoc.groupItems.add (); // to group everything in page
tempGrp.name = "Page " + j; // name the group, "Page 1", "Page 2", etc
for (i = items.length - 1; i > 0; i--) // group all items
{
items.move (tempGrp, ElementPlacement.PLACEATBEGINNING);
}
// get document bounds
var pdfw = pdfDoc.width;
var pdfh = pdfDoc.height;
var activeAB = pdfDoc.artboards[0];
pdfLeft = activeAB.artboardRect[0];
pdfTop = activeAB.artboardRect[1];
if (j == from) {
// firstabRect = activeAB.artboardRect;
// abRect = firstabRect;
// $.writeln(abRect);
var ableft = 0; // position next artboard below the first one
var abtop = 0;
var abright = ableft + pdfw;
var abbottom = abtop - pdfh;
firstabRect = [ableft, abtop, abright, abbottom];
abRect = firstabRect;
}
else {
// TODO // x = 8498 seems to be the canvas max X position, check and make another row if a page gets to here
if ((abRect[2] + spacing + pdfw) >= 8494) // if rightmost artboard position surpases the canvas size,
{
var ableft = firstabRect[0]; // position next artboard below the first one
var abtop = firstabRect[3] - spacing;
var abright = ableft + pdfw;
var abbottom = abtop - pdfh;
firstabRect = [ableft, abtop, abright, abbottom];
}
else // if we don't get to the canvas edge, position next artboard, to the right of the last one
{
var ableft = pageSpecs[3][2] + spacing; // pageSpecs[3] = abRect // abRect[2] = right position
var abtop = pageSpecs[3][1]; // abRect[1] = top position
var abright = ableft + pdfw;
var abbottom = abtop - pdfh;
}
abRect = [ableft, abtop, abright, abbottom];
}
// get this group position relative to top/left
var deltaX = tempGrp.left - pdfLeft;
var deltaY = pdfTop - tempGrp.top;
// make an array to hold each page Name, width, height, deltaX, deltaY
pageSpecs = [tempGrp.name, deltaX, deltaY, abRect]; // pageSpecs holds last page info, it gets overwritten as we add pages
arrPagesInfo.unshift (pageSpecs); // unshift to make first page, the last in the array
// duplicate grouped page 1 onto dest document
newItem = tempGrp.duplicate (idoc, ElementPlacement.PLACEATBEGINNING);
// close current PDF page
pdfDoc.close (SaveOptions.DONOTSAVECHANGES);
} // end for all pages to open
// Stage 2, create layers and artboards for each PDF page (group) and reposition
// loop thru the groups, add artboards for each and reposition
var ilayer = idoc.layers[idoc.layers.length - 1]; // the one layer so far
for (k = arrPagesInfo.length - 1; k >= 0; k--) // last item in the array holds the first PDF page info
{
// add new layer and new AB
var newAB = idoc.artboards.add (arrPagesInfo
[3]); var newLayer = idoc.layers.add ();
newLayer.name = arrPagesInfo
[0] // reposition group relative to top/left
var igroup = ilayer.groupItems
; igroup.left = newAB.artboardRect[0] + arrPagesInfo
[1]; igroup.top = newAB.artboardRect[1] - arrPagesInfo
[2]; igroup.move (newLayer, ElementPlacement.PLACEATEND);
// add new artboard to the left of existing one
lblStatus.text = "Repositioning page " + k;
win.update ();
}
idoc.artboards[0].remove ();
ilayer.remove ();
app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS;
var time = $.hiresTimer / 1000000; // end timer
lblStatus.text = "Copyright 2012 \u00A9 Carlos Canto";
alert (arrPagesInfo.length + " pages opened in " + time.toFixed (2) + " seconds"); // 35 pages opened in 98-99 seconds
//$.writeln(time);
}// end doSomething Function
/**
* set the zero point of global rulers to top left corner of main work area
*
* used copy-past max-size-rectangle (16383*16383 pt)
* and the Document.view property
* */
function setAbsZero () {
var WORK_AREA_SIZE = 16383,
d = activeDocument,
rect = d.pathItems.rectangle (0, 0, WORK_AREA_SIZE, WORK_AREA_SIZE),
artbMax,
screenModeStore = d.views[0].screenMode;
rect.stroked = false;
rect.selected = true;
cut ();
d.views[0].screenMode = ScreenMode.FULLSCREEN;
d.views[0].zoom = 64;
d.views[0].zoom = 0.0313;
paste ();
rect = selection[0];
artbMax = d.artboards.add (rect.geometricBounds);
d.rulerOrigin = [0, d.height];
d.artboards[d.artboards.getActiveArtboardIndex ()].rulerOrigin = [0, 0];
rect.remove ();
artbMax.remove ();
d.views[0].screenMode = screenModeStore;
}