Skip to main content
Inspiring
September 2, 2021
Answered

Photoshop Script Import PDF Application.open without dialog

  • September 2, 2021
  • 3 replies
  • 7981 views

I'm working in Photoshop 2021 and writing a script to open a PDF and do some stuff with it.  I'd like to automate the import of multiple files, but when I use app.open() to open the PDF file, I get the "Import PDF" dialog pop up and I have to click OK, no matter what I use in my PDFOpenOptions.   Any way around this popup or is this by design?

This topic has been closed for replies.
Correct answer EveryoneAtWorkTalks2Much

Yes I know. They recommend Substance 3D Designer instead.


I ended up using a suggestion by r_bin to use a wsh script that uses sendkeys to photoshop.  It's an ungodly hack but it may end up working.  We will see when we try to automate it with the full data set of 1000s of PDFs.

 

Lesson learned: DialogModes.NO does not really mean no dialogs.

3 replies

JJMack
Community Expert
September 3, 2021

I did not read through  this thread  I create a script  years ago the open a pdf pages in Photoshop It does not have a Script Dialog but does have a system  open  file selection dialog so you can select the PDF to open its pages. I believe it  creates a document with the PDF pages stacked on top of each other. It bypasses the PDF Import dialog. Have not used it in years.

 

/* ==========================================================
// 2017  John J. McAssey (JJMack) 
// Stack the open Document Visible layer composite into a new 300 DPI document
// This script is supplied as is. It is provided as freeware. 
// The author accepts no liability for any problems arising from its use.
// ======================================================= */
// enable double-clicking from Mac Finder or Windows Explorer
#target photoshop // this command only works in Photoshop CS2 and higher
// bring application forward for double-click events
app.bringToFront();

