[英]Extendscript batch save PDFs
我需要一點幫助。 我想要一個腳本,將所有子文件夾中的所有AI文件轉換為PDF,並將它們放在根目錄下的單個文件夾中,並且我希望它跳過名為“ Resources”的所有文件夾。 我找到了一個腳本,該腳本主要執行我需要做的事情,並且我對其進行了進一步修改,以適應我們的確切需求。 我正在努力其中的兩個部分。 具體來說,第33和80行是我現在的問題。
#target illustrator
main();
//
function main() {
var topLevel = Folder.selectDialog( 'Select the top level folder to start converting AI files to PDFX files' );
var proofFolder = new Folder( topLevel + '/Proofs2/');
proofFolder.create();
if ( topLevel != null ) {
processDocs( recursiveFolders( topLevel, /\.ai$/i ), getPDFOptions() );
};
};
//
function processDocs( aiFiles, opts ) {
var i, baseName, doc, saveFile;
for ( i = 0; i < aiFiles.length; i++ ) {
doc = app.open( aiFiles[i] );
baseName = decodeURI( doc.name.match( /(.*)\.[^\.]+$/ )[1] );
//這是第33行// saveFile = File(proofFolder.path + baseName +'.pdf');
doc.saveAs( saveFile, opts );
doc.close( SaveOptions.DONOTSAVECHANGES );
};
};
//
function getPDFOptions() {
var pdfSaveOpts = new PDFSaveOptions();
pdfSaveOpts.acrobatLayers = true;
pdfSaveOpts.colorBars = false;
pdfSaveOpts.colorCompression = CompressionQuality.AUTOMATICJPEGHIGH;
pdfSaveOpts.compressArt = true;
pdfSaveOpts.embedICCProfile = true;
pdfSaveOpts.enablePlainText = true;
pdfSaveOpts.generateThumbnails = true;
pdfSaveOpts.optimization = true;
pdfSaveOpts.pageInformation = true;
pdfSaveOpts.preserveEditability = true;
pdfSaveOpts.pDFXStandard = PDFXStandard.PDFX1A2001;
pdfSaveOpts.viewAfterSaving = false;
return pdfSaveOpts;
};
//
function recursiveFolders( fold, exp ) {
var fileList = Array(); // Our matching files…
getFiles( fold, exp, fileList );
return fileList;
};
//
function getFiles( fold, exp, array ) {
//如果(Folder.name!== / \\ Resources $ /){
var i, temp;
temp = Folder( fold ).getFiles(); // All files and folders…
for ( i = 0; i < temp.length; i++ ) {
if ( temp[i] instanceof File && RegExp( exp ).test( temp[i].fsName ) ){
array.push( temp[i] );
};
if ( temp[i] instanceof Folder ) {
getFiles( temp[i].fsName, exp, array );
};
};
return array;
};
};
Javascript中的變量是對其定義的函數的本地變量。也就是說,如果嘗試
a();
function a()
{
var a1 = 1;
b();
}
function b()
{
alert ("var a1 = "+a1);
}
您會發現a1
在函數b
未定義 。 兩種常見的解決方案(可能還有更多)是將變量放入函數定義中:
b(a1);
..
function b (myVarArg)
{
alert ("var a1 = "+myVarArg);
}
或者-簡單但容易出錯-在main
之前的程序頂部聲明變量:
var a1;
這是一個快速簡單的解決方案。 該變量將在所有函數中“可見”,並且在任何地方分配新值都將起作用。 這是“容易出錯的”,因為具有相同名稱(在函數內部定義)的局部變量將有效地“隱藏” 原始變量。 因此,如果不小心使用,可能會導致如下所示的構造:
var a1 = 1;
a();
alert ("var a1 = "+a1);
function a()
{
var a1 = 2;
b();
alert ("var a1 = "+a1);
}
function b()
{
alert ("var a1 = "+a1);
}
幸運的是,您使用清晰的描述性變量名將為您提供幫助。
if (Folder.name !== /\Resources$/) ...
不當使用正確的Javascript語法☺
!==
不是有效的比較運算符。 請使用==
(如果相等測試)或者===
(如果非常平等測試-看?會有問題,等於運算符(== VS ===)我在JavaScript中的比較使用一段堅韌不拔的細節),以及!=
測試是否不相等。
您可以將一個字符串與另一個字符串進行比較,但不能與GREP表達式進行比較。 記號/.../
保留給GREP表達式只 ,字符串,你需要"..."
或'...'
。 雖然確實有些功能可以接受GREP和常規字符串,但此測試不能接受。
要在比較中使用GREP字符串,請使用String函數match
:
if (Folder.name.match(/\\\\Resources$/)) ...
注意雙括號(一個用於括起來的if
和一個用於match
函數)和雙反斜杠,因為反斜杠是GREP字符串中的“特殊字符”。 (這在Javascript字符串中也是很特殊的,因此無論您打算使用什么,它都可能被稱為“不正確的語法#4”。)
未經測試。 沒有這些更正,您的腳本將無法工作。 使用它們,它至少應該執行某些操作 (如果您的邏輯合理,路徑存在,輸入正確並且Illustrator常數具有正確的名稱)。
臨時地,我敢說它應該起作用。
經過一些調試才能發現真正的問題。調試策略:在可疑行之前插入alert
,顯示重要變量的值。 運行,等待結果,沖洗,重復。
首先,將array
作為函數參數傳遞似乎不是一個好主意。 我發現數組被復制到其自身上(也許只是我修修補補的結果)。 我認為更安全的方法是讓getFiles
只返回新添加的文件,並將結果連接到當前版本(即,在您調用getFiles
的例程中,在此例程中,如果它是先前版本是否實現getFiles
)。 請參閱(我認為!)上面有關修改“本地”,“全局”和/或“已通過”變量的警告。
function getMyFiles( fold, exp ) {
//This is line 80//
if (!fold.name.match (/(\\|\/)Resources$/)) {
var i, temp;
var array = [];
temp = Folder( fold ).getFiles(); // All files and folders…
for ( i = 0; i < temp.length; i++ ) {
if ( temp[i] instanceof File && RegExp( exp ).test( temp[i].fsName ) ){
// alert ('path '+fold+', adding '+temp[i]);
array.push( temp[i] );
};
if ( temp[i] instanceof Folder ) {
array = array.concat (getFiles( temp[i], exp ));
};
};
// alert ('array is '+array.length+'\n'+array.join('\n'));
return array;
};
return [];
};
您可以像以前在原始recursiveFolders
函數中一樣調用此函數,但是這次不傳遞數組而是分配給它:
function recursiveFolders( fold, exp )
{
var fileList = Array(); // Our matching files…
fileList = getFiles( fold, exp );
// alert ('Filelist is '+fileList.length+'\n'+fileList.join ('\n'));
return fileList;
};
只有當我使該部分正常工作時,根據您的注釋“ fold.match不是一個函數”,我才會遇到與您相同的錯誤。 那花了大約一分鍾的時間。 事實證明,JavaScript解析器是正確的。 最初 , fold
參數是一個Folder
,要獲取其名稱,您需要fold.name
。 但是請看一下您自己的代碼:您在遞歸調用中使用了參數temp[i].fsName
,它是一個String
! 因此,沒有name
,因此是錯誤。
首先,我使用fold.toString
(可在Folder和String上使用)將fold
直截了當地轉換為always-a-String,但是后來我改變了主意,並使用fold.name
保持一致性,並使用“ proper”參數調用getFiles
: temp[i]
代替temp[i].fsName
。 現在它似乎可以正常工作。 (自信地說。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.