簡體   English   中英

Extendscript批量保存PDF

[英]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;

        };

};

第33行:

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);
}

幸運的是,您使用清晰的描述性變量名將為您提供幫助。


80號線

if (Folder.name !== /\Resources$/) ...

不當使用正確的Javascript語法☺

  1. !==不是有效的比較運算符。 請使用== (如果相等測試)或者=== (如果非常平等測試-看?會有問題,等於運算符(== VS ===)我在JavaScript中的比較使用一段堅韌不拔的細節),以及!=測試是否不相等。

  2. 您可以將一個字符串與另一個字符串進行比較,但不能與GREP表達式進行比較。 記號/.../保留給GREP表達式 ,字符串,你需要"..."'...' 雖然確實有些功能可以接受GREP和常規字符串,但此測試不能接受。

  3. 要在比較中使用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”參數調用getFilestemp[i]代替temp[i].fsName 現在它似乎可以正常工作。 (自信地說。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM