15 Replies Latest reply on Jul 5, 2018 8:04 AM by BarlaeDC

    preflight scripting...

    @Js1212 Level 1

      i have combine a few scripts (thank you to those who have posted these bits) and created kind of a custom final collect for my organization except i need it to also run a very basic preflight so missing fonts or images will be flagged. I have tried to incorporate every preflight script i have been able to find but none seem to be working.

       

      I have the script run and insert some info into the meta data, then it does a full collect and places the high res and low res PDFs into specific folders.

       

      I obviously haven't written any of this but I have managed to get this completely functioning except for the preflight

       

      here is what i have so far...How can i get it to check the status of the live preflight and give an alert/error if there are missing fonts or images?

      I did not include any of my attempts at preflight because none have worked so far...

       

       

       

      //===============                                                 metatagging                        ===============================

       

       

      //-----document title and copyright---------

      var myDocument = app.activeDocument;

      with (myDocument.metadataPreferences){

          copyrightInfoURL = "ABC company"

          copyrightNotice = "© 2018 ABC company";

          copyrightStatus = CopyrightStatus.yes;

          documentTitle = myDocument.name.split(".indd")[0];

          }

      //---------------------add document name-------------------------------

      with (myDocument.metadataPreferences){

              documentTitle = myDocument.name.split(".indd")[0];

              }

      //-----------------------images to keywords--------------------------//

      app.activeDocument.metadataPreferences.keywords =

      ["ABC company"].concat(app.activeDocument.links.everyItem().name);

      //-------------open file info dialog box---------------------

      app.menuActions.itemByID(89092).invoke()

       

       

      /

       

      //=======================               packaging-                            ===================================-

      // Package.jsx

      //

      // by Keith Gilbert

      // gilbertconsulting.com

      // blog.gilbertconsulting.com

      //

      // Revised 2018-01-15

      //

       

       

      #target indesign

       

       

      main();

       

       

      function main() {

        // Check to see whether any InDesign documents are open.

        // If no documents are open, display an error message.

        if (app.documents.length > 0) {

        var myDoc = app.activeDocument;

        ///Prompt the user for the folder

        var myTargetFolder = Folder.selectDialog("Select the folder in which to place the packaged files");

        if (myTargetFolder != null) {

        // Package the file

        myDoc.packageForPrint (

        to = myTargetFolder,

        copyingFonts = true,

        copyingLinkedGraphics = true,

        copyingProfiles = true,

        updatingGraphics = true,

        includingHiddenLayers = false,

        ignorePreflightErrors = true, // If this is set to false, and there are preflight errors, the script does nothing.

        creatingReport = false,

        includeIdml = false,

                      includePdf = false,

        pdfStyle = "",

        useDocumentHyphenationExceptionsOnly = true, // Added to DOM in CC 2018

        versionComments = "",

        forceSave = true,

        )

        }

        else {

        return;

        }

        }

        else {

        // No documents are open, so display an error message.

        alert("No InDesign documents are open. Please open a document and try again.")

        }

      }

       

      //=================                     make the PDFs-              =====================================================

       

       

      d = app.activeDocument;   

      preset1 = app.pdfExportPresets.itemByName("press spreads and crops");   

      preset2 = app.pdfExportPresets.itemByName("smallest size_spreads");       

      if (!(preset1.isValid && preset2.isValid)){   

          alert("One of the presets does not exist. Please check spelling carefully.");   

          exit();   

       

      mDocName = d.name.substr (0, d.name.lastIndexOf('.'));

      mSourcePath = d.fullName.parent.toString();

      mRootPath =mSourcePath.substr (0, mSourcePath.lastIndexOf('/'));

      mTargetPath=mRootPath.concat('/Final_Art/LowRes_PDF_Final/');

        mNameWeb= mTargetPath.concat(mDocName,'_LOW.pdf');

       

       

      mTargetPath=mRootPath.concat('/Final_Art/Print_PDF/');

      mNamePrint = mTargetPath.concat(mDocName,'.pdf');   

       

      if (!d.saved){   

          d.save;

      }    

       

      d.exportFile(ExportFormat.PDF_TYPE, new File(mNamePrint), false, preset1);   

      d.exportFile(ExportFormat.PDF_TYPE, new File(mNameWeb), false, preset2);

        • 1. Re: preflight scripting...
          BarlaeDC Adobe Community Professional

          Hi,

           

          I am not sure you need to do full preflight, could you not just run something like

           

          // get the status of links in a string, there are other status' you might need to check

          // options are

          //LinkStatus.NORMAL

          //LinkStatus.LINK_OUT_OF_DATE

          //LinkStatus.LINK_MISSING

          //LinkStatus.LINK_EMBEDDED

          //LinkStatus.LINK_INACCESSIBLE

          var statusString = inddDoc.links.everyItem().status.toString();

          if ( statusString.indexOf ("LINK_MISSING") !== -1)

          {

             alert (" Document has missing images");

               // Stop the script

          }

           

          AND

           

          // get that status of the fonts and check, you need to pick the options from below to make sure you catch what you want.

          // options are

          // FontStatus.INSTALLED

          //FontStatus.NOT_AVAILABLE

          //FontStatus.FAUXED

          //FontStatus.SUBSTITUTED

          //FontStatus.UNKNOWN

          var fontStatus = inddDoc.fonts.everyItem().status.toString();

          if  (( fontStatus.indexOf("NOT_AVAILABLE ") !== -1) || ( fontStatus.indexOF("SUBSTITUTED") !== -1 ))

          {

               alert ("Document appears to have missing fonts"):

               // stop the script

          }

           

          Hope this helps

           

          Malcolm

           

          [Edited to remove incorrect string statements in fontStatus if ]

          • 2. Re: preflight scripting...
            @Js1212 Level 1

            i so appreciate your help.....but

             

             

            I'm not sure how to insert your snippet into my script. I keep getting an error about the variable being undefined. i have spent the last couple of hours trying to figure out what i am doing wrong so i wouldn't come back and ask for more help (i hate being a leech)

             

            thanks for any further insight!!!!

             

            scott

            • 3. Re: preflight scripting...
              BarlaeDC Adobe Community Professional

              Hi,

               

              I have added the code into your script ( and cleaned up your script a wee bit, to make it easier to follow). hope this does what you want. let us know if you have any further questions.

               

              #target indesign
              
              // script wide variable
              // we need a document for just about everything
              // so declare it at the top
              var curDoc = null
              
              // as we need a document
              // and we want to check fonts and images are correct, 
              // do that first
              if (app.documents.length < 1)
              {
                  alert (" There are no active documents to work on")
                  // as we need a document, stop the script
                  exit();
              }
              else
              {
                  // we have a document
                  // but lets check that it is suitable for us to use
                  curDoc = app.activeDocument;
                  
                  // check for missing links
                  // get the status of links in a string, there are other status' you might need to check
                  // options are
                  //LinkStatus.NORMAL
                  //LinkStatus.LINK_OUT_OF_DATE
                  //LinkStatus.LINK_MISSING
                  //LinkStatus.LINK_EMBEDDED
                  //LinkStatus.LINK_INACCESSIBLE
                  var statusString = curDoc.links.everyItem().status.toString();
                  if ( statusString.indexOf ("LINK_MISSING") !== -1)
                  {
                     alert (" Document has missing images");
                      exit();
                  }
                  
                  // check for missing fonts
                  // get that status of the fonts and check, you need to pick the options from below to make sure you catch what you want.
                  // options are
                  // FontStatus.INSTALLED
                  //FontStatus.NOT_AVAILABLE
                  //FontStatus.FAUXED
                  //FontStatus.SUBSTITUTED
                  //FontStatus.UNKNOWN
                  var fontStatus = curDoc.fonts.everyItem().status.toString();
                  if  (( fontStatus.indexOf("NOT_AVAILABLE ") !== -1) || ( fontStatus.indexOf("SUBSTITUTED") !== -1 ))
                  {
                       alert ("Document appears to have missing fonts");
                      exit();
                  }
              }
              
              
              
              
              
              //=============== metatagging  ===============================
              //-----document title and copyright---------
              
              with (curDoc.metadataPreferences){
                  copyrightInfoURL = "ABC company"
                  copyrightNotice = "© 2018 ABC company";
                  copyrightStatus = CopyrightStatus.yes;
                  documentTitle = curDoc.name.split(".indd")[0];
                  }
              
              //---------------------add document name-------------------------------
              
              with (curDoc.metadataPreferences){
                      documentTitle = curDoc.name.split(".indd")[0];
                      }
              
              //-----------------------images to keywords--------------------------//
              
              curDoc.metadataPreferences.keywords =
              ["ABC company"].concat(app.activeDocument.links.everyItem().name);
              
              //-------------open file info dialog box---------------------
              
              app.menuActions.itemByID(89092).invoke()
              
              
              //=======================               packaging-                            ===================================-
              // Package.jsx
              //
              // by Keith Gilbert
              // gilbertconsulting.com
              // blog.gilbertconsulting.com
              //
              // Revised 2018-01-15
              //
              
              // Check to see whether any InDesign documents are open.
              // If no documents are open, display an error message.
              
              ///Prompt the user for the folder
              var myTargetFolder = Folder.selectDialog("Select the folder in which to place the packaged files");
              if (myTargetFolder != null) 
              {
                  // Package the file
                  curDoc.packageForPrint 
                  (
                      to = myTargetFolder,
                      copyingFonts = true,
                      copyingLinkedGraphics = true,
                      copyingProfiles = true,
                      updatingGraphics = true,
                      includingHiddenLayers = false,
                      ignorePreflightErrors = true, // If this is set to false, and there are preflight errors, the script does nothing.
                      creatingReport = false,
                      includeIdml = false,
                      includePdf = false,
                      pdfStyle = "",
                      useDocumentHyphenationExceptionsOnly = true, // Added to DOM in CC 2018
                      versionComments = "",
                      forceSave = true,
                  )
              }
              else {
                exit();
              }
              
              
              //=================  make the PDFs  =====================================================
              
              preset1 = app.pdfExportPresets.itemByName("press spreads and crops");   
              preset2 = app.pdfExportPresets.itemByName("smallest size_spreads");       
              if (!(preset1.isValid && preset2.isValid)){   
                  alert("One of the presets does not exist. Please check spelling carefully.");   
                  exit();   
              } 
              
              mDocName = curDoc.name.substr (0, curDoc.name.lastIndexOf('.'));
              mSourcePath = curDoc.fullName.parent.toString();
              mRootPath =mSourcePath.substr (0, mSourcePath.lastIndexOf('/'));
              mTargetPath=mRootPath.concat('/Final_Art/LowRes_PDF_Final/');
              mNameWeb= mTargetPath.concat(mDocName,'_LOW.pdf');
              mTargetPath=mRootPath.concat('/Final_Art/Print_PDF/');
              mNamePrint = mTargetPath.concat(mDocName,'.pdf');   
              if (!d.saved){   
                  d.save;
              }    
              
              d.exportFile(ExportFormat.PDF_TYPE, new File(mNamePrint), false, preset1);   
              d.exportFile(ExportFormat.PDF_TYPE, new File(mNameWeb), false, preset2);
              

               

              Regards

               

              Malcolm

               

              [editied : to correct forntStatus if statement]

              2 people found this helpful
              • 4. Re: preflight scripting...
                @Js1212 Level 1

                wow....thank you!!!!

                 

                I worked on and off with this thru the day.

                I fixed a reference in the "make PDF" portion that was still using my old reference to "d." so that is working.

                the meta tagging is great

                the package is working as expected

                the check for missing images is working like a champ

                but the check for missing fonts is giving me an issue. If no fonts are missing it works great but if there is a missing font it fails at the point where i am calling up the file info window line 81 above.

                 

                any more help or have i run the well dry?

                 

                scott

                • 5. Re: preflight scripting...
                  BarlaeDC Adobe Community Professional

                  Hi,

                   

                  Are you able to share from a sharing site a document that shows the problem you describe so that I can investigate?

                   

                  Regards

                   

                  Malcolm

                  • 6. Re: preflight scripting...
                    @Js1212 Level 1

                    a generic test file can be downloaded from the link below along with its associated files

                     

                    I also included the .jsx file in case something happened when i copied (or attempted to fix) it

                     

                     

                    scott

                    • 7. Re: preflight scripting...
                      BarlaeDC Adobe Community Professional

                      Hi Scott,

                       

                      I was able to run the code without any problems with your document, I did notice an error in the font checking, so you probably want to make this change

                       

                      // check for missing fonts

                      // get that status of the fonts and check, you need to pick the options from below to make sure you catch what you want.

                      // options are

                      // INSTALLED

                      //NOT_AVAILABLE

                      //FAUXED

                      //SUBSTITUTED

                      //UNKNOWN

                      var fontStatus = curDoc.fonts.everyItem().status.toString();

                      if  (( fontStatus.indexOf("NOT_AVAILABLE ") !== -1) || ( fontStatus.indexOf("SUBSTITUTED") !== -1 ))

                      {

                           alert ("Document appears to have missing fonts");

                          exit();

                      }

                       

                      but other than that it worked as expected, missing image raised error and stopped, missing fonts raised error and stopped, if everything was ok it packaged teh document as per the instructions.

                       

                      Regards

                       

                      Malcolm

                      1 person found this helpful
                      • 8. Re: preflight scripting...
                        @Js1212 Level 1

                        I'm not sure what you changed ....but that made it work as planned!!!!

                         

                        How do i mark the correct answer correctly....should i upload my "finished script" or mark the last one as correct?

                        ...and is there anything more i can do than to say thank you?

                         

                        scott

                         

                        but...

                        now i am wondering if there is a way to make this script ignore hidden layers?

                        My documents tend to  use a lot of layers to customize a flyer or a brochure by having a generic base "template" and switching a series of logo layers on and off. i don't want it to return a "missing Image error" if it is on a hidden layer (which it currently does)

                        • 9. Re: preflight scripting...
                          BarlaeDC Adobe Community Professional

                          Hi,

                           

                          I have corrected my post with the full script, so if you mark that as correct, so that anyone else searching for this will be able to find the answer.

                           

                          And of course we can add ignore layers but it does make is more complicated ( especially for the fonts check part).

                           

                          For the link   it is just a case of check the visibility of the layer where the link is placed.

                           

                          However for the fonts it is a bit harder, we could check as we currently do, and if there are no missing fonts in the document, then we are good to go, if there are missing fonts we would need to work out where the fonts where used and check if that layer was visible of each use of a missing font.

                           

                          Regards

                           

                          Malcolm

                          1 person found this helpful
                          • 10. Re: preflight scripting...
                            @Js1212 Level 1

                            i am humbled...

                             

                            i feel like you are spoon-feeding me, giving me everything but the answer and i still spend so much time trying to get it to work but I fail!!! ( i did however get overset text to flag in the preflight and an alert to pop up let the operator know the script ran successfully)

                             

                            how does the visible layer for linked objects work? I think i have tried every way that does not work!!!! can you show us one that does?

                             

                            scott

                            • 11. Re: preflight scripting...
                              BarlaeDC Adobe Community Professional

                              HI,

                               

                              the links itself does not have a layer you have to get to the object that holds that link on the document, normally an image object, so you would need code something like

                               

                              var allLinks = curDoc.links;
                              for ( var i = 0 ; i < alllinks.length; i++)
                              {
                                   if ( allLinks[i].parent.itemLayer.visible === true)
                                   {
                                        //run tests
                                   }
                              }
                              

                               

                              This should be able to be plugged in to the original code above and surround the part that checks the links.

                               

                              hope this helps

                               

                              Malcolm

                              1 person found this helpful
                              • 12. Re: preflight scripting...
                                @Js1212 Level 1

                                It still is finding links on non visible layers....what did i do wrong this time?

                                how does the second half know what is going on with var i?

                                 

                                 

                                    curDoc = app.activeDocument;

                                {

                                      var allLinks = curDoc.links;

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

                                  {

                                        if ( allLinks[i].parent.itemLayer.visible === true)

                                    {

                                                             // check for missing links  --------------------------------------------------------------------------------

                                                               // get the status of links in a string, there are other status’ you might need to check 

                                                                // options are 

                                                               //LinkStatus.NORMAL 

                                                                 //LinkStatus.LINK_OUT_OF_DATE 

                                                               //LinkStatus.LINK_MISSING 

                                                               //LinkStatus.LINK_EMBEDDED 

                                                             //LinkStatus.LINK_INACCESSIBLE 

                                           var statusString = curDoc.links.everyItem().status.toString(); 

                                           if ( statusString.indexOf (“LINK_MISSING”) !== -1) 

                                      { 

                                       alert (“ Document has missing images”); 

                                        exit(); 

                                      } 

                                    }

                                  }

                                }

                                • 13. Re: preflight scripting...
                                  BarlaeDC Adobe Community Professional

                                  HI,

                                   

                                  You can't use everyItem().status as that will get you the status of all the links so you need to change that loop to be something like.

                                   

                                  As stated in previous replies, adding in a check for layer visibility makes it more complicated.

                                   

                                  curDoc = app.activeDocument;
                                  {
                                      var allLinks = curDoc.links;
                                      for ( var i = 0 ; i < allLinks.length; i++)
                                      {
                                          if ( allLinks[i].parent.itemLayer.visible === true)
                                          {
                                              // check for missing links  --------------------------------------------------------------------------------
                                              // get the status of links in a string, there are other status’ you might need to check 
                                              // options are 
                                              //LinkStatus.NORMAL 
                                              //LinkStatus.LINK_OUT_OF_DATE 
                                              //LinkStatus.LINK_MISSING 
                                              //LinkStatus.LINK_EMBEDDED 
                                              //LinkStatus.LINK_INACCESSIBLE 
                                              // Doing this makes sure we only check the links that are visible
                                              if ( allLinks[i].status == LinkStatus.LINK_MISSING) 
                                              { 
                                                  alert (“ Document has missing images”); 
                                                  exit(); 
                                              } 
                                          }
                                      }
                                  }
                                  

                                   

                                  Hope this helps

                                   

                                  Malcolm

                                  1 person found this helpful
                                  • 14. Re: preflight scripting...
                                    @Js1212 Level 1

                                    I knew that i was missing something connecting the variable i to the rest but am not say...

                                    after a minor tweak from above (the alert has quote marks rather than inch marks) <---my fault it works like a champ.

                                     

                                    I wish there was some way to get you a small token of appreciation, you have been so kind and generous with your knowledge

                                     

                                     

                                    scott

                                    • 15. Re: preflight scripting...
                                      BarlaeDC Adobe Community Professional

                                      HI,

                                       

                                      No problem, happy to help out,

                                       

                                      Regards

                                       

                                      Malcolm