if (documents.length >= 2) { 
	app.togglePalettes();											// toggle off palettes so Photoshop will not need to update them
	stackpages();												    // Photosho document can be different when oneo via UI
}
else {
	var theFile = File.openDialog("Select your PDF file", "Select:*.pdf");  
	app.displayDialogs = DialogModes.NO;  
	var check = true;  
	var page = 1;  
	// define pdfopenoptions;  
	var pdfOpenOpts = new PDFOpenOptions;  
	pdfOpenOpts.antiAlias = true;  
	pdfOpenOpts.bitsPerChannel = BitsPerChannelType.EIGHT;  
	pdfOpenOpts.cropPage = CropToType.MEDIABOX;  
	pdfOpenOpts.mode = OpenDocumentMode.RGB;  
	pdfOpenOpts.resolution = 300;  
	pdfOpenOpts.suppressWarnings = true;  
	pdfOpenOpts.usePageNumber  = true;  
	app.togglePalettes();											// toggle off palettes so Photoshop will not need to update them
	while (check == true) {  
		try {  
			pdfOpenOpts.page = page;								// open a page at it slower the using Photoshop UI ans selection all the pages you want  
			var thePdf = app.open(theFile, pdfOpenOpts);  
			page++;  
		} 
		catch (e) { check =  false };  
	}; 

	if (documents.length >= 2) { stackpages(); }
	else {
		app.togglePalettes();										// toggle on palettes
		alert("multiple Document are not open in Photoshop");
	}
}	
///////////////////////////////////////////////////////////////////////////////
//                     stack pages function                                  //
///////////////////////////////////////////////////////////////////////////////
function stackpages() {
	var orig_ruler_units = app.preferences.rulerUnits;
	var orig_display_dialogs = app.displayDialogs;
	app.preferences.rulerUnits = Units.PIXELS;						// set the ruler units to PIXELS
	app.displayDialogs = DialogModes.NO;							// Set Dialogs off
	//newFile = theFile.name.substr(0,theFile.name.indexOf(".pdf"));	//New File name
	newFile = app.activeDocument.name.substr(0,app.activeDocument.name.lastIndexOf("-"));	//New File name
	var doc = app.documents.add(app.activeDocument.width.value, app.activeDocument.height.value, app.activeDocument.resolution, newFile, NewDocumentMode.RGB, DocumentFill.TRANSPARENT ); // create a new document
	//for (var i=0;i<documents.length-1;i++) {						// stack a layer for the open document into the new document page 1 on botton	
	for (var i=documents.length-2;i>-1;i--) {						// stack a layer for the open document into the new document page 1 on top
		app.activeDocument = documents[i];							// switch active document
		var layerName = app.activeDocument.name;					// get document name
		app.activeDocument.flatten();								// Flatten remove transparency
		var idDplc = charIDToTypeID( "Dplc" );
		var desc259 = new ActionDescriptor();
		var idnull = charIDToTypeID( "null" );
        var ref24 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref24.putEnumerated( idLyr, idOrdn, idTrgt );
		desc259.putReference( idnull, ref24 );
		var idT = charIDToTypeID( "T   " );
        var ref25 = new ActionReference();
        var idDcmn = charIDToTypeID( "Dcmn" );
        ref25.putName( idDcmn, documents[documents.length-1].name );
		desc259.putReference( idT, ref25 );
		var idNm = charIDToTypeID( "Nm  " );
		desc259.putString( idNm, layerName );
		var idVrsn = charIDToTypeID( "Vrsn" );
		desc259.putInteger( idVrsn, 5 );
		executeAction( idDplc, desc259, DialogModes.NO );			// Copy Layer to document
		app.activeDocument = documents[documents.length-1];			// switch to newly created document
		layerName = layerName.substr(0,layerName.indexOf(".pdf")); 
		app.activeDocument.activeLayer.name=layerName;				// label layer with Document name
	}
	app.activeDocument = documents[documents.length-1];				// switch to newly created document
	var layers = activeDocument.layers;								// get layers
	activeDocument.activeLayer = layers[layers.length-1]			// Target Bottom Layer
	activeDocument.activeLayer.remove();							// Remove original layer
	while  (documents.length>1) {									// close all opened document except the newly created document							
		app.activeDocument = documents[0];		
		activeDocument.close(SaveOptions.DONOTSAVECHANGES);
	}
	app.togglePalettes();											// toggle user's palettes back on	
	app.runMenuItem(charIDToTypeID(("FtOn")));						// fit the document to the screen 
	app.displayDialogs = orig_display_dialogs;						// Reset display dialogs 
	app.preferences.rulerUnits = orig_ruler_units;					// reset units to original settings
}
///////////////////////////////////////////////////////////////////////////////
//                stack open pages function                                  //
///////////////////////////////////////////////////////////////////////////////
function stackopenpages() {
	var orig_ruler_units = app.preferences.rulerUnits;
	var orig_display_dialogs = app.displayDialogs;
	app.preferences.rulerUnits = Units.PIXELS;						// set the ruler units to PIXELS
	app.displayDialogs = DialogModes.NO;							// Set Dialogs off
	//newFile = theFile.name.substr(0,theFile.name.indexOf(".pdf"));	//New File name
	newFile = app.activeDocument.name.substr(0,app.activeDocument.name.lastIndexOf("-"));	//New File name
	var doc = app.documents.add(app.activeDocument.width.value, app.activeDocument.height.value, app.activeDocument.resolution, newFile, NewDocumentMode.RGB, DocumentFill.TRANSPARENT ); // create a new document
	for (var i=0;i<documents.length-1;i++) {						// stack a layer for the open document into the new document page 1 on botton	
	//for (var i=documents.length-2;i>-1;i--) {						// stack a layer for the open document into the new document page 1 on top
		app.activeDocument = documents[i];							// switch active document
		var layerName = app.activeDocument.name;					// get document name
		app.activeDocument.flatten();								// Flatten remove transparency
		var idDplc = charIDToTypeID( "Dplc" );
		var desc259 = new ActionDescriptor();
		var idnull = charIDToTypeID( "null" );
        var ref24 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref24.putEnumerated( idLyr, idOrdn, idTrgt );
		desc259.putReference( idnull, ref24 );
		var idT = charIDToTypeID( "T   " );
        var ref25 = new ActionReference();
        var idDcmn = charIDToTypeID( "Dcmn" );
        ref25.putName( idDcmn, documents[documents.length-1].name );
		desc259.putReference( idT, ref25 );
		var idNm = charIDToTypeID( "Nm  " );
		desc259.putString( idNm, layerName );
		var idVrsn = charIDToTypeID( "Vrsn" );
		desc259.putInteger( idVrsn, 5 );
		executeAction( idDplc, desc259, DialogModes.NO );			// Copy Layer to document
		app.activeDocument = documents[documents.length-1];			// switch to newly created document
		layerName = layerName.substr(0,layerName.indexOf(".pdf")); 
		app.activeDocument.activeLayer.name=layerName;				// label layer with Document name
	}
	app.activeDocument = documents[documents.length-1];				// switch to newly created document
	var layers = activeDocument.layers;								// get layers
	activeDocument.activeLayer = layers[layers.length-1]			// Target Bottom Layer
	activeDocument.activeLayer.remove();							// Remove original layer
	while  (documents.length>1) {									// close all opened document except the newly created document							
		app.activeDocument = documents[0];		
		activeDocument.close(SaveOptions.DONOTSAVECHANGES);
	}
	app.togglePalettes();											// toggle user's palettes back on	
	app.runMenuItem(charIDToTypeID(("FtOn")));						// fit the document to the screen 
	app.displayDialogs = orig_display_dialogs;						// Reset display dialogs 
	app.preferences.rulerUnits = orig_ruler_units;					// reset units to original settings
}

 

JJMack
Inspiring
September 7, 2021

Don't really think this applies to the problem but thanks anyway

Brainiac
September 2, 2021

Do your PDFs contain only one page, or are they multi-page documents?

Inspiring
September 2, 2021

Single-pagers, all of em

Brainiac
September 2, 2021

 

openPDF(new File("E:/test single page.pdf"), 300, 8, true, 3302, 2071, false, false, true, 1);

function openPDF(fileObject, resolution, depth, antiAliasing, width, height, constrainProportions, suppressWarnings, reverse, pageNumber) {
    var s2t = stringIDToTypeID;

    (d = new ActionDescriptor()).putEnumerated(s2t("crop"), s2t("cropTo"), s2t("boundingBox"));
    d.putUnitDouble(s2t("resolution"), s2t("densityUnit"), resolution);
    d.putEnumerated(s2t("mode"), s2t("colorSpace"), s2t("RGBColor"));
    d.putInteger(s2t("depth"), depth);
    d.putBoolean(s2t("antiAliasing"), antiAliasing);
    d.putUnitDouble(s2t("width"), s2t("pixelsUnit"), width);
    d.putUnitDouble(s2t("height"), s2t("pixelsUnit"), height);
    d.putBoolean(s2t("constrainProportions"), constrainProportions);
    d.putBoolean(s2t("suppressWarnings"), suppressWarnings);
    d.putBoolean(s2t("reverse"), reverse);
    d.putEnumerated(s2t("selection"), s2t("pdfSelection"), s2t("page"));
    d.putInteger(s2t("pageNumber"), pageNumber);
    (d1 = new ActionDescriptor()).putObject(s2t("as"), s2t("PDFGenericFormat"), d);
    d1.putPath(s2t("target"), fileObject);
    executeAction(s2t("open"), d1, DialogModes.NO);
}

 

* many parameters are optional. For example, you can shorten the code only to passing the path (all other parameters will be received by Photoshop from your last settings during manual export)  

 

openPDF(new File("E:/test single page.pdf"));

function openPDF(fileObject) {
    var s2t = stringIDToTypeID;
    (d = new ActionDescriptor()).putObject(s2t("as"), s2t("PDFGenericFormat"), new ActionDescriptor());
    d.putPath(s2t("target"), fileObject);
    executeAction(s2t("open"), d, DialogModes.NO);
}

 

 

 

 

Inspiring
September 2, 2021

Also, using app.displayDialogs = DialogModes.NO, prevents the dialog, but the PDF is not opened/imported.