Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

How to getFiles from subdirectories as well

New Here ,
May 29, 2013 May 29, 2013

Hello all,

I am using a modified version of tomaxxi's script as seen here (yes I know it is an old thread): http://forums.adobe.com/message/3168013

I know he has a new script, but neither of them can do all indesign files in subfolders as well as the parent folder.  I am wondering how I can adjust the following script so that it will pull all .indd files in subfolders of the selected folder.

Additionally, if there is another plugin that does the same thing that would work and has this functionality, I am all ears.

Array.prototype.unique = function (){var i, a = {},r = [],n = this.length;for( i=0 ; i<n ; ++i ) a[this]=1;for( i in a ) r.push(i);return r;}

if(app.documents.length == 0){

    fontReporter();

}else{

    alert("Please close all documents!","Font Report Creator");

}

function fontReporter(){

app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;

// write report to file

var writeReport = function(myData, myFile){myFile.open ('w'); myFile.encoding = 'UTF-8'; for(var d = 0; d < myData.length; d++)myFile.write (myData); myFile.close (); }

// collect info from document

var createFontReport = function(){

    var myDoc = app.documents[0];

    var myDocFonts = myDoc.fonts;

    var myDocName = myDoc.name;

    myFonts.push("//// Font report for file: [ " + myDocName + " ] ////\r\r");

    for(var f = 0; f < myDocFonts.length; f++){var myString = myDocFonts.fontFamily + "\t" + myDocFonts.fontStyleName + "\t" + myDocFonts.location + "\r"; myFonts.push(myString); myFontsAll.push(myString);}

    //myFonts.sort();

    myFonts.push("\r//// Fonts used count: " + f + " ////\r\r\r");

}

    var myFonts = [];

    var myFontsAll = [];

    // open/report/close

    var myFolder = Folder.selectDialog("Please select a folder containing the InDesign files.");

    if(myFolder == null){alert("No folder selected!","Font Report Creator"); exit();}

    var myFolderContents = myFolder.getFiles("*.indd");

    if(myFolderContents.length == 0){alert("No InDesign files in folder!","Font Report Creator"); exit();}

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

        app.open(File(myFolderContents), false);

        if(app.documents[0].saved == true)createFontReport();

        app.documents[0].close(SaveOptions.no);

    }

    var myReportFile = File(myFolder + "/" + "Separate document report - Font Report.txt");

    writeReport(myFonts, myReportFile);

    // complete report

    myFontsAll = myFontsAll.unique();

    myFontsAll.sort();

    myFontsAll.unshift("//// Font report for folder: [ " + myFolder + " ]////\r\r");

    myFontsAll.push("\r//// Fonts used count: " + (myFontsAll.length - 1) + " ////");

    myReportFile = File(myFolder + "/All [INDD] Documents Font Report.txt");

    writeReport(myFontsAll, myReportFile);

app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;

alert("Font reports created!","Font Report Creator");

}

TOPICS
Scripting
1.8K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
May 29, 2013 May 29, 2013

If the code you posted works correctly for the documents in the selected folder, then the code below should work correctly for all documents in the selected folder and subfolders.

Array.prototype.unique = function unique() {

  var i, a = {}, r = [], n = this.length;

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

    a[this] = 1;

  }

  for (i in a) {

    r.push(i);

  }

  return r;

}

if (app.documents.length == 0) {

  fontReporter();

} else {

  alert("Please close all documents!", "Font Report Creator");

}

function fontReporter() {

  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;

  // write report to file

  var writeReport = function writeReport(myData, myFile) {

    myFile.open('w');

    myFile.encoding = 'UTF-8';

    for (var d = 0; d < myData.length; d++) {

      myFile.write(myData);

    }

    myFile.close();

  }

  // collect info from document

  var createFontReport = function createFontReport(myDoc) {

    var myDocFonts = myDoc.fonts;

    var myDocName = myDoc.name;

    myFonts.push("//// Font report for file: [ " + myDocName + " ] ////\r\r");

    for(var f = 0; f < myDocFonts.length; f++) {

      var myString = myDocFonts.fontFamily + "\t" + myDocFonts.fontStyleName + "\t" + myDocFonts.location + "\r"; myFonts.push(myString);

      myFontsAll.push(myString);

    }

    //myFonts.sort();

    myFonts.push("\r//// Fonts used count: " + f + " ////\r\r\r");

  }

  /**

   * Calls the callback function for each descendant file of the specified folder.

   * The callback should accept a single argument that is a File object.

   *

   * @param {Folder} folder The folder to search in.

   * @param {Function} callback The function to call for each file.

   */

  var forEachDescendantFile = function forEachDescendantFile(folder, callback) {

    var aChildren = folder.getFiles();

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

      var child = aChildren;

      if (child instanceof File) {

        callback(child);

      }

      else if (child instanceof Folder) {

        this.forEachDescendantFile(child, callback);

      }

      else {

        throw new Error("The object at \"" + child.fullName + "\" is a child of a folder and yet is not a file or folder.");

      }

    }

  }

  /**

   * Returns true if the name of the given file ends in the given extension. Case insensitive.

   *

   * @param {File} iFile

   * @param {String} sExtension The extension to match, not including the dot. Case insensitive.

   * @return {boolean}

   */

  var matchExtension = function matchExtension(iFile, sExtension) {

    sExtension = "." + sExtension.toLowerCase();

    var displayName = iFile.displayName.toLowerCase();

    if (displayName.length < sExtension.length) {

      return false;

    }

    return displayName.slice(-sExtension.length) === sExtension;

  }

  var openIfDocument = function openIfDocument(oFile) {

    if (matchExtension(oFile, "indd")) {

      var document = app.open(oFile, false);

      try {

        if (document.saved == true) {

          createFontReport(document);

        }

      }

      finally {

        document.close(SaveOptions.no);

      }

    }

  }

  var myFonts = [];

  var myFontsAll = [];

  // open/report/close

  var myFolder = Folder.selectDialog("Please select a folder containing the InDesign files.");

  if (myFolder == null) {

    alert("No folder selected!", "Font Report Creator");

    exit();

  }

  forEachDescendantFile(myFolder, openIfDocument);

  var myReportFile = File(myFolder + "/" + "Separate document report - Font Report.txt");

  writeReport(myFonts, myReportFile);

  // complete report

  myFontsAll = myFontsAll.unique();

  myFontsAll.sort();

  myFontsAll.unshift("//// Font report for folder: [ " + myFolder + " ]////\r\r");

  myFontsAll.push("\r//// Fonts used count: " + (myFontsAll.length - 1) + " ////");

  myReportFile = File(myFolder + "/All [INDD] Documents Font Report.txt");

  writeReport(myFontsAll, myReportFile);

  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;

  alert("Font reports created!", "Font Report Creator");

}

The code you posted calls createFontReport() for each document in the selected folder. I replaced that with forEachDescendantFile(myFolder, openIfDocument);, which should call  createFontReport() for each decendant document in the selected folder.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
May 30, 2013 May 30, 2013

Thanks for the quick reply. I get the following error:

Error Number: 24

Error String: this.forEachDescendantFile is not a function

Engine: main

Line: 62

Source: this.forEachDescendantFile(child,callback);

I am trying to figure it out myself, but any suggestions would be great!

Thanks.

dln385 <mailto:forums_noreply@adobe.com>

May 29, 2013 9:43 PM

>

Re: How to getFiles from subdirectories as well

created by dln385 <http://forums.adobe.com/people/dln385> in /InDesign

Scripting/ - View the full discussion

<http://forums.adobe.com/message/5364012#5364012

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
May 30, 2013 May 30, 2013

Oops, forgot to change that when I copy-pasted. The line this.forEachDescendantFile(child, callback); shouldn't have "this". It should be forEachDescendantFile(child, callback);

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
May 30, 2013 May 30, 2013

Brilliant! Thanks!

This time it ran but the reports it created were blank so it must not

have actually pulled the files, strange. Not sure how to pinpoint the

error from here...

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
Jun 03, 2013 Jun 03, 2013

You can try this script.

Thanks,

Shonky

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 03, 2013 Jun 03, 2013

Thanks Shonky!  This is awesome.  However, seems to have one problem:  If I do not have one of the required fonts, it fails with an error.  One of the whole reasons I am trying to run this kind of report is to find missing fonts/generate a list of missing fonts over a range of multiple documents.

Is there anyway to modify this script to print an error, indicating the missing fonts, rather than just failing?

Thanks!!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
Jun 05, 2013 Jun 05, 2013
LATEST

I have tried to run on different type of Indesign files with missing fonts but I have not got any error with this script. Can you please share some screenshot of error or InDesign file which resulting error. I'll fix it quickly and provide you updated script.

Thanks,

Shonky

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